On Mon, Sep 09, 2019 at 08:53:57AM +0000, Jason Gunthorpe wrote: > 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 It makes sense. Thanks > > rdma_nl_put_odp_stats(...) > > Jason