On Fri, Aug 30, 2019 at 11:16:09AM +0300, Leon Romanovsky wrote: > From: Erez Alfasi <ereza@xxxxxxxxxxxx> > > Introduce ODP diagnostic counters and count the following > per MR within IB/mlx5 driver: > 1) Page faults: > Total number of faulted pages. > 2) Page invalidations: > Total number of pages invalidated by the OS during all > invalidation events. The translations can be no longer > valid due to either non-present pages or mapping changes. > 3) Prefetched pages: > When prefetching a page, page fault is generated > in order to bring the page to the main memory. > The prefetched pages counter will be updated > during a page fault flow only if it was derived > from prefetching operation. > > Signed-off-by: Erez Alfasi <ereza@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > drivers/infiniband/hw/mlx5/odp.c | 18 ++++++++++++++++++ > include/rdma/ib_umem_odp.h | 14 ++++++++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c > index 905936423a03..b7c8a49ac753 100644 > +++ b/drivers/infiniband/hw/mlx5/odp.c > @@ -287,6 +287,10 @@ void mlx5_ib_invalidate_range(struct ib_umem_odp *umem_odp, unsigned long start, > > ib_umem_odp_unmap_dma_pages(umem_odp, start, end); > > + /* Count page invalidations */ > + ib_update_odp_stats(umem_odp, invalidations, > + ib_umem_odp_num_pages(umem_odp)); This doesn't seem right, it should only count the number of pages that were actually removed from the mapping > diff --git a/include/rdma/ib_umem_odp.h b/include/rdma/ib_umem_odp.h > index b37c674b7fe6..3359e34516da 100644 > +++ b/include/rdma/ib_umem_odp.h > @@ -37,6 +37,12 @@ > #include <rdma/ib_verbs.h> > #include <linux/interval_tree.h> > > +struct ib_odp_counters { > + atomic64_t faults; > + atomic64_t invalidations; > + atomic64_t prefetched; > +}; > + > struct ib_umem_odp { > struct ib_umem umem; > struct ib_ucontext_per_mm *per_mm; > @@ -62,6 +68,11 @@ struct ib_umem_odp { > struct mutex umem_mutex; > void *private; /* for the HW driver to use. */ > > + /* > + * ODP diagnostic counters. > + */ > + struct ib_odp_counters odp_stats; This really belongs in the MR not the umem > int notifiers_seq; > int notifiers_count; > int npages; > @@ -106,6 +117,9 @@ static inline size_t ib_umem_odp_num_pages(struct ib_umem_odp *umem_odp) > umem_odp->page_shift; > } > > +#define ib_update_odp_stats(umem_odp, counter_name, value) \ > + atomic64_add(value, &(umem_odp->odp_stats.counter_name)) Missing brackets in a macro Jason