On 06-Jan-19 23:39, Jason Gunthorpe wrote: > 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? Will do. > >> 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' ACK.