RDMA: Split kernel-only global device caps from uverbs device caps
authorJason Gunthorpe <jgg@nvidia.com>
Mon, 4 Apr 2022 15:26:42 +0000 (12:26 -0300)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 6 Apr 2022 18:02:13 +0000 (15:02 -0300)
Split out flags from ib_device::device_cap_flags that are only used
internally to the kernel into kernel_cap_flags that is not part of the
uapi. This limits the device_cap_flags to being the same bitmap that will
be copied to userspace.

This cleanly splits out the uverbs flags from the kernel flags to avoid
confusion in the flags bitmap.

Add some short comments describing which each of the kernel flags is
connected to. Remove unused kernel flags.

Link: https://lore.kernel.org/r/0-v2-22c19e565eef+139a-kern_caps_jgg@nvidia.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
33 files changed:
drivers/infiniband/core/nldev.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/irdma/hw.c
drivers/infiniband/hw/irdma/main.h
drivers/infiniband/hw/irdma/verbs.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
drivers/infiniband/sw/rxe/rxe.c
drivers/infiniband/sw/rxe/rxe_param.h
drivers/infiniband/sw/siw/siw_verbs.c
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_verbs.c
drivers/infiniband/ulp/iser/iscsi_iser.c
drivers/infiniband/ulp/iser/iser_verbs.c
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/nvme/host/rdma.c
drivers/nvme/target/rdma.c
fs/cifs/smbdirect.c
include/rdma/ib_verbs.h
include/rdma/opa_vnic.h
include/uapi/rdma/ib_user_verbs.h
net/rds/ib.c
net/sunrpc/xprtrdma/frwr_ops.c

index ca24ce34da76612d4e7fd2297072711cfcf24ef0..b92358f606d007dc3e53abdee5c7e3cba739ea71 100644 (file)
@@ -1739,7 +1739,7 @@ static int nldev_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (!device)
                return -EINVAL;
 
-       if (!(device->attrs.device_cap_flags & IB_DEVICE_ALLOW_USER_UNREG)) {
+       if (!(device->attrs.kernel_cap_flags & IBK_ALLOW_USER_UNREG)) {
                ib_device_put(device);
                return -EINVAL;
        }
index a1978a6f8e0c2887d01c44c3f4578942d69ed077..046376bd68e27df243ffcb535bc0073e37cc4e97 100644 (file)
@@ -337,8 +337,7 @@ static void copy_query_dev_fields(struct ib_ucontext *ucontext,
        resp->hw_ver            = attr->hw_ver;
        resp->max_qp            = attr->max_qp;
        resp->max_qp_wr         = attr->max_qp_wr;
-       resp->device_cap_flags  = lower_32_bits(attr->device_cap_flags &
-               IB_UVERBS_DEVICE_CAP_FLAGS_MASK);
+       resp->device_cap_flags  = lower_32_bits(attr->device_cap_flags);
        resp->max_sge           = min(attr->max_send_sge, attr->max_recv_sge);
        resp->max_sge_rd        = attr->max_sge_rd;
        resp->max_cq            = attr->max_cq;
@@ -3619,8 +3618,7 @@ static int ib_uverbs_ex_query_device(struct uverbs_attr_bundle *attrs)
 
        resp.timestamp_mask = attr.timestamp_mask;
        resp.hca_core_clock = attr.hca_core_clock;
-       resp.device_cap_flags_ex = attr.device_cap_flags &
-               IB_UVERBS_DEVICE_CAP_FLAGS_MASK;
+       resp.device_cap_flags_ex = attr.device_cap_flags;
        resp.rss_caps.supported_qpts = attr.rss_caps.supported_qpts;
        resp.rss_caps.max_rwq_indirection_tables =
                attr.rss_caps.max_rwq_indirection_tables;
index a9819c40a140676090851d4f7c82a17baac0dd05..e54b3f1b730e00515050a400c181dd20a79e2483 100644 (file)
@@ -281,7 +281,7 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags,
        }
        rdma_restrack_add(&pd->res);
 
-       if (device->attrs.device_cap_flags & IB_DEVICE_LOCAL_DMA_LKEY)
+       if (device->attrs.kernel_cap_flags & IBK_LOCAL_DMA_LKEY)
                pd->local_dma_lkey = device->local_dma_lkey;
        else
                mr_access_flags |= IB_ACCESS_LOCAL_WRITE;
@@ -308,7 +308,7 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags,
 
                pd->__internal_mr = mr;
 
-               if (!(device->attrs.device_cap_flags & IB_DEVICE_LOCAL_DMA_LKEY))
+               if (!(device->attrs.kernel_cap_flags & IBK_LOCAL_DMA_LKEY))
                        pd->local_dma_lkey = pd->__internal_mr->lkey;
 
                if (flags & IB_PD_UNSAFE_GLOBAL_RKEY)
@@ -2131,8 +2131,8 @@ struct ib_mr *ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        struct ib_mr *mr;
 
        if (access_flags & IB_ACCESS_ON_DEMAND) {
-               if (!(pd->device->attrs.device_cap_flags &
-                     IB_DEVICE_ON_DEMAND_PAGING)) {
+               if (!(pd->device->attrs.kernel_cap_flags &
+                     IBK_ON_DEMAND_PAGING)) {
                        pr_debug("ODP support not available\n");
                        return ERR_PTR(-EINVAL);
                }
index 3224f18a66e57582250e2e5d1b8ebe653e14a985..989edc7896338150f8374f5e94c11c436d31cff5 100644 (file)
@@ -146,13 +146,13 @@ int bnxt_re_query_device(struct ib_device *ibdev,
                                    | IB_DEVICE_RC_RNR_NAK_GEN
                                    | IB_DEVICE_SHUTDOWN_PORT
                                    | IB_DEVICE_SYS_IMAGE_GUID
-                                   | IB_DEVICE_LOCAL_DMA_LKEY
                                    | IB_DEVICE_RESIZE_MAX_WR
                                    | IB_DEVICE_PORT_ACTIVE_EVENT
                                    | IB_DEVICE_N_NOTIFY_CQ
                                    | IB_DEVICE_MEM_WINDOW
                                    | IB_DEVICE_MEM_WINDOW_TYPE_2B
                                    | IB_DEVICE_MEM_MGT_EXTENSIONS;
+       ib_attr->kernel_cap_flags = IBK_LOCAL_DMA_LKEY;
        ib_attr->max_send_sge = dev_attr->max_qp_sges;
        ib_attr->max_recv_sge = dev_attr->max_qp_sges;
        ib_attr->max_sge_rd = dev_attr->max_qp_sges;
index 12f33467c6728f1d1097cd1c47ac8189a73fd98e..50cb2259bf874396f1117233e9b30d99d67e6d3b 100644 (file)
@@ -314,7 +314,6 @@ enum db_state {
 struct c4iw_dev {
        struct ib_device ibdev;
        struct c4iw_rdev rdev;
-       u32 device_cap_flags;
        struct xarray cqs;
        struct xarray qps;
        struct xarray mrs;
index 89f36a3a9af00d8f0937f947a0df65f050645d74..246b739ddb2b21f208e2392c038cbd4ba78ab4b7 100644 (file)
@@ -269,7 +269,10 @@ static int c4iw_query_device(struct ib_device *ibdev, struct ib_device_attr *pro
                            dev->rdev.lldi.ports[0]->dev_addr);
        props->hw_ver = CHELSIO_CHIP_RELEASE(dev->rdev.lldi.adapter_type);
        props->fw_ver = dev->rdev.lldi.fw_vers;
-       props->device_cap_flags = dev->device_cap_flags;
+       props->device_cap_flags = IB_DEVICE_MEM_WINDOW;
+       props->kernel_cap_flags = IBK_LOCAL_DMA_LKEY;
+       if (fastreg_support)
+               props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS;
        props->page_size_cap = T4_PAGESIZE_MASK;
        props->vendor_id = (u32)dev->rdev.lldi.pdev->vendor;
        props->vendor_part_id = (u32)dev->rdev.lldi.pdev->device;
@@ -529,9 +532,6 @@ void c4iw_register_device(struct work_struct *work)
        pr_debug("c4iw_dev %p\n", dev);
        addrconf_addr_eui48((u8 *)&dev->ibdev.node_guid,
                            dev->rdev.lldi.ports[0]->dev_addr);
-       dev->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_WINDOW;
-       if (fastreg_support)
-               dev->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS;
        dev->ibdev.local_dma_lkey = 0;
        dev->ibdev.node_type = RDMA_NODE_RNIC;
        BUILD_BUG_ON(sizeof(C4IW_NODE_DESC) > IB_DEVICE_NODE_DESC_MAX);
index 99d0743133cac70f09c705e5d264b16df36c9a3e..6988f6f21bdebbb0e5393adef624c1ebe2e8e8c6 100644 (file)
@@ -1300,8 +1300,8 @@ static void hfi1_fill_device_attr(struct hfi1_devdata *dd)
                        IB_DEVICE_BAD_QKEY_CNTR | IB_DEVICE_SHUTDOWN_PORT |
                        IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_RC_RNR_NAK_GEN |
                        IB_DEVICE_PORT_ACTIVE_EVENT | IB_DEVICE_SRQ_RESIZE |
-                       IB_DEVICE_MEM_MGT_EXTENSIONS |
-                       IB_DEVICE_RDMA_NETDEV_OPA;
+                       IB_DEVICE_MEM_MGT_EXTENSIONS;
+       rdi->dparms.props.kernel_cap_flags = IBK_RDMA_NETDEV_OPA;
        rdi->dparms.props.page_size_cap = PAGE_SIZE;
        rdi->dparms.props.vendor_id = dd->oui1 << 16 | dd->oui2 << 8 | dd->oui3;
        rdi->dparms.props.vendor_part_id = dd->pcidev->device;
index 3dc9b5801da153659cedaca864e3926e70e49065..ec477c4474cf51d9349578dc72043c7fc48d54bb 100644 (file)
@@ -1827,10 +1827,6 @@ int irdma_rt_init_hw(struct irdma_device *iwdev,
                        rf->rsrc_created = true;
                }
 
-               iwdev->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY |
-                                         IB_DEVICE_MEM_WINDOW |
-                                         IB_DEVICE_MEM_MGT_EXTENSIONS;
-
                if (iwdev->rf->sc_dev.hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1)
                        irdma_alloc_set_mac(iwdev);
                irdma_add_ip(iwdev);
index 5123f5feaa2fcb1a3095a5b64924563f4d13d4e9..ef862bced20f316a9a2e1aef4e2e7227f391a800 100644 (file)
@@ -338,7 +338,6 @@ struct irdma_device {
        u32 roce_ackcreds;
        u32 vendor_id;
        u32 vendor_part_id;
-       u32 device_cap_flags;
        u32 push_mode;
        u32 rcv_wnd;
        u16 mac_ip_table_idx;
index 46f475394af5f5d1f995317a967851c1331b8aad..f70ddf9b45bf9aace38e126353174bb37ee22a17 100644 (file)
@@ -25,7 +25,9 @@ static int irdma_query_device(struct ib_device *ibdev,
                            iwdev->netdev->dev_addr);
        props->fw_ver = (u64)irdma_fw_major_ver(&rf->sc_dev) << 32 |
                        irdma_fw_minor_ver(&rf->sc_dev);
-       props->device_cap_flags = iwdev->device_cap_flags;
+       props->device_cap_flags = IB_DEVICE_MEM_WINDOW |
+                                 IB_DEVICE_MEM_MGT_EXTENSIONS;
+       props->kernel_cap_flags = IBK_LOCAL_DMA_LKEY;
        props->vendor_id = pcidev->vendor;
        props->vendor_part_id = pcidev->device;
 
index 93b1650eacfab0e3d42f0358513ce706386d7c04..c448168375db12dafc3da498b1c85879707407d8 100644 (file)
@@ -479,8 +479,8 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
        props->device_cap_flags    = IB_DEVICE_CHANGE_PHY_PORT |
                IB_DEVICE_PORT_ACTIVE_EVENT             |
                IB_DEVICE_SYS_IMAGE_GUID                |
-               IB_DEVICE_RC_RNR_NAK_GEN                |
-               IB_DEVICE_BLOCK_MULTICAST_LOOPBACK;
+               IB_DEVICE_RC_RNR_NAK_GEN;
+       props->kernel_cap_flags = IBK_BLOCK_MULTICAST_LOOPBACK;
        if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_PKEY_CNTR)
                props->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR;
        if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_QKEY_CNTR)
@@ -494,9 +494,9 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
        if (dev->dev->caps.max_gso_sz &&
            (dev->dev->rev_id != MLX4_IB_CARD_REV_A0) &&
            (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BLH))
-               props->device_cap_flags |= IB_DEVICE_UD_TSO;
+               props->kernel_cap_flags |= IBK_UD_TSO;
        if (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_RESERVED_LKEY)
-               props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY;
+               props->kernel_cap_flags |= IBK_LOCAL_DMA_LKEY;
        if ((dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_LOCAL_INV) &&
            (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_REMOTE_INV) &&
            (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_FAST_REG_WR))
index 32a0ea820573425458868758687aad0a1bbe9719..203950b4eec85ee5699170c6d003f955cf66ff57 100644 (file)
@@ -855,13 +855,13 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
                                           IB_DEVICE_MEM_WINDOW_TYPE_2B;
                props->max_mw = 1 << MLX5_CAP_GEN(mdev, log_max_mkey);
                /* We support 'Gappy' memory registration too */
-               props->device_cap_flags |= IB_DEVICE_SG_GAPS_REG;
+               props->kernel_cap_flags |= IBK_SG_GAPS_REG;
        }
        /* IB_WR_REG_MR always requires changing the entity size with UMR */
        if (!MLX5_CAP_GEN(dev->mdev, umr_modify_entity_size_disabled))
                props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS;
        if (MLX5_CAP_GEN(mdev, sho)) {
-               props->device_cap_flags |= IB_DEVICE_INTEGRITY_HANDOVER;
+               props->kernel_cap_flags |= IBK_INTEGRITY_HANDOVER;
                /* At this stage no support for signature handover */
                props->sig_prot_cap = IB_PROT_T10DIF_TYPE_1 |
                                      IB_PROT_T10DIF_TYPE_2 |
@@ -870,7 +870,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
                                       IB_GUARD_T10DIF_CSUM;
        }
        if (MLX5_CAP_GEN(mdev, block_lb_mc))
-               props->device_cap_flags |= IB_DEVICE_BLOCK_MULTICAST_LOOPBACK;
+               props->kernel_cap_flags |= IBK_BLOCK_MULTICAST_LOOPBACK;
 
        if (MLX5_CAP_GEN(dev->mdev, eth_net_offloads) && raw_support) {
                if (MLX5_CAP_ETH(mdev, csum_cap)) {
@@ -921,7 +921,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
 
        if (MLX5_CAP_GEN(mdev, ipoib_basic_offloads)) {
                props->device_cap_flags |= IB_DEVICE_UD_IP_CSUM;
-               props->device_cap_flags |= IB_DEVICE_UD_TSO;
+               props->kernel_cap_flags |= IBK_UD_TSO;
        }
 
        if (MLX5_CAP_GEN(dev->mdev, rq_delay_drop) &&
@@ -997,7 +997,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
 
        if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
                if (dev->odp_caps.general_caps & IB_ODP_SUPPORT)
-                       props->device_cap_flags |= IB_DEVICE_ON_DEMAND_PAGING;
+                       props->kernel_cap_flags |= IBK_ON_DEMAND_PAGING;
                props->odp_caps = dev->odp_caps;
                if (!uhw) {
                        /* ODP for kernel QPs is not implemented for receive
@@ -1018,11 +1018,8 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
                }
        }
 
-       if (MLX5_CAP_GEN(mdev, cd))
-               props->device_cap_flags |= IB_DEVICE_CROSS_CHANNEL;
-
        if (mlx5_core_is_vf(mdev))
-               props->device_cap_flags |= IB_DEVICE_VIRTUAL_FUNCTION;
+               props->kernel_cap_flags |= IBK_VIRTUAL_FUNCTION;
 
        if (mlx5_ib_port_link_layer(ibdev, 1) ==
            IB_LINK_LAYER_ETHERNET && raw_support) {
index acf9970ec245fa1bf4b3d6c9896ce69a998a4907..dd4021b1196300acc0bbe3ba9d1419e5c4451540 100644 (file)
@@ -90,8 +90,8 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr,
                                        IB_DEVICE_RC_RNR_NAK_GEN |
                                        IB_DEVICE_SHUTDOWN_PORT |
                                        IB_DEVICE_SYS_IMAGE_GUID |
-                                       IB_DEVICE_LOCAL_DMA_LKEY |
                                        IB_DEVICE_MEM_MGT_EXTENSIONS;
+       attr->kernel_cap_flags = IBK_LOCAL_DMA_LKEY;
        attr->max_send_sge = dev->attr.max_send_sge;
        attr->max_recv_sge = dev->attr.max_recv_sge;
        attr->max_sge_rd = dev->attr.max_rdma_sge;
index a53476653b0d9b20c40bb2ae0e9e9aecd7ad6fbc..f0f43b6db89ee9669d96a99e3010ad192df92b06 100644 (file)
@@ -134,7 +134,8 @@ int qedr_query_device(struct ib_device *ibdev,
        attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
        attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
            IB_DEVICE_RC_RNR_NAK_GEN |
-           IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
+           IB_DEVICE_MEM_MGT_EXTENSIONS;
+       attr->kernel_cap_flags = IBK_LOCAL_DMA_LKEY;
 
        if (!rdma_protocol_iwarp(&dev->ibdev, 1))
                attr->device_cap_flags |= IB_DEVICE_XRC;
index d3a9670bf9719a255940e069df7c86dc2ab4d7eb..71fa7dc3cc6acca39629c7846e905889fa8d7a23 100644 (file)
@@ -305,7 +305,8 @@ int usnic_ib_query_device(struct ib_device *ibdev,
        props->max_qp = qp_per_vf *
                kref_read(&us_ibdev->vf_cnt);
        props->device_cap_flags = IB_DEVICE_PORT_ACTIVE_EVENT |
-               IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_BLOCK_MULTICAST_LOOPBACK;
+               IB_DEVICE_SYS_IMAGE_GUID;
+       props->kernel_cap_flags = IBK_BLOCK_MULTICAST_LOOPBACK;
        props->max_cq = us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_CQ] *
                kref_read(&us_ibdev->vf_cnt);
        props->max_pd = USNIC_UIOM_MAX_PD_CNT;
index 2dae7538a2ea95fb1d7ae5728abc34f3cbb49e10..51daac5c4feb75b847bb06f8a32818ebd941ac73 100644 (file)
@@ -46,6 +46,7 @@ static void rxe_init_device_param(struct rxe_dev *rxe)
        rxe->attr.max_qp                        = RXE_MAX_QP;
        rxe->attr.max_qp_wr                     = RXE_MAX_QP_WR;
        rxe->attr.device_cap_flags              = RXE_DEVICE_CAP_FLAGS;
+       rxe->attr.kernel_cap_flags              = IBK_ALLOW_USER_UNREG;
        rxe->attr.max_send_sge                  = RXE_MAX_SGE;
        rxe->attr.max_recv_sge                  = RXE_MAX_SGE;
        rxe->attr.max_sge_rd                    = RXE_MAX_SGE_RD;
index 918270e34a35cf90ac87bfb08066e23301ed03bd..a717125f8cf5a5b471411804f6269857c20b611e 100644 (file)
@@ -50,7 +50,6 @@ enum rxe_device_param {
                                        | IB_DEVICE_RC_RNR_NAK_GEN
                                        | IB_DEVICE_SRQ_RESIZE
                                        | IB_DEVICE_MEM_MGT_EXTENSIONS
-                                       | IB_DEVICE_ALLOW_USER_UNREG
                                        | IB_DEVICE_MEM_WINDOW
                                        | IB_DEVICE_MEM_WINDOW_TYPE_2A
                                        | IB_DEVICE_MEM_WINDOW_TYPE_2B,
index 54ef367b074abad51d96686d5e423974f9c6830f..09316072b7890ef8ad0a082c63cc124423433fe7 100644 (file)
@@ -132,8 +132,8 @@ int siw_query_device(struct ib_device *base_dev, struct ib_device_attr *attr,
 
        /* Revisit atomic caps if RFC 7306 gets supported */
        attr->atomic_cap = 0;
-       attr->device_cap_flags =
-               IB_DEVICE_MEM_MGT_EXTENSIONS | IB_DEVICE_ALLOW_USER_UNREG;
+       attr->device_cap_flags = IB_DEVICE_MEM_MGT_EXTENSIONS;
+       attr->kernel_cap_flags = IBK_ALLOW_USER_UNREG;
        attr->max_cq = sdev->attrs.max_cq;
        attr->max_cqe = sdev->attrs.max_cqe;
        attr->max_fast_reg_page_list_len = SIW_MAX_SGE_PBL;
index 44d8d151ff9041e4863f69ce7dbf1245305cbae9..35e9c8a330e257189ca8cfbcec5e1aa4ef4262b8 100644 (file)
@@ -411,6 +411,7 @@ struct ipoib_dev_priv {
        struct dentry *path_dentry;
 #endif
        u64     hca_caps;
+       u64     kernel_caps;
        struct ipoib_ethtool_st ethtool;
        unsigned int max_send_sge;
        const struct net_device_ops     *rn_ops;
index 9934b8bd7f56cfd873d788455a856f91dbcd8077..2a8961b685c2da04cb6eb19f9f2aebeb905382e5 100644 (file)
@@ -1850,11 +1850,12 @@ static void ipoib_parent_unregister_pre(struct net_device *ndev)
 static void ipoib_set_dev_features(struct ipoib_dev_priv *priv)
 {
        priv->hca_caps = priv->ca->attrs.device_cap_flags;
+       priv->kernel_caps = priv->ca->attrs.kernel_cap_flags;
 
        if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
                priv->dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
 
-               if (priv->hca_caps & IB_DEVICE_UD_TSO)
+               if (priv->kernel_caps & IBK_UD_TSO)
                        priv->dev->hw_features |= NETIF_F_TSO;
 
                priv->dev->features |= priv->dev->hw_features;
@@ -2201,7 +2202,7 @@ int ipoib_intf_init(struct ib_device *hca, u32 port, const char *name,
 
        priv->rn_ops = dev->netdev_ops;
 
-       if (hca->attrs.device_cap_flags & IB_DEVICE_VIRTUAL_FUNCTION)
+       if (hca->attrs.kernel_cap_flags & IBK_VIRTUAL_FUNCTION)
                dev->netdev_ops = &ipoib_netdev_ops_vf;
        else
                dev->netdev_ops = &ipoib_netdev_ops_pf;
index 5a150a080ac217514ed7e5748c3189495105a019..368e5d77416de9d1757846ad9cab034561b23fa2 100644 (file)
@@ -197,16 +197,16 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
        init_attr.send_cq = priv->send_cq;
        init_attr.recv_cq = priv->recv_cq;
 
-       if (priv->hca_caps & IB_DEVICE_UD_TSO)
+       if (priv->kernel_caps & IBK_UD_TSO)
                init_attr.create_flags |= IB_QP_CREATE_IPOIB_UD_LSO;
 
-       if (priv->hca_caps & IB_DEVICE_BLOCK_MULTICAST_LOOPBACK)
+       if (priv->kernel_caps & IBK_BLOCK_MULTICAST_LOOPBACK)
                init_attr.create_flags |= IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK;
 
        if (priv->hca_caps & IB_DEVICE_MANAGED_FLOW_STEERING)
                init_attr.create_flags |= IB_QP_CREATE_NETIF_QP;
 
-       if (priv->hca_caps & IB_DEVICE_RDMA_NETDEV_OPA)
+       if (priv->kernel_caps & IBK_RDMA_NETDEV_OPA)
                init_attr.create_flags |= IB_QP_CREATE_NETDEV_USE;
 
        priv->qp = ib_create_qp(priv->pd, &init_attr);
index f8d0bab4424cf3edcaca8c01863e301f06eede65..321949a570ed6fb2d2c94de4d556ded09f083879 100644 (file)
@@ -650,7 +650,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
                                                   SHOST_DIX_GUARD_CRC);
                }
 
-               if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
+               if (!(ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG))
                        shost->virt_boundary_mask = SZ_4K - 1;
 
                if (iscsi_host_add(shost, ib_dev->dev.parent)) {
index 5dbad68c73903207434eaaa600fbdec23a934f9f..c08f2d9133b69be89bbd05e910a55775663e69b5 100644 (file)
@@ -115,7 +115,7 @@ iser_create_fastreg_desc(struct iser_device *device,
        if (!desc)
                return ERR_PTR(-ENOMEM);
 
-       if (ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
+       if (ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG)
                mr_type = IB_MR_TYPE_SG_GAPS;
        else
                mr_type = IB_MR_TYPE_MEM_REG;
@@ -517,7 +517,7 @@ static void iser_calc_scsi_params(struct iser_conn *iser_conn,
         * (head and tail) for a single page worth data, so one additional
         * entry is required.
         */
-       if (attr->device_cap_flags & IB_DEVICE_SG_GAPS_REG)
+       if (attr->kernel_cap_flags & IBK_SG_GAPS_REG)
                reserved_mr_pages = 0;
        else
                reserved_mr_pages = 1;
@@ -562,8 +562,8 @@ static void iser_addr_handler(struct rdma_cm_id *cma_id)
 
        /* connection T10-PI support */
        if (iser_pi_enable) {
-               if (!(device->ib_device->attrs.device_cap_flags &
-                     IB_DEVICE_INTEGRITY_HANDOVER)) {
+               if (!(device->ib_device->attrs.kernel_cap_flags &
+                     IBK_INTEGRITY_HANDOVER)) {
                        iser_warn("T10-PI requested but not supported on %s, "
                                  "continue without T10-PI\n",
                                  dev_name(&ib_conn->device->ib_device->dev));
index 636d590765f9578c0ff595cdf74b79400bfa66ed..181e39e2a673111a4265083271e2da4f741b13d2 100644 (file)
@@ -230,7 +230,7 @@ isert_create_device_ib_res(struct isert_device *device)
        }
 
        /* Check signature cap */
-       if (ib_dev->attrs.device_cap_flags & IB_DEVICE_INTEGRITY_HANDOVER)
+       if (ib_dev->attrs.kernel_cap_flags & IBK_INTEGRITY_HANDOVER)
                device->pi_capable = true;
        else
                device->pi_capable = false;
index 285b766e4e7049b11b776909c0ca470c5ad18cc8..6058abf42ba74d3d973c6499128f67be7b3e504c 100644 (file)
@@ -430,7 +430,7 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
        spin_lock_init(&pool->lock);
        INIT_LIST_HEAD(&pool->free_list);
 
-       if (device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
+       if (device->attrs.kernel_cap_flags & IBK_SG_GAPS_REG)
                mr_type = IB_MR_TYPE_SG_GAPS;
        else
                mr_type = IB_MR_TYPE_MEM_REG;
@@ -3650,7 +3650,7 @@ static ssize_t add_target_store(struct device *dev,
        target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;
        target_host->max_segment_size = ib_dma_max_seg_size(ibdev);
 
-       if (!(ibdev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
+       if (!(ibdev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG))
                target_host->virt_boundary_mask = ~srp_dev->mr_page_mask;
 
        target = host_to_target(target_host);
@@ -3706,8 +3706,8 @@ static ssize_t add_target_store(struct device *dev,
        }
 
        if (srp_dev->use_fast_reg) {
-               bool gaps_reg = (ibdev->attrs.device_cap_flags &
-                                IB_DEVICE_SG_GAPS_REG);
+               bool gaps_reg = ibdev->attrs.kernel_cap_flags &
+                                IBK_SG_GAPS_REG;
 
                max_sectors_per_mr = srp_dev->max_pages_per_mr <<
                                  (ilog2(srp_dev->mr_page_size) - 9);
index d9f19d90131398f8ab5a12395eb041ff34c0fdd1..5a69a45c5bd68961fdba55dd007c3d032e5419d5 100644 (file)
@@ -867,8 +867,8 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,
        ctrl->ctrl.numa_node = ibdev_to_node(ctrl->device->dev);
 
        /* T10-PI support */
-       if (ctrl->device->dev->attrs.device_cap_flags &
-           IB_DEVICE_INTEGRITY_HANDOVER)
+       if (ctrl->device->dev->attrs.kernel_cap_flags &
+           IBK_INTEGRITY_HANDOVER)
                pi_capable = true;
 
        ctrl->max_fr_pages = nvme_rdma_get_max_fr_pages(ctrl->device->dev,
index 2fab0b219b255d81d3e10a461a4c067498dd8b63..09fdcac87d17701d5b712fa7d6799162c20938d0 100644 (file)
@@ -1221,8 +1221,8 @@ nvmet_rdma_find_get_device(struct rdma_cm_id *cm_id)
        ndev->inline_data_size = nport->inline_data_size;
        ndev->inline_page_count = inline_page_count;
 
-       if (nport->pi_enable && !(cm_id->device->attrs.device_cap_flags &
-                                 IB_DEVICE_INTEGRITY_HANDOVER)) {
+       if (nport->pi_enable && !(cm_id->device->attrs.kernel_cap_flags &
+                                 IBK_INTEGRITY_HANDOVER)) {
                pr_warn("T10-PI is not supported by device %s. Disabling it\n",
                        cm_id->device->name);
                nport->pi_enable = false;
index 31ef64eb7fbb98dfe88ba71fd143a8cafafc0a12..b3a1265711cc7d4c9c8a354106ca276d438104b6 100644 (file)
@@ -649,7 +649,7 @@ static int smbd_ia_open(
                smbd_max_frmr_depth,
                info->id->device->attrs.max_fast_reg_page_list_len);
        info->mr_type = IB_MR_TYPE_MEM_REG;
-       if (info->id->device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
+       if (info->id->device->attrs.kernel_cap_flags & IBK_SG_GAPS_REG)
                info->mr_type = IB_MR_TYPE_SG_GAPS;
 
        info->pd = ib_alloc_pd(info->id->device, 0);
index ada4a5226dbd9190f216460347692129e7b5cee5..b3bb4dd068b6f33ebad9bca0e11531e2c248da9c 100644 (file)
@@ -236,14 +236,6 @@ enum ib_device_cap_flags {
        IB_DEVICE_SRQ_RESIZE = IB_UVERBS_DEVICE_SRQ_RESIZE,
        IB_DEVICE_N_NOTIFY_CQ = IB_UVERBS_DEVICE_N_NOTIFY_CQ,
 
-       /*
-        * This device supports a per-device lkey or stag that can be
-        * used without performing a memory registration for the local
-        * memory.  Note that ULPs should never check this flag, but
-        * instead of use the local_dma_lkey flag in the ib_pd structure,
-        * which will always contain a usable lkey.
-        */
-       IB_DEVICE_LOCAL_DMA_LKEY = 1 << 15,
        /* Reserved, old SEND_W_INV = 1 << 16,*/
        IB_DEVICE_MEM_WINDOW = IB_UVERBS_DEVICE_MEM_WINDOW,
        /*
@@ -254,7 +246,6 @@ enum ib_device_cap_flags {
         * IPoIB driver may set NETIF_F_IP_CSUM for datagram mode.
         */
        IB_DEVICE_UD_IP_CSUM = IB_UVERBS_DEVICE_UD_IP_CSUM,
-       IB_DEVICE_UD_TSO = 1 << 19,
        IB_DEVICE_XRC = IB_UVERBS_DEVICE_XRC,
 
        /*
@@ -267,59 +258,53 @@ enum ib_device_cap_flags {
         * stag.
         */
        IB_DEVICE_MEM_MGT_EXTENSIONS = IB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS,
-       IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = 1 << 22,
        IB_DEVICE_MEM_WINDOW_TYPE_2A = IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A,
        IB_DEVICE_MEM_WINDOW_TYPE_2B = IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B,
        IB_DEVICE_RC_IP_CSUM = IB_UVERBS_DEVICE_RC_IP_CSUM,
        /* Deprecated. Please use IB_RAW_PACKET_CAP_IP_CSUM. */
        IB_DEVICE_RAW_IP_CSUM = IB_UVERBS_DEVICE_RAW_IP_CSUM,
-       /*
-        * Devices should set IB_DEVICE_CROSS_CHANNEL if they
-        * support execution of WQEs that involve synchronization
-        * of I/O operations with single completion queue managed
-        * by hardware.
-        */
-       IB_DEVICE_CROSS_CHANNEL = 1 << 27,
        IB_DEVICE_MANAGED_FLOW_STEERING =
                IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING,
-       IB_DEVICE_INTEGRITY_HANDOVER = 1 << 30,
-       IB_DEVICE_ON_DEMAND_PAGING = 1ULL << 31,
-       IB_DEVICE_SG_GAPS_REG = 1ULL << 32,
-       IB_DEVICE_VIRTUAL_FUNCTION = 1ULL << 33,
        /* Deprecated. Please use IB_RAW_PACKET_CAP_SCATTER_FCS. */
        IB_DEVICE_RAW_SCATTER_FCS = IB_UVERBS_DEVICE_RAW_SCATTER_FCS,
-       IB_DEVICE_RDMA_NETDEV_OPA = 1ULL << 35,
        /* The device supports padding incoming writes to cacheline. */
        IB_DEVICE_PCI_WRITE_END_PADDING =
                IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING,
-       IB_DEVICE_ALLOW_USER_UNREG = 1ULL << 37,
-};
-
-#define IB_UVERBS_DEVICE_CAP_FLAGS_MASK        (IB_UVERBS_DEVICE_RESIZE_MAX_WR | \
-               IB_UVERBS_DEVICE_BAD_PKEY_CNTR | \
-               IB_UVERBS_DEVICE_BAD_QKEY_CNTR | \
-               IB_UVERBS_DEVICE_RAW_MULTI | \
-               IB_UVERBS_DEVICE_AUTO_PATH_MIG | \
-               IB_UVERBS_DEVICE_CHANGE_PHY_PORT | \
-               IB_UVERBS_DEVICE_UD_AV_PORT_ENFORCE | \
-               IB_UVERBS_DEVICE_CURR_QP_STATE_MOD | \
-               IB_UVERBS_DEVICE_SHUTDOWN_PORT | \
-               IB_UVERBS_DEVICE_PORT_ACTIVE_EVENT | \
-               IB_UVERBS_DEVICE_SYS_IMAGE_GUID | \
-               IB_UVERBS_DEVICE_RC_RNR_NAK_GEN | \
-               IB_UVERBS_DEVICE_SRQ_RESIZE | \
-               IB_UVERBS_DEVICE_N_NOTIFY_CQ | \
-               IB_UVERBS_DEVICE_MEM_WINDOW | \
-               IB_UVERBS_DEVICE_UD_IP_CSUM | \
-               IB_UVERBS_DEVICE_XRC | \
-               IB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS | \
-               IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A | \
-               IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B | \
-               IB_UVERBS_DEVICE_RC_IP_CSUM | \
-               IB_UVERBS_DEVICE_RAW_IP_CSUM | \
-               IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING | \
-               IB_UVERBS_DEVICE_RAW_SCATTER_FCS | \
-               IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING)
+};
+
+enum ib_kernel_cap_flags {
+       /*
+        * This device supports a per-device lkey or stag that can be
+        * used without performing a memory registration for the local
+        * memory.  Note that ULPs should never check this flag, but
+        * instead of use the local_dma_lkey flag in the ib_pd structure,
+        * which will always contain a usable lkey.
+        */
+       IBK_LOCAL_DMA_LKEY = 1 << 0,
+       /* IB_QP_CREATE_INTEGRITY_EN is supported to implement T10-PI */
+       IBK_INTEGRITY_HANDOVER = 1 << 1,
+       /* IB_ACCESS_ON_DEMAND is supported during reg_user_mr() */
+       IBK_ON_DEMAND_PAGING = 1 << 2,
+       /* IB_MR_TYPE_SG_GAPS is supported */
+       IBK_SG_GAPS_REG = 1 << 3,
+       /* Driver supports RDMA_NLDEV_CMD_DELLINK */
+       IBK_ALLOW_USER_UNREG = 1 << 4,
+
+       /* ipoib will use IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK */
+       IBK_BLOCK_MULTICAST_LOOPBACK = 1 << 5,
+       /* iopib will use IB_QP_CREATE_IPOIB_UD_LSO for its QPs */
+       IBK_UD_TSO = 1 << 6,
+       /* iopib will use the device ops:
+        *   get_vf_config
+        *   get_vf_guid
+        *   get_vf_stats
+        *   set_vf_guid
+        *   set_vf_link_state
+        */
+       IBK_VIRTUAL_FUNCTION = 1 << 7,
+       /* ipoib will use IB_QP_CREATE_NETDEV_USE for its QPs */
+       IBK_RDMA_NETDEV_OPA = 1 << 8,
+};
 
 enum ib_atomic_cap {
        IB_ATOMIC_NONE,
@@ -417,6 +402,7 @@ struct ib_device_attr {
        int                     max_qp;
        int                     max_qp_wr;
        u64                     device_cap_flags;
+       u64                     kernel_cap_flags;
        int                     max_send_sge;
        int                     max_recv_sge;
        int                     max_sge_rd;
@@ -4344,7 +4330,7 @@ static inline int ib_check_mr_access(struct ib_device *ib_dev,
                return -EINVAL;
 
        if (flags & IB_ACCESS_ON_DEMAND &&
-           !(ib_dev->attrs.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING))
+           !(ib_dev->attrs.kernel_cap_flags & IBK_ON_DEMAND_PAGING))
                return -EINVAL;
        return 0;
 }
index cbe3c2811455014eaf9e8e6dc3d0f1e397c2059c..f3d5377b217a681c242ae69dafc45dd7244a5cb3 100644 (file)
@@ -90,8 +90,7 @@ struct opa_vnic_stats {
 
 static inline bool rdma_cap_opa_vnic(struct ib_device *device)
 {
-       return !!(device->attrs.device_cap_flags &
-                 IB_DEVICE_RDMA_NETDEV_OPA);
+       return !!(device->attrs.kernel_cap_flags & IBK_RDMA_NETDEV_OPA);
 }
 
 #endif /* _OPA_VNIC_H */
index 06a4897c4958a5c725d8dc22edc48641a0091b10..7dd903d932e54f65c0da53cdd4018feef3db3763 100644 (file)
@@ -1298,6 +1298,10 @@ struct ib_uverbs_ex_modify_cq {
 
 #define IB_DEVICE_NAME_MAX 64
 
+/*
+ * bits 9, 15, 16, 19, 22, 27, 30, 31, 32, 33, 35 and 37 may be set by old
+ * kernels and should not be used.
+ */
 enum ib_uverbs_device_cap_flags {
        IB_UVERBS_DEVICE_RESIZE_MAX_WR = 1 << 0,
        IB_UVERBS_DEVICE_BAD_PKEY_CNTR = 1 << 1,
index 24c9a9005a6fbac0ba408649dc090042f5c8eca5..9826fe7f9d00868576f4411b31cd52f5de5d8f6d 100644 (file)
@@ -154,8 +154,8 @@ static int rds_ib_add_one(struct ib_device *device)
        rds_ibdev->max_sge = min(device->attrs.max_send_sge, RDS_IB_MAX_SGE);
 
        rds_ibdev->odp_capable =
-               !!(device->attrs.device_cap_flags &
-                  IB_DEVICE_ON_DEMAND_PAGING) &&
+               !!(device->attrs.kernel_cap_flags &
+                  IBK_ON_DEMAND_PAGING) &&
                !!(device->attrs.odp_caps.per_transport_caps.rc_odp_caps &
                   IB_ODP_SUPPORT_WRITE) &&
                !!(device->attrs.odp_caps.per_transport_caps.rc_odp_caps &
index 3fcd8e1b255088e714b0f5138d6236c289d7e1a1..de0bdb6b729f8935023468f65472c7301ec4d9a1 100644 (file)
@@ -195,7 +195,7 @@ int frwr_query_device(struct rpcrdma_ep *ep, const struct ib_device *device)
        ep->re_attr.cap.max_recv_sge = 1;
 
        ep->re_mrtype = IB_MR_TYPE_MEM_REG;
-       if (attrs->device_cap_flags & IB_DEVICE_SG_GAPS_REG)
+       if (attrs->kernel_cap_flags & IBK_SG_GAPS_REG)
                ep->re_mrtype = IB_MR_TYPE_SG_GAPS;
 
        /* Quirk: Some devices advertise a large max_fast_reg_page_list_len