--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM mm_mt
+
+#if !defined(_TRACE_MM_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_MM_H
+
+
+#include <linux/tracepoint.h>
+
+struct ma_state;
+struct maple_subree_state;
+struct maple_big_node;
+
+TRACE_EVENT(mas_split,
+
+ TP_PROTO(struct ma_state *mas),
+
+ TP_ARGS(mas),
+
+ TP_STRUCT__entry(
+ __field(struct ma_state *, mas)
+ __field(unsigned long, index)
+ __field(unsigned long, last)
+ ),
+
+ TP_fast_assign(
+ __entry->mas = mas;
+ __entry->index = mas->index;
+ __entry->last = mas->last;
+ ),
+
+ TP_printk("mas_split:\t%lu-%lu",
+ (unsigned long) __entry->index,
+ (unsigned long) __entry->last
+ )
+);
+
+TRACE_EVENT(mas_spanning_store,
+
+ TP_PROTO(struct ma_state *mas, void *entry),
+
+ TP_ARGS(mas, entry),
+
+ TP_STRUCT__entry(
+ __field(struct ma_state *, mas)
+ __field(unsigned long, index)
+ __field(unsigned long, last)
+ ),
+
+ TP_fast_assign(
+ __entry->mas = mas;
+ __entry->index = mas->index;
+ __entry->last = mas->last;
+ ),
+
+ TP_printk("mas_spanning_store:\t%lu-%lu",
+ (unsigned long) __entry->index,
+ (unsigned long) __entry->last
+ )
+);
+
+TRACE_EVENT(mas_rebalance,
+
+ TP_PROTO(struct ma_state *mas, struct maple_big_node *b_node),
+
+ TP_ARGS(mas, entry),
+
+ TP_STRUCT__entry(
+ __field(struct ma_state *, mas)
+ __field(unsigned long, index)
+ __field(unsigned long, last)
+ ),
+
+ TP_fast_assign(
+ __entry->mas = mas;
+ __entry->index = mas->index;
+ __entry->last = mas->last;
+ ),
+
+ TP_printk("mas_rebalance:\t%lu-%lu",
+ (unsigned long) __entry->index,
+ (unsigned long) __entry->last
+ )
+);
+
+TRACE_EVENT(mas_spanning_rebalance,
+
+ TP_PROTO(struct ma_state *mas,
+ struct maple_subtree_state *mast,
+ void *entry),
+
+ TP_ARGS(mas, entry),
+
+ TP_STRUCT__entry(
+ __field(struct ma_state *, mas)
+ __field(unsigned long, index)
+ __field(unsigned long, last)
+ ),
+
+ TP_fast_assign(
+ __entry->mas = mas;
+ __entry->index = mas->index;
+ __entry->last = mas->last;
+ ),
+
+ TP_printk("mas_spanning_rebalance:\t%lu-%lu",
+ (unsigned long) __entry->index,
+ (unsigned long) __entry->last
+ )
+);
+
+
+#endif /* _TRACE_MM_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
#include <asm/barrier.h>
//#include <linux/mm.h> // for task_size
+#define CREATE_TRACE_POINTS
+#include <trace/events/maple_tree.h>
+
#define MA_ROOT_PARENT 1
#define ma_parent_ptr(x) ((struct maple_pnode *)(x))
#define ma_mnode_ptr(x) ((struct maple_node *)(x))
next[n++].node = MAS_NONE;
for (i = 0; i < 3; i++) { // descend.
+ mas_set_slot(&next[i], 0);
mas_dup_state(&list[i], &next[i]);
- mas_set_slot(&list[i], 0);
}
}
}
struct ma_topiary *free,
struct ma_topiary *destroy)
{
- /* Before replacing the tree items, be sure the old data is marked dead
- * across all CPUs
- */
+ /* All nodes must see old data as dead prior to replacing that data. */
smp_wmb();
// Insert the new data in the tree
MA_STATE(l_mas, mas->tree, mas->index, mas->last);
MA_STATE(r_mas, mas->tree, mas->index, mas->last);
+ trace_mas_rebalance(mas, b_node);
+
mas_node_cnt(mas, 1 + empty_cnt * 2);
if (mas_is_err(mas))
return 0;
int height = 0;
unsigned char mid_split;
+ trace_mas_split(mas);
MA_STATE(l_mas, mas->tree, mas->index, mas->last);
MA_STATE(r_mas, mas->tree, mas->index, mas->last);
MA_STATE(prev_l_mas, mas->tree, mas->index, mas->last);
struct maple_subtree_state mast;
int node_cnt = 0;
+ trace_mas_spanning_store(mas, entry);
// Holds new left and right sub-tree
MA_STATE(l_mas, mas->tree, mas->index, mas->index);
MA_STATE(r_mas, mas->tree, mas->index, mas->index);
{
maple_node_cache = kmem_cache_create("maple_node",
sizeof(struct maple_node), sizeof(struct maple_node),
- SLAB_PANIC | SLAB_RECLAIM_ACCOUNT, NULL);
+ SLAB_PANIC, NULL);
}
void mtree_init(struct maple_tree *mt, unsigned int ma_flags)
{