Commit e236e2ea authored by Brendan Cunningham's avatar Brendan Cunningham Committed by Jason Gunthorpe

IB/hfi1: Add mmu_rb_node refcount to hfi1_mmu_rb_template tracepoints

Add kref_read() of mmu_rb_node.refcount in hfi1_mmu_rb_template-type
tracepoint output.

Change hfi1_mmu_rb_template tracepoint to take a struct mmu_rb_node* and
record the values it needs from that. This makes the trace_hfi1_mmu*()
calls shorter and easier to read.

Add hfi1_mmu_release_node() tracepoint before all
mmu_rb_node->handler->ops->remove() calls.

Make hfi1_mmu_rb_search() tracepoint its own tracepoint type separate
from hfi1_mmu_rb_template since hfi1_mmu_rb_search() does not take a
struct mmu_rb_node*.

Link: https://lore.kernel.org/r/168451525987.3702129.12824880387615916700.stgit@awfm-02.cornelisnetworks.comReviewed-by: default avatarDean Luick <dean.luick@cornelisnetworks.com>
Signed-off-by: default avatarBrendan Cunningham <bcunningham@cornelisnetworks.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent c9358de1
...@@ -124,7 +124,7 @@ int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler, ...@@ -124,7 +124,7 @@ int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler,
unsigned long flags; unsigned long flags;
int ret = 0; int ret = 0;
trace_hfi1_mmu_rb_insert(mnode->addr, mnode->len); trace_hfi1_mmu_rb_insert(mnode);
if (current->mm != handler->mn.mm) if (current->mm != handler->mn.mm)
return -EPERM; return -EPERM;
...@@ -189,6 +189,7 @@ static void release_immediate(struct kref *refcount) ...@@ -189,6 +189,7 @@ static void release_immediate(struct kref *refcount)
{ {
struct mmu_rb_node *mnode = struct mmu_rb_node *mnode =
container_of(refcount, struct mmu_rb_node, refcount); container_of(refcount, struct mmu_rb_node, refcount);
trace_hfi1_mmu_release_node(mnode);
mnode->handler->ops->remove(mnode->handler->ops_arg, mnode); mnode->handler->ops->remove(mnode->handler->ops_arg, mnode);
} }
...@@ -252,6 +253,7 @@ void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg) ...@@ -252,6 +253,7 @@ void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg)
spin_unlock_irqrestore(&handler->lock, flags); spin_unlock_irqrestore(&handler->lock, flags);
list_for_each_entry_safe(rbnode, ptr, &del_list, list) { list_for_each_entry_safe(rbnode, ptr, &del_list, list) {
trace_hfi1_mmu_rb_evict(rbnode);
kref_put(&rbnode->refcount, release_immediate); kref_put(&rbnode->refcount, release_immediate);
} }
} }
...@@ -271,7 +273,7 @@ static int mmu_notifier_range_start(struct mmu_notifier *mn, ...@@ -271,7 +273,7 @@ static int mmu_notifier_range_start(struct mmu_notifier *mn,
/* Guard against node removal. */ /* Guard against node removal. */
ptr = __mmu_int_rb_iter_next(node, range->start, ptr = __mmu_int_rb_iter_next(node, range->start,
range->end - 1); range->end - 1);
trace_hfi1_mmu_mem_invalidate(node->addr, node->len); trace_hfi1_mmu_mem_invalidate(node);
/* Remove from rb tree and lru_list. */ /* Remove from rb tree and lru_list. */
__mmu_int_rb_remove(node, root); __mmu_int_rb_remove(node, root);
list_del_init(&node->list); list_del_init(&node->list);
...@@ -304,6 +306,7 @@ static void handle_remove(struct work_struct *work) ...@@ -304,6 +306,7 @@ static void handle_remove(struct work_struct *work)
while (!list_empty(&del_list)) { while (!list_empty(&del_list)) {
node = list_first_entry(&del_list, struct mmu_rb_node, list); node = list_first_entry(&del_list, struct mmu_rb_node, list);
list_del(&node->list); list_del(&node->list);
trace_hfi1_mmu_release_node(node);
handler->ops->remove(handler->ops_arg, node); handler->ops->remove(handler->ops_arg, node);
} }
} }
...@@ -15,31 +15,53 @@ ...@@ -15,31 +15,53 @@
#define TRACE_SYSTEM hfi1_mmu #define TRACE_SYSTEM hfi1_mmu
DECLARE_EVENT_CLASS(hfi1_mmu_rb_template, DECLARE_EVENT_CLASS(hfi1_mmu_rb_template,
TP_PROTO(unsigned long addr, unsigned long len), TP_PROTO(struct mmu_rb_node *node),
TP_ARGS(addr, len), TP_ARGS(node),
TP_STRUCT__entry(__field(unsigned long, addr) TP_STRUCT__entry(__field(unsigned long, addr)
__field(unsigned long, len) __field(unsigned long, len)
__field(unsigned int, refcount)
), ),
TP_fast_assign(__entry->addr = addr; TP_fast_assign(__entry->addr = node->addr;
__entry->len = len; __entry->len = node->len;
__entry->refcount = kref_read(&node->refcount);
), ),
TP_printk("MMU node addr 0x%lx, len %lu", TP_printk("MMU node addr 0x%lx, len %lu, refcount %u",
__entry->addr, __entry->addr,
__entry->len __entry->len,
__entry->refcount
) )
); );
DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_rb_insert, DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_rb_insert,
TP_PROTO(unsigned long addr, unsigned long len), TP_PROTO(struct mmu_rb_node *node),
TP_ARGS(addr, len)); TP_ARGS(node));
DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_rb_search, TRACE_EVENT(hfi1_mmu_rb_search,
TP_PROTO(unsigned long addr, unsigned long len), TP_PROTO(unsigned long addr, unsigned long len),
TP_ARGS(addr, len)); TP_ARGS(addr, len),
TP_STRUCT__entry(__field(unsigned long, addr)
__field(unsigned long, len)
),
TP_fast_assign(__entry->addr = addr;
__entry->len = len;
),
TP_printk("MMU node addr 0x%lx, len %lu",
__entry->addr,
__entry->len
)
);
DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_mem_invalidate, DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_mem_invalidate,
TP_PROTO(unsigned long addr, unsigned long len), TP_PROTO(struct mmu_rb_node *node),
TP_ARGS(addr, len)); TP_ARGS(node));
DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_rb_evict,
TP_PROTO(struct mmu_rb_node *node),
TP_ARGS(node));
DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_release_node,
TP_PROTO(struct mmu_rb_node *node),
TP_ARGS(node));
#endif /* __HFI1_TRACE_RC_H */ #endif /* __HFI1_TRACE_RC_H */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment