On Fri, Aug 30, 2019 at 11:16:12AM +0300, Leon Romanovsky wrote: > +static int fill_res_mr_entry(struct sk_buff *msg, > + struct rdma_restrack_entry *res) > +{ > + struct ib_mr *ibmr = container_of(res, struct ib_mr, res); > + struct mlx5_ib_mr *mr = to_mmr(ibmr); > + struct nlattr *table_attr; > + > + if (!is_odp_mr(mr)) > + return 0; > + > + table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); > + if (!table_attr) > + goto err; > + > + if (to_ib_umem_odp(mr->umem)->is_implicit_odp) { > + if (rdma_nl_put_driver_string(msg, "odp", "implicit")) > + goto err; > + } else { > + if (rdma_nl_put_driver_string(msg, "odp", "explicit")) > + goto err; > + } > + > + nla_nest_end(msg, table_attr); > + return 0; > + > +err: > + nla_nest_cancel(msg, table_attr); > + return -EMSGSIZE; > +} If we are having a custom fill function why not fill the ODP stats here instead of adding that callback and memcopies/etc rdma_nl_put_odp_stats(...) Jason