On Sun, Jan 06, 2019 at 11:23:02AM +0200, Gal Pressman wrote: > Drivers that do not provide kernel verbs support should not be used by > ib kernel clients and fail. > In case a device does not implement all mandatory verbs for kverbs usage > mark it as a non kverbs provider and prevent its usage for all clients > except for uverbs. > > The device is marked as a non kverbs provider using the > 'kverbs_provider' flag which should only be set by the core code. > The clients can choose whether kverbs are requested for it usage using > the 'no_kverbs_req' flag which is currently set for uverbs only. > > This patch allows drivers to remove mandatory verbs stubs and simply set > the callback to NULL. The IB device will be registered as a non-kverbs > provider. > > Signed-off-by: Gal Pressman <galpress@xxxxxxxxxx> > drivers/infiniband/core/device.c | 12 ++++++++---- > drivers/infiniband/core/uverbs_main.c | 1 + > include/rdma/ib_verbs.h | 5 +++++ > 3 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c > index 47ab34ee1a9d..6c1f71007ec4 100644 > +++ b/drivers/infiniband/core/device.c > @@ -121,13 +121,15 @@ static int ib_device_check_mandatory(struct ib_device *device) > }; > int i; > > + device->kverbs_provider = true; > for (i = 0; i < ARRAY_SIZE(mandatory_table); ++i) { > if (!*(void **) ((void *) &device->ops + > mandatory_table[i].offset)) { > dev_warn(&device->dev, > - "Device is missing mandatory function %s\n", > + "Device is missing mandatory function %s, disabling kverbs support\n", > mandatory_table[i].name); Why not get rid of the message? > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h > index a3ceed3a040a..6ac5b7c3dddc 100644 > +++ b/include/rdma/ib_verbs.h > @@ -2561,6 +2561,8 @@ struct ib_device { > __be64 node_guid; > u32 local_dma_lkey; > u16 is_switch:1; > + /* Indicates kernel verbs support, should not be used in drivers */ > + u8 kverbs_provider:1; > u8 node_type; > u8 phys_port_cnt; > struct ib_device_attr attrs; > @@ -2615,6 +2617,9 @@ struct ib_client { > const struct sockaddr *addr, > void *client_data); > struct list_head list; > + > + /* kverbs are not required by the device */ 'by the client' Jason