BIT_ULL(IB_USER_VERBS_CMD_ALLOC_PD) |
                BIT_ULL(IB_USER_VERBS_CMD_ATTACH_MCAST) |
                BIT_ULL(IB_USER_VERBS_CMD_CLOSE_XRCD) |
+               BIT_ULL(IB_USER_VERBS_CMD_CREATE_AH) |
                BIT_ULL(IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |
                BIT_ULL(IB_USER_VERBS_CMD_CREATE_CQ) |
                BIT_ULL(IB_USER_VERBS_CMD_CREATE_QP) |
                BIT_ULL(IB_USER_VERBS_CMD_DEALLOC_MW) |
                BIT_ULL(IB_USER_VERBS_CMD_DEALLOC_PD) |
                BIT_ULL(IB_USER_VERBS_CMD_DEREG_MR) |
+               BIT_ULL(IB_USER_VERBS_CMD_DESTROY_AH) |
                BIT_ULL(IB_USER_VERBS_CMD_DESTROY_CQ) |
                BIT_ULL(IB_USER_VERBS_CMD_DESTROY_QP) |
                BIT_ULL(IB_USER_VERBS_CMD_DESTROY_SRQ) |
        SET_DEVICE_OP(dev_ops, create_qp);
        SET_DEVICE_OP(dev_ops, create_rwq_ind_table);
        SET_DEVICE_OP(dev_ops, create_srq);
+       SET_DEVICE_OP(dev_ops, create_user_ah);
        SET_DEVICE_OP(dev_ops, create_wq);
        SET_DEVICE_OP(dev_ops, dealloc_dm);
        SET_DEVICE_OP(dev_ops, dealloc_driver);
 
                                     ib_uverbs_create_ah,
                                     UAPI_DEF_WRITE_UDATA_IO(
                                             struct ib_uverbs_create_ah,
-                                            struct ib_uverbs_create_ah_resp),
-                                    UAPI_DEF_METHOD_NEEDS_FN(create_ah)),
+                                            struct ib_uverbs_create_ah_resp)),
                DECLARE_UVERBS_WRITE(
                        IB_USER_VERBS_CMD_DESTROY_AH,
                        ib_uverbs_destroy_ah,
-                       UAPI_DEF_WRITE_I(struct ib_uverbs_destroy_ah),
-                       UAPI_DEF_METHOD_NEEDS_FN(destroy_ah))),
+                       UAPI_DEF_WRITE_I(struct ib_uverbs_destroy_ah)),
+               UAPI_DEF_OBJ_NEEDS_FN(create_user_ah),
+               UAPI_DEF_OBJ_NEEDS_FN(destroy_ah)),
 
        DECLARE_UVERBS_OBJECT(
                UVERBS_OBJECT_COMP_CHANNEL,
 
        init_attr.flags = flags;
        init_attr.xmit_slave = xmit_slave;
 
-       ret = device->ops.create_ah(ah, &init_attr, udata);
+       if (udata)
+               ret = device->ops.create_user_ah(ah, &init_attr, udata);
+       else
+               ret = device->ops.create_ah(ah, &init_attr, NULL);
        if (ret) {
                kfree(ah);
                return ERR_PTR(ret);
 
        .create_cq = bnxt_re_create_cq,
        .create_qp = bnxt_re_create_qp,
        .create_srq = bnxt_re_create_srq,
+       .create_user_ah = bnxt_re_create_ah,
        .dealloc_driver = bnxt_re_dealloc_driver,
        .dealloc_pd = bnxt_re_dealloc_pd,
        .dealloc_ucontext = bnxt_re_dealloc_ucontext,
        ibdev->dev.parent = &rdev->en_dev->pdev->dev;
        ibdev->local_dma_lkey = BNXT_QPLIB_RSVD_LKEY;
 
-       /* User space */
-       ibdev->uverbs_cmd_mask |=
-                       (1ull << IB_USER_VERBS_CMD_CREATE_AH)           |
-                       (1ull << IB_USER_VERBS_CMD_MODIFY_AH)           |
-                       (1ull << IB_USER_VERBS_CMD_QUERY_AH)            |
-                       (1ull << IB_USER_VERBS_CMD_DESTROY_AH);
-       /* POLL_CQ and REQ_NOTIFY_CQ is directly handled in libbnxt_re */
-
-
        rdma_set_device_sysfs_group(ibdev, &bnxt_re_dev_attr_group);
        ib_set_device_ops(ibdev, &bnxt_re_dev_ops);
        ret = ib_device_set_netdev(&rdev->ibdev, rdev->netdev, 1);
 
        .create_ah = efa_create_ah,
        .create_cq = efa_create_cq,
        .create_qp = efa_create_qp,
+       .create_user_ah = efa_create_ah,
        .dealloc_pd = efa_dealloc_pd,
        .dealloc_ucontext = efa_dealloc_ucontext,
        .dereg_mr = efa_dereg_mr,
        dev->ibdev.num_comp_vectors = 1;
        dev->ibdev.dev.parent = &pdev->dev;
 
-       dev->ibdev.uverbs_cmd_mask |=
-               (1ull << IB_USER_VERBS_CMD_CREATE_AH) |
-               (1ull << IB_USER_VERBS_CMD_DESTROY_AH);
-
        ib_set_device_ops(&dev->ibdev, &efa_dev_ops);
 
        err = ib_register_device(&dev->ibdev, "efa_%d", &pdev->dev);
 
        .create_cq = mlx5_ib_create_cq,
        .create_qp = mlx5_ib_create_qp,
        .create_srq = mlx5_ib_create_srq,
+       .create_user_ah = mlx5_ib_create_ah,
        .dealloc_pd = mlx5_ib_dealloc_pd,
        .dealloc_ucontext = mlx5_ib_dealloc_ucontext,
        .del_gid = mlx5_ib_del_gid,
        struct mlx5_core_dev *mdev = dev->mdev;
        int err;
 
-       dev->ib_dev.uverbs_cmd_mask |=
-               (1ull << IB_USER_VERBS_CMD_CREATE_AH)           |
-               (1ull << IB_USER_VERBS_CMD_DESTROY_AH);
-
        if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads) &&
            IS_ENABLED(CONFIG_MLX5_CORE_IPOIB))
                ib_set_device_ops(&dev->ib_dev,
 
        .create_ah = ocrdma_create_ah,
        .create_cq = ocrdma_create_cq,
        .create_qp = ocrdma_create_qp,
+       .create_user_ah = ocrdma_create_ah,
        .dealloc_pd = ocrdma_dealloc_pd,
        .dealloc_ucontext = ocrdma_dealloc_ucontext,
        .dereg_mr = ocrdma_dereg_mr,
        memcpy(dev->ibdev.node_desc, OCRDMA_NODE_DESC,
               sizeof(OCRDMA_NODE_DESC));
 
-       dev->ibdev.uverbs_cmd_mask |=
-           OCRDMA_UVERBS(CREATE_AH) |
-            OCRDMA_UVERBS(MODIFY_AH) |
-            OCRDMA_UVERBS(QUERY_AH) |
-            OCRDMA_UVERBS(DESTROY_AH);
-
        dev->ibdev.node_type = RDMA_NODE_IB_CA;
        dev->ibdev.phys_port_cnt = 1;
        dev->ibdev.num_comp_vectors = dev->eq_cnt;
 
  * rvt_destory_ah - Destory an address handle
  * @ibah: address handle
  * @destroy_flags: destroy address handle flags (see enum rdma_destroy_ah_flags)
- *
  * Return: 0 on success
  */
 int rvt_destroy_ah(struct ib_ah *ibah, u32 destroy_flags)
 
        .create_cq = rvt_create_cq,
        .create_qp = rvt_create_qp,
        .create_srq = rvt_create_srq,
+       .create_user_ah = rvt_create_ah,
        .dealloc_pd = rvt_dealloc_pd,
        .dealloc_ucontext = rvt_dealloc_ucontext,
        .dereg_mr = rvt_dereg_mr,
         * version, so we do all of this sort of stuff here.
         */
        rdi->ibdev.uverbs_cmd_mask |=
-               (1ull << IB_USER_VERBS_CMD_CREATE_AH)           |
-               (1ull << IB_USER_VERBS_CMD_MODIFY_AH)           |
-               (1ull << IB_USER_VERBS_CMD_QUERY_AH)            |
-               (1ull << IB_USER_VERBS_CMD_DESTROY_AH)          |
                (1ull << IB_USER_VERBS_CMD_POLL_CQ)             |
                (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ)       |
                (1ull << IB_USER_VERBS_CMD_POST_SEND)           |
 
        .create_cq = rxe_create_cq,
        .create_qp = rxe_create_qp,
        .create_srq = rxe_create_srq,
+       .create_user_ah = rxe_create_ah,
        .dealloc_driver = rxe_dealloc,
        .dealloc_pd = rxe_dealloc_pd,
        .dealloc_ucontext = rxe_dealloc_ucontext,
        dma_set_max_seg_size(&dev->dev, UINT_MAX);
        dma_set_coherent_mask(&dev->dev, dma_get_required_mask(&dev->dev));
 
-       dev->uverbs_cmd_mask |=
-           BIT_ULL(IB_USER_VERBS_CMD_REQ_NOTIFY_CQ)
-           | BIT_ULL(IB_USER_VERBS_CMD_CREATE_AH)
-           | BIT_ULL(IB_USER_VERBS_CMD_MODIFY_AH)
-           | BIT_ULL(IB_USER_VERBS_CMD_QUERY_AH)
-           | BIT_ULL(IB_USER_VERBS_CMD_DESTROY_AH)
-           ;
+       dev->uverbs_cmd_mask |= BIT_ULL(IB_USER_VERBS_CMD_REQ_NOTIFY_CQ);
 
        ib_set_device_ops(dev, &rxe_dev_ops);
        err = ib_device_set_netdev(&rxe->ib_dev, rxe->ndev, 1);
 
        int (*dealloc_pd)(struct ib_pd *pd, struct ib_udata *udata);
        int (*create_ah)(struct ib_ah *ah, struct rdma_ah_init_attr *attr,
                         struct ib_udata *udata);
+       int (*create_user_ah)(struct ib_ah *ah, struct rdma_ah_init_attr *attr,
+                             struct ib_udata *udata);
        int (*modify_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
        int (*query_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
        int (*destroy_ah)(struct ib_ah *ah, u32 flags);