On Sat, Feb 23, 2019 at 11:26:15AM +0200, Leon Romanovsky wrote: > On Thu, Feb 21, 2019 at 08:19:03AM -0800, Steve Wise wrote: > > This function sends the constructed netlink message and then > > receives the response, displaying any error text. > > > > Change 'rdma dev set' to use it. > > > > Signed-off-by: Steve Wise > > --- > > rdma/dev.c | 2 +- > > rdma/rdma.h | 1 + > > rdma/utils.c | 21 +++++++++++++++++++++ > > 3 files changed, 23 insertions(+), 1 deletion(-) > > > > diff --git a/rdma/dev.c b/rdma/dev.c > > index 60ff4b31e320..d2949c378f08 100644 > > --- a/rdma/dev.c > > +++ b/rdma/dev.c > > @@ -273,7 +273,7 @@ static int dev_set_name(struct rd *rd) > > mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); > > mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_DEV_NAME, rd_argv(rd)); > > > > - return rd_send_msg(rd); > > + return rd_sendrecv_msg(rd, seq); > > } > > > > static int dev_one_set(struct rd *rd) > > diff --git a/rdma/rdma.h b/rdma/rdma.h > > index 547bb5749a39..20be2f12c4f8 100644 > > --- a/rdma/rdma.h > > +++ b/rdma/rdma.h > > @@ -115,6 +115,7 @@ bool rd_check_is_key_exist(struct rd *rd, const char *key); > > */ > > int rd_send_msg(struct rd *rd); > > int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, uint32_t seq); > > +int rd_sendrecv_msg(struct rd *rd, unsigned int seq); > > void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags); > > int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data); > > int rd_attr_cb(const struct nlattr *attr, void *data); > > diff --git a/rdma/utils.c b/rdma/utils.c > > index 069d44fece10..a6f2826c9605 100644 > > --- a/rdma/utils.c > > +++ b/rdma/utils.c > > @@ -664,6 +664,27 @@ int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, unsigned int seq) > > return ret; > > } > > > > +static int null_cb(const struct nlmsghdr *nlh, void *data) > > +{ > > + return MNL_CB_OK; > > +} > > + > > +int rd_sendrecv_msg(struct rd *rd, unsigned int seq) > > +{ > > + int ret; > > + > > + ret = rd_send_msg(rd); > > + if (ret) { > > + perror(NULL); > > This is more or less already done in rd_send_msg() and that function > prints something in case of execution error. So the missing piece > is to update rd_recv_msg(), so all places will "magically" print errors > and not only dev_set_name(). > > > + goto out; > > + } > > + ret = rd_recv_msg(rd, null_cb, rd, seq); Will this "null_cb" work for all send/recv flows or only in flows where response can be error only? Will we need this recv_msg if we implement extack support? > > + if (ret) > > + perror(NULL); > > +out: > > + return ret; > > +} > > + > > static struct dev_map *_dev_map_lookup(struct rd *rd, const char *dev_name) > > { > > struct dev_map *dev_map; > > -- > > 1.8.3.1 > >