On Wed, Jul 21, 2021 at 07:48:48AM +0100, Christoph Hellwig wrote: > > +struct ib_qp *ib_create_qp_user(struct ib_device *dev, struct ib_pd *pd, > > + struct ib_qp_init_attr *attr, > > + struct ib_udata *udata, > > + struct ib_uqp_object *uobj, const char *caller); > > +static inline struct ib_qp *ib_create_qp_uverbs(struct ib_device *dev, > > + struct ib_pd *pd, > > + struct ib_qp_init_attr *attr, > > + struct ib_udata *udata, > > + struct ib_uqp_object *uobj) > > +{ > > + if (attr->qp_type == IB_QPT_XRC_TGT) > > + return ib_create_qp_user(dev, pd, attr, NULL, uobj, > > + KBUILD_MODNAME); > > + > > + return ib_create_qp_user(dev, pd, attr, udata, uobj, NULL); > > Why not always pass along the udata and caller and just not use them > in the low-level code? You will need to add some sort of "if qp tpye" for ib_create_qp_uverbs() callers, because they always provide udata != NULL. After this series, the callers look like this: 1438 qp = ib_create_qp_uverbs(device, pd, &attr, &attrs->driver_udata, obj); ^^^^^^^^^ not NULL So instead of bothering callers, I implemented it here with one "if". Thanks