From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A82A218EFD1; Fri, 13 Feb 2026 10:58:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980339; cv=none; b=fUWy6TR7O25YcL9JUqw3gpbQcFlv+FprrnOk26myke8MNPjciD4h+z287DmCU4aSbwBfgec5UeDC7lKxBB8eUPX29Slh0o9IeFbaaKrCmJzYufgRWYdJhHWHYAsbkguHXOEaymzQecPKOJyUIHRx8qJsVz/z+RuXDZd6lC0KzSI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980339; c=relaxed/simple; bh=OXuffjSAJJspR2BKePSZZLjPNwOGTyHREVM0tgzf9d4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tvt+Ns+dIMQjD8h42/Pq/Md/p17Ho/rh4hVrsu9iW9Rqn1FGac1zbpwa46v8PKCNNL7O+AMzOeVSGcC5M5ahlJd/9uxhMF1tvYj9IMRWmxnaeASn/voz6GlLxWaUlSYDqiWQfZEOLerz0loxnrxQcWSa9nKJL02iBg5KGOzjwZg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KxBef7SO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KxBef7SO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E690C16AAE; Fri, 13 Feb 2026 10:58:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980339; bh=OXuffjSAJJspR2BKePSZZLjPNwOGTyHREVM0tgzf9d4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KxBef7SOT2ku2iS3WOnvv5lgiPhA9QaApHHIS3DeJjUQTR/KmTSQvpb0oDdIkTi+X LkjGs+iJieLDaQFNUGD7tSm8Fzu75yV+KRhXou0KY+1rN8U1gRV8vdna3v9MltZvJj gzmEpmPlsiprCEc5Jfj+y79am3PtxAxiJ9Ip4Hsdq2rNFXs9ohZzMO3TvrFo7ms3wm 0FfDN920zegiMWs0MtQDkrLqguhYgys4vINLh0XyjhQy2+J7RBifgv9oK8XmS97i0+ F+lKBH0cTpBrd71lixzNtEcS2Sjy5BKB5GUzdQmPBxbp1tDO8Oj4iWomNNZ+hlyfKh KZ4lKR97sRzCg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 01/50] RDMA: Move DMA block iterator logic into dedicated files Date: Fri, 13 Feb 2026 12:57:37 +0200 Message-ID: <20260213-refactor-umem-v1-1-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The DMA iterator logic was mixed into verbs and umem-specific code, forcing all users to include rdma/ib_umem.h. Move the block iterator logic into iter.c and rdma/iter.h so that rdma/ib_umem.h and rdma/ib_verbs.h can be separated in a follow-up patch. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/Makefile | 2 +- drivers/infiniband/core/iter.c | 43 ++++++++++++++ drivers/infiniband/core/verbs.c | 38 ------------ drivers/infiniband/hw/bnxt_re/qplib_res.c | 2 +- drivers/infiniband/hw/cxgb4/mem.c | 2 +- drivers/infiniband/hw/efa/efa_verbs.c | 2 +- drivers/infiniband/hw/erdma/erdma_verbs.c | 2 +- drivers/infiniband/hw/hns/hns_roce_alloc.c | 2 +- drivers/infiniband/hw/ionic/ionic_ibdev.h | 2 +- drivers/infiniband/hw/irdma/main.h | 2 +- drivers/infiniband/hw/mana/mana_ib.h | 2 +- drivers/infiniband/hw/mlx4/mr.c | 1 + drivers/infiniband/hw/mlx5/mem.c | 1 + drivers/infiniband/hw/mlx5/umr.c | 1 + drivers/infiniband/hw/mthca/mthca_provider.c | 2 +- drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 2 +- drivers/infiniband/hw/qedr/verbs.c | 2 +- drivers/infiniband/hw/vmw_pvrdma/pvrdma.h | 2 +- include/rdma/ib_umem.h | 30 ---------- include/rdma/ib_verbs.h | 48 --------------- include/rdma/iter.h | 88 ++++++++++++++++++++++++= ++++ 21 files changed, 147 insertions(+), 129 deletions(-) diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Mak= efile index f483e0c12444..48922e0ede56 100644 --- a/drivers/infiniband/core/Makefile +++ b/drivers/infiniband/core/Makefile @@ -12,7 +12,7 @@ ib_core-y :=3D packer.o ud_header.o verbs.o cq.o rw.o s= ysfs.o \ roce_gid_mgmt.o mr_pool.o addr.o sa_query.o \ multicast.o mad.o smi.o agent.o mad_rmpp.o \ nldev.o restrack.o counters.o ib_core_uverbs.o \ - trace.o lag.o + trace.o lag.o iter.o =20 ib_core-$(CONFIG_SECURITY_INFINIBAND) +=3D security.o ib_core-$(CONFIG_CGROUP_RDMA) +=3D cgroup.o diff --git a/drivers/infiniband/core/iter.c b/drivers/infiniband/core/iter.c new file mode 100644 index 000000000000..8e543d100657 --- /dev/null +++ b/drivers/infiniband/core/iter.c @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. */ + +#include +#include + +void __rdma_block_iter_start(struct ib_block_iter *biter, + struct scatterlist *sglist, unsigned int nents, + unsigned long pgsz) +{ + memset(biter, 0, sizeof(struct ib_block_iter)); + biter->__sg =3D sglist; + biter->__sg_nents =3D nents; + + /* Driver provides best block size to use */ + biter->__pg_bit =3D __fls(pgsz); +} +EXPORT_SYMBOL(__rdma_block_iter_start); + +bool __rdma_block_iter_next(struct ib_block_iter *biter) +{ + unsigned int block_offset; + unsigned int delta; + + if (!biter->__sg_nents || !biter->__sg) + return false; + + biter->__dma_addr =3D sg_dma_address(biter->__sg) + biter->__sg_advance; + block_offset =3D biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1); + delta =3D BIT_ULL(biter->__pg_bit) - block_offset; + + while (biter->__sg_nents && biter->__sg && + sg_dma_len(biter->__sg) - biter->__sg_advance <=3D delta) { + delta -=3D sg_dma_len(biter->__sg) - biter->__sg_advance; + biter->__sg_advance =3D 0; + biter->__sg =3D sg_next(biter->__sg); + biter->__sg_nents--; + } + biter->__sg_advance +=3D delta; + + return true; +} +EXPORT_SYMBOL(__rdma_block_iter_next); diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verb= s.c index 02ebc3e52196..47a97797d7be 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -3154,44 +3154,6 @@ int rdma_init_netdev(struct ib_device *device, u32 p= ort_num, } EXPORT_SYMBOL(rdma_init_netdev); =20 -void __rdma_block_iter_start(struct ib_block_iter *biter, - struct scatterlist *sglist, unsigned int nents, - unsigned long pgsz) -{ - memset(biter, 0, sizeof(struct ib_block_iter)); - biter->__sg =3D sglist; - biter->__sg_nents =3D nents; - - /* Driver provides best block size to use */ - biter->__pg_bit =3D __fls(pgsz); -} -EXPORT_SYMBOL(__rdma_block_iter_start); - -bool __rdma_block_iter_next(struct ib_block_iter *biter) -{ - unsigned int block_offset; - unsigned int delta; - - if (!biter->__sg_nents || !biter->__sg) - return false; - - biter->__dma_addr =3D sg_dma_address(biter->__sg) + biter->__sg_advance; - block_offset =3D biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1); - delta =3D BIT_ULL(biter->__pg_bit) - block_offset; - - while (biter->__sg_nents && biter->__sg && - sg_dma_len(biter->__sg) - biter->__sg_advance <=3D delta) { - delta -=3D sg_dma_len(biter->__sg) - biter->__sg_advance; - biter->__sg_advance =3D 0; - biter->__sg =3D sg_next(biter->__sg); - biter->__sg_nents--; - } - biter->__sg_advance +=3D delta; - - return true; -} -EXPORT_SYMBOL(__rdma_block_iter_next); - /** * rdma_alloc_hw_stats_struct - Helper function to allocate dynamic struct * for the drivers. diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband= /hw/bnxt_re/qplib_res.c index 875d7b52c06a..64b02ea98cac 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_res.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include =20 #include "roce_hsi.h" #include "qplib_res.h" diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb= 4/mem.c index adeed7447e7b..e0ec2c4158a0 100644 --- a/drivers/infiniband/hw/cxgb4/mem.c +++ b/drivers/infiniband/hw/cxgb4/mem.c @@ -32,9 +32,9 @@ =20 #include #include -#include #include #include +#include =20 #include "iw_cxgb4.h" =20 diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/= efa/efa_verbs.c index 22d3e25c3b9d..19e3033d4ff7 100644 --- a/drivers/infiniband/hw/efa/efa_verbs.c +++ b/drivers/infiniband/hw/efa/efa_verbs.c @@ -9,9 +9,9 @@ #include =20 #include -#include #include #include +#include #include #define UVERBS_MODULE_NAME efa_ib #include diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.c b/drivers/infiniband= /hw/erdma/erdma_verbs.c index 109a3f3de911..058edc42de58 100644 --- a/drivers/infiniband/hw/erdma/erdma_verbs.c +++ b/drivers/infiniband/hw/erdma/erdma_verbs.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include =20 #include "erdma.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_alloc.c b/drivers/infiniban= d/hw/hns/hns_roce_alloc.c index 6ee911f6885b..c21004814c3c 100644 --- a/drivers/infiniband/hw/hns/hns_roce_alloc.c +++ b/drivers/infiniband/hw/hns/hns_roce_alloc.c @@ -32,7 +32,7 @@ */ =20 #include -#include +#include #include "hns_roce_device.h" =20 void hns_roce_buf_free(struct hns_roce_dev *hr_dev, struct hns_roce_buf *b= uf) diff --git a/drivers/infiniband/hw/ionic/ionic_ibdev.h b/drivers/infiniband= /hw/ionic/ionic_ibdev.h index 82fda1e3cdb6..63828240d659 100644 --- a/drivers/infiniband/hw/ionic/ionic_ibdev.h +++ b/drivers/infiniband/hw/ionic/ionic_ibdev.h @@ -4,9 +4,9 @@ #ifndef _IONIC_IBDEV_H_ #define _IONIC_IBDEV_H_ =20 -#include #include #include +#include #include =20 #include diff --git a/drivers/infiniband/hw/irdma/main.h b/drivers/infiniband/hw/ird= ma/main.h index d320d1a228b3..3d49bd57bae7 100644 --- a/drivers/infiniband/hw/irdma/main.h +++ b/drivers/infiniband/hw/irdma/main.h @@ -37,8 +37,8 @@ #include #include #include -#include #include +#include #include #include "osdep.h" #include "defs.h" diff --git a/drivers/infiniband/hw/mana/mana_ib.h b/drivers/infiniband/hw/m= ana/mana_ib.h index e447acfd2071..a7c8c0fd7019 100644 --- a/drivers/infiniband/hw/mana/mana_ib.h +++ b/drivers/infiniband/hw/mana/mana_ib.h @@ -8,7 +8,7 @@ =20 #include #include -#include +#include #include #include #include diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/m= r.c index 94464f1694d9..9b647a300eb9 100644 --- a/drivers/infiniband/hw/mlx4/mr.c +++ b/drivers/infiniband/hw/mlx4/mr.c @@ -33,6 +33,7 @@ =20 #include #include +#include =20 #include "mlx4_ib.h" =20 diff --git a/drivers/infiniband/hw/mlx5/mem.c b/drivers/infiniband/hw/mlx5/= mem.c index af321f6ef7f5..75d5b5672b5c 100644 --- a/drivers/infiniband/hw/mlx5/mem.c +++ b/drivers/infiniband/hw/mlx5/mem.c @@ -31,6 +31,7 @@ */ =20 #include +#include #include "mlx5_ib.h" =20 /* diff --git a/drivers/infiniband/hw/mlx5/umr.c b/drivers/infiniband/hw/mlx5/= umr.c index 4e562e0dd9e1..29488fba21a0 100644 --- a/drivers/infiniband/hw/mlx5/umr.c +++ b/drivers/infiniband/hw/mlx5/umr.c @@ -2,6 +2,7 @@ /* Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. */ =20 #include +#include #include "mlx5_ib.h" #include "umr.h" #include "wr.h" diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infinib= and/hw/mthca/mthca_provider.c index dd572d76866c..aa5ca5c4ff77 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -35,8 +35,8 @@ */ =20 #include -#include #include +#include #include =20 #include diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniba= nd/hw/ocrdma/ocrdma_verbs.c index 46d911fd38de..bf9211d8d130 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c @@ -45,9 +45,9 @@ #include #include #include -#include #include #include +#include #include =20 #include "ocrdma.h" diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qed= r/verbs.c index ab9bf0922979..cb06c5d894b8 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c @@ -39,9 +39,9 @@ #include #include #include -#include #include #include +#include #include =20 #include diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h b/drivers/infiniband= /hw/vmw_pvrdma/pvrdma.h index 763ddc6f25d1..23e547d4b3a7 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h @@ -53,8 +53,8 @@ #include #include #include -#include #include +#include #include =20 #include "pvrdma_ring.h" diff --git a/include/rdma/ib_umem.h b/include/rdma/ib_umem.h index 0a8e092c0ea8..ce47688dd003 100644 --- a/include/rdma/ib_umem.h +++ b/include/rdma/ib_umem.h @@ -76,36 +76,6 @@ static inline size_t ib_umem_num_pages(struct ib_umem *u= mem) return ib_umem_num_dma_blocks(umem, PAGE_SIZE); } =20 -static inline void __rdma_umem_block_iter_start(struct ib_block_iter *bite= r, - struct ib_umem *umem, - unsigned long pgsz) -{ - __rdma_block_iter_start(biter, umem->sgt_append.sgt.sgl, - umem->sgt_append.sgt.nents, pgsz); - biter->__sg_advance =3D ib_umem_offset(umem) & ~(pgsz - 1); - biter->__sg_numblocks =3D ib_umem_num_dma_blocks(umem, pgsz); -} - -static inline bool __rdma_umem_block_iter_next(struct ib_block_iter *biter) -{ - return __rdma_block_iter_next(biter) && biter->__sg_numblocks--; -} - -/** - * rdma_umem_for_each_dma_block - iterate over contiguous DMA blocks of th= e umem - * @umem: umem to iterate over - * @pgsz: Page size to split the list into - * - * pgsz must be <=3D PAGE_SIZE or computed by ib_umem_find_best_pgsz(). The - * returned DMA blocks will be aligned to pgsz and span the range: - * ALIGN_DOWN(umem->address, pgsz) to ALIGN(umem->address + umem->length, = pgsz) - * - * Performs exactly ib_umem_num_dma_blocks() iterations. - */ -#define rdma_umem_for_each_dma_block(umem, biter, pgsz) = \ - for (__rdma_umem_block_iter_start(biter, umem, pgsz); \ - __rdma_umem_block_iter_next(biter);) - #ifdef CONFIG_INFINIBAND_USER_MEM =20 struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr, diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 8bd020da7745..e1ec5a6c74e6 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -2950,22 +2950,6 @@ struct ib_client { u8 no_kverbs_req:1; }; =20 -/* - * IB block DMA iterator - * - * Iterates the DMA-mapped SGL in contiguous memory blocks aligned - * to a HW supported page size. - */ -struct ib_block_iter { - /* internal states */ - struct scatterlist *__sg; /* sg holding the current aligned block */ - dma_addr_t __dma_addr; /* unaligned DMA address of this block */ - size_t __sg_numblocks; /* ib_umem_num_dma_blocks() */ - unsigned int __sg_nents; /* number of SG entries */ - unsigned int __sg_advance; /* number of bytes to advance in sg in next st= ep */ - unsigned int __pg_bit; /* alignment of current block */ -}; - struct ib_device *_ib_alloc_device(size_t size, struct net *net); #define ib_alloc_device(drv_struct, member) = \ container_of(_ib_alloc_device(sizeof(struct drv_struct) + \ @@ -2994,38 +2978,6 @@ void ib_unregister_device_queued(struct ib_device *i= b_dev); int ib_register_client (struct ib_client *client); void ib_unregister_client(struct ib_client *client); =20 -void __rdma_block_iter_start(struct ib_block_iter *biter, - struct scatterlist *sglist, - unsigned int nents, - unsigned long pgsz); -bool __rdma_block_iter_next(struct ib_block_iter *biter); - -/** - * rdma_block_iter_dma_address - get the aligned dma address of the current - * block held by the block iterator. - * @biter: block iterator holding the memory block - */ -static inline dma_addr_t -rdma_block_iter_dma_address(struct ib_block_iter *biter) -{ - return biter->__dma_addr & ~(BIT_ULL(biter->__pg_bit) - 1); -} - -/** - * rdma_for_each_block - iterate over contiguous memory blocks of the sg l= ist - * @sglist: sglist to iterate over - * @biter: block iterator holding the memory block - * @nents: maximum number of sg entries to iterate over - * @pgsz: best HW supported page size to use - * - * Callers may use rdma_block_iter_dma_address() to get each - * blocks aligned DMA address. - */ -#define rdma_for_each_block(sglist, biter, nents, pgsz) \ - for (__rdma_block_iter_start(biter, sglist, nents, \ - pgsz); \ - __rdma_block_iter_next(biter);) - /** * ib_get_client_data - Get IB client context * @device:Device to get context for diff --git a/include/rdma/iter.h b/include/rdma/iter.h new file mode 100644 index 000000000000..19d64ef04ba9 --- /dev/null +++ b/include/rdma/iter.h @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ +/* Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. */ + +#ifndef _RDMA_ITER_H_ +#define _RDMA_ITER_H_ + +#include +#include + +/** + * IB block DMA iterator + * + * Iterates the DMA-mapped SGL in contiguous memory blocks aligned + * to a HW supported page size. + */ +struct ib_block_iter { + /* internal states */ + struct scatterlist *__sg; /* sg holding the current aligned block */ + dma_addr_t __dma_addr; /* unaligned DMA address of this block */ + size_t __sg_numblocks; /* ib_umem_num_dma_blocks() */ + unsigned int __sg_nents; /* number of SG entries */ + unsigned int __sg_advance; /* number of bytes to advance in sg in next st= ep */ + unsigned int __pg_bit; /* alignment of current block */ +}; + +void __rdma_block_iter_start(struct ib_block_iter *biter, + struct scatterlist *sglist, + unsigned int nents, + unsigned long pgsz); +bool __rdma_block_iter_next(struct ib_block_iter *biter); + +/** + * rdma_block_iter_dma_address - get the aligned dma address of the current + * block held by the block iterator. + * @biter: block iterator holding the memory block + */ +static inline dma_addr_t +rdma_block_iter_dma_address(struct ib_block_iter *biter) +{ + return biter->__dma_addr & ~(BIT_ULL(biter->__pg_bit) - 1); +} + +/** + * rdma_for_each_block - iterate over contiguous memory blocks of the sg l= ist + * @sglist: sglist to iterate over + * @biter: block iterator holding the memory block + * @nents: maximum number of sg entries to iterate over + * @pgsz: best HW supported page size to use + * + * Callers may use rdma_block_iter_dma_address() to get each + * blocks aligned DMA address. + */ +#define rdma_for_each_block(sglist, biter, nents, pgsz) \ + for (__rdma_block_iter_start(biter, sglist, nents, \ + pgsz); \ + __rdma_block_iter_next(biter);) + +static inline void __rdma_umem_block_iter_start(struct ib_block_iter *bite= r, + struct ib_umem *umem, + unsigned long pgsz) +{ + __rdma_block_iter_start(biter, umem->sgt_append.sgt.sgl, + umem->sgt_append.sgt.nents, pgsz); + biter->__sg_advance =3D ib_umem_offset(umem) & ~(pgsz - 1); + biter->__sg_numblocks =3D ib_umem_num_dma_blocks(umem, pgsz); +} + +static inline bool __rdma_umem_block_iter_next(struct ib_block_iter *biter) +{ + return __rdma_block_iter_next(biter) && biter->__sg_numblocks--; +} + +/** + * rdma_umem_for_each_dma_block - iterate over contiguous DMA blocks of th= e umem + * @umem: umem to iterate over + * @pgsz: Page size to split the list into + * + * pgsz must be <=3D PAGE_SIZE or computed by ib_umem_find_best_pgsz(). The + * returned DMA blocks will be aligned to pgsz and span the range: + * ALIGN_DOWN(umem->address, pgsz) to ALIGN(umem->address + umem->length, = pgsz) + * + * Performs exactly ib_umem_num_dma_blocks() iterations. + */ +#define rdma_umem_for_each_dma_block(umem, biter, pgsz) = \ + for (__rdma_umem_block_iter_start(biter, umem, pgsz); \ + __rdma_umem_block_iter_next(biter);) + +#endif /* _RDMA_ITER_H_ */ --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F00E5354AF1; Fri, 13 Feb 2026 10:59:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980357; cv=none; b=XflSNcBNDMEYEAtZd/crhie17cN2hfd7oukJQC5j5mciN2uCfywqRkZblrYm0YC6Arq+4VcOkJqeEQCnn06Xi3V/M1rzyUolsQ0IRJ5C1AfikYvkF0z2td+9KSnrvPyVIgGpYzy3A6i+DnPU9V3x5JpvTKjtDjPLwHfr8UUFpwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980357; c=relaxed/simple; bh=Nw1nfs0JxfKQuNIGR98010MtHYruPmZR1Tu88LU5ocY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=W8MaEREziBn2YzMqRhFXRS1jZWpFh6Q8EPEHwCS7+hf4rHpGP/HqBl3NN5xZXXE57NC13wu30fDU8zExkvwnF034DR98+rgjJ+QchUTqRwr8VvEzAhIEn2nD+kcI8KWAIItvylTsePO6MbsaLn8iKMjx3hwhLXfntzbUk2jpoz4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XvWniCXs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XvWniCXs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4550C2BC87; Fri, 13 Feb 2026 10:59:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980354; bh=Nw1nfs0JxfKQuNIGR98010MtHYruPmZR1Tu88LU5ocY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XvWniCXsC1Tq/J6MQwYtCaxC2AOUAJdOs6Ix8vqCzkTSm2jUt3oBI5PDXxyqvYK6+ RAGzFK4TBxPELdB5/FXe+cSOFypCg7PgMuviEYhJKpyitAKKKRbQXJy9zsXXoKWRFB SM+qAPmalJMA7rcPeTq5gmlew1U7XibLHunEvCch4R+b4GW2Qtwp8+6YBQwuSNDalu 13jCv6KhdfOGLWQjcUiV0/XzAz0RbWEvfGmyBhohLjcjg/64j7fs+SPRwposScXlcH pUksLU6STRFsfQR4V3H2bl9TuoaKExA1OXstK8/PlWvSMxd69MyV0S12J0v+rtWcb0 /Vb8va1tQe9SA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 02/50] RDMA/umem: Allow including ib_umem header from any location Date: Fri, 13 Feb 2026 12:57:38 +0200 Message-ID: <20260213-refactor-umem-v1-2-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Including ib_umem.h currently triggers circular dependency errors. These issues can be resolved by removing the include of ib_verbs.h, which was only needed to resolve the struct ib_device pointer. >> depmod: ERROR: Cycle detected: ib_core -> ib_uverbs -> ib_core >> depmod: ERROR: Found 2 modules in dependency cycles! make[3]: *** [scripts/Makefile.modinst:132: depmod] Error 1 make[3]: Target '__modinst' not remade because of errors. make[2]: *** [Makefile:1960: modules_install] Error 2 make[1]: *** [Makefile:248: __sub-make] Error 2 make[1]: Target 'modules_install' not remade because of errors. make: *** [Makefile:248: __sub-make] Error 2 make: Target 'modules_install' not remade because of errors. Signed-off-by: Leon Romanovsky --- include/rdma/ib_umem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/rdma/ib_umem.h b/include/rdma/ib_umem.h index ce47688dd003..084a1d9a66f3 100644 --- a/include/rdma/ib_umem.h +++ b/include/rdma/ib_umem.h @@ -10,8 +10,8 @@ #include #include #include -#include =20 +struct ib_device; struct ib_ucontext; struct ib_umem_odp; struct dma_buf_attach_ops; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 687AF3375AE; Fri, 13 Feb 2026 10:59:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980343; cv=none; b=Y676nQODG9491N1GuGHYg5kyHHlmVOtiS0DFsj0ys+Z6CHQMCClUz8YPnozdhiSL0vAzc1fK1ebT4cF2miUPi7AtUJgiq2pgtrVeKl0N9d6OKgmkVjsYCdA75m4mq2uLqO5aqb7mPDww5seEiebLlOUALdyW3KW0An10pm9hMHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980343; c=relaxed/simple; bh=jz3JOuJAEdlHIXpm9EsHibnx92bVzq0Q6O7Dk1LpG8w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HTAzDCmGEgF/ujxeWiOQJaU09CUwxWlv23sHPp2nzuMjcufA0qe5G1+QufKkZWNBQXKnY++9lQoY4PyG6rlGraqdXkY3d9zGDfRI5AyA+eAHVuZnOspsBZ9pdiMSgeVUxRbYDeSkrX9rbYr1Bljvz3BExLWGPm2zgVf7O9K8sGE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dXcK581z; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dXcK581z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4544BC116C6; Fri, 13 Feb 2026 10:59:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980343; bh=jz3JOuJAEdlHIXpm9EsHibnx92bVzq0Q6O7Dk1LpG8w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dXcK581z65PbPgTSohJwqEMUC31igLBa03AIE6Ian+zoGOfSMZANlchpyIiT89l3x ApJwW2h8Zf52A7hPh4hChvnAVkTxY9jYo5W8t43cqUZNuxZ9vSSDXfW5f/1SW41pqh 35Mvzh6tClsjpP88ymnCbjRu8DnsQLAFLqjoulJzCGjBwsjbQTiXSfz3XHABbCObXi ZGr9665mD/9wLWL0rhdodOl24mKyVy6arIwLks+45/LahLdSYRpl9Eit+uzF3SkMSU XU0ea5QRPG/sZEIayaptGPeiXty9Zyd8ICrV+TkWO2VT85G7772UUIm8bufGSg7ITr 8zC/cG95/gYjw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 03/50] RDMA/umem: Remove unnecessary includes and defines from ib_umem header Date: Fri, 13 Feb 2026 12:57:39 +0200 Message-ID: <20260213-refactor-umem-v1-3-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The ib_umem header no longer requires the removed includes or forward declarations, so drop them to reduce clutter. Signed-off-by: Leon Romanovsky --- include/rdma/ib_umem.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/include/rdma/ib_umem.h b/include/rdma/ib_umem.h index 084a1d9a66f3..c3ab11e6879f 100644 --- a/include/rdma/ib_umem.h +++ b/include/rdma/ib_umem.h @@ -7,13 +7,9 @@ #ifndef IB_UMEM_H #define IB_UMEM_H =20 -#include #include -#include =20 struct ib_device; -struct ib_ucontext; -struct ib_umem_odp; struct dma_buf_attach_ops; =20 struct ib_umem { --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C2153375AE; Fri, 13 Feb 2026 10:59:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980347; cv=none; b=DhY8nrwkZiB9etwarnk2JljI6kAkc8o5bMrNeSZYNK/Mr7PC1q6q9L2kx3GpW8H7Ffb8yVOg8DAhzHAh5VX4Zy2i+0TSZdGR8D4RRLvYXrakR5QaR2ZDtIiEajOGQN+u4ds/I1Ubk/X3ZKdzh4h7CgQBNyunXd0+IPI6PLTKqHg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980347; c=relaxed/simple; bh=Q1DCh8dQ1KaQLj3VPpwNYcjh0I8nlT+pOmgUCPDsk1w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q6mPAvIWTBb7z6k2c8hWpB1r2nNm/D1BYhwW7oqsD2M7aMowvVBNncwmjZpUnSv68YGJMfpvE7k4Dun7vS6Y+1DT1d4ULyQYY5l1krZD2fTzCC2m3jRW/IS4UJOxaRVmHpc3w69N7pgEnqR1dmRWRH+ZebcmBVZV9jva/GbgREA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cHLgrs38; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cHLgrs38" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDB99C116C6; Fri, 13 Feb 2026 10:59:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980346; bh=Q1DCh8dQ1KaQLj3VPpwNYcjh0I8nlT+pOmgUCPDsk1w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cHLgrs38oixAD3ic9buWodMVj07v8CwmVWlUK9xzVRuUPIpYvwMMeqQDl5CgzgAmG 3ibdWoHX0zaGiBKDD5umv+vV4dXytxow6NugqIPLha24Ii8jdUL0kl2tXIbHlBfXCm X7IxmuH5AGtKECjBkV8RaPhN6b5hrEj/2t+AwxKYLKu8vciX848vKp3idF3WPBMz9U 8xa0oCUFXoP+idAYuDwbSdKE5ZjQbv3IwqCV0lvRrze4vJ2euQkf1Rj1hzD4CeIdKP WG1MPYlMEOiUNjtuPxCZ8hxTn6LoUji8BzMN/sAPYvAC/Nk9FBnvvviOpULTNcQu5F 7B7AONF+e7u/w== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 04/50] RDMA/core: Promote UMEM to a core component Date: Fri, 13 Feb 2026 12:57:40 +0200 Message-ID: <20260213-refactor-umem-v1-4-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky To manage UMEM objects at the core level and reuse the existing ib_destroy_cq*() flow, move the UMEM files to be built together with ib_core. Attempting to call ib_umem_release() from verbs.c currently results in the following error: depmod: ERROR: Cycle detected: ib_core -> ib_uverbs -> ib_core depmod: ERROR: Found 2 modules in dependency cycles! verbs.c:(.text+0x250c): undefined reference to `ib_umem_release' Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Mak= efile index 48922e0ede56..ada9877d02df 100644 --- a/drivers/infiniband/core/Makefile +++ b/drivers/infiniband/core/Makefile @@ -16,6 +16,8 @@ ib_core-y :=3D packer.o ud_header.o verbs.o cq.o rw.o s= ysfs.o \ =20 ib_core-$(CONFIG_SECURITY_INFINIBAND) +=3D security.o ib_core-$(CONFIG_CGROUP_RDMA) +=3D cgroup.o +ib_core-$(CONFIG_INFINIBAND_USER_MEM) +=3D umem.o umem_dmabuf.o +ib_core-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) +=3D umem_odp.o =20 ib_cm-y :=3D cm.o cm_trace.o =20 @@ -42,5 +44,3 @@ ib_uverbs-y :=3D uverbs_main.o uverbs_cmd.o uverbs_mars= hall.o \ uverbs_std_types_wq.o \ uverbs_std_types_qp.o \ ucaps.o -ib_uverbs-$(CONFIG_INFINIBAND_USER_MEM) +=3D umem.o umem_dmabuf.o -ib_uverbs-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) +=3D umem_odp.o --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 03B3B21D3D6; Fri, 13 Feb 2026 10:59:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980351; cv=none; b=oL27bC4X4ea9zU3+mqSYlUawPXm0YH0H5np6SrXo3LN5sDiOuFchgHWdODr+3BFCuhz1tVd1Thw/xxB/q9jgLMguxUzaXpI34OprSYDuHWM175iJw6Xr5xkLZwQs5eYyxvJT9HSN+nRLQZQ+ZBeGt+h2QRq7kaU47AMTigjxzig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980351; c=relaxed/simple; bh=OblW+k4fZ/66WbbBaEPhF+RvNjNrCx26cYnmaaoJlyo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=X+6rz2iqHBPPs8FPOvX4esgcLv4/6SAvAV/QfeAkInPUXbYthVyoUAY5dA1qUbXgd56bZ89wKxSlKAXgNfViDJ991zWSaSwLB2ZzNIdY4Kv/QsxFh1AnvNnRv0xCAZZm07LOjMtjQYJv0VaIMVIX7ZwSkSeyrqTd4zTskEd/24c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VE9qRNFT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VE9qRNFT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C6717C4AF09; Fri, 13 Feb 2026 10:59:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980350; bh=OblW+k4fZ/66WbbBaEPhF+RvNjNrCx26cYnmaaoJlyo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VE9qRNFTgKqNZxAWqgts3u0Oj9GyWzzwKwS4rb4Jyz/bmJ30iaFcg6mCBXZhUc9AV HYS3Z/jGKr9zLsCojzZWshilBKiJWjDWUoB4LQGVWWRXvWZlqliXEcWgMOTFTnVIry OvV5ks927WIWQsRPFQ873T7gi1TcO+tzHRTwPc1qrum6TYPAJ5Z4FDqvBn/9K0JCyx qwmaLcZSLgTzFvKZx3DVqk4achkA7mMAdzGO25DRdSRsS2/rbdm9EPlUbY6zOX6s/v ZIbIYSAXML5oEgPL5e9q1L0TmwCrS8EfInQ+AyR9gTRmvjge7ZQACl5b0ee7gYwNUi 70X+9g5zbgXBA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 05/50] RDMA/core: Manage CQ umem in core code Date: Fri, 13 Feb 2026 12:57:41 +0200 Message-ID: <20260213-refactor-umem-v1-5-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky In the current implementation, CQ umem is handled both by ib_core and the driver. ib_core sometimes creates and destroys it, while the driver also destroys it. Store the umem in struct ib_cq and ensure that only ib_core manages its lifetime, relying solely on its internal reference counter. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/umem.c | 2 +- drivers/infiniband/core/uverbs_cmd.c | 1 + drivers/infiniband/core/uverbs_std_types_cq.c | 7 ++++++- drivers/infiniband/core/verbs.c | 2 ++ drivers/infiniband/hw/efa/efa_verbs.c | 24 +++++++++++------------- include/rdma/ib_verbs.h | 1 + 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 8137031c2a65..fc70b918f3f0 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c @@ -283,7 +283,7 @@ EXPORT_SYMBOL(ib_umem_get); */ void ib_umem_release(struct ib_umem *umem) { - if (!umem) + if (IS_ERR_OR_NULL(umem)) return; if (umem->is_dmabuf) return ib_umem_dmabuf_release(to_ib_umem_dmabuf(umem)); diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index f4616deeca54..fb19395b9f2a 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1085,6 +1085,7 @@ static int create_cq(struct uverbs_attr_bundle *attrs, return uverbs_response(attrs, &resp, sizeof(resp)); =20 err_free: + ib_umem_release(cq->umem); rdma_restrack_put(&cq->res); kfree(cq); err_file: diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infini= band/core/uverbs_std_types_cq.c index fab5d914029d..05809f9ff0f6 100644 --- a/drivers/infiniband/core/uverbs_std_types_cq.c +++ b/drivers/infiniband/core/uverbs_std_types_cq.c @@ -186,6 +186,11 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( cq->comp_handler =3D ib_uverbs_comp_handler; cq->event_handler =3D ib_uverbs_cq_event_handler; cq->cq_context =3D ev_file ? &ev_file->ev_queue : NULL; + /* + * If UMEM is not provided here, legacy drivers will set it during + * CQ creation based on their internal udata. + */ + cq->umem =3D umem; atomic_set(&cq->usecnt, 0); =20 rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); @@ -206,7 +211,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( return ret; =20 err_free: - ib_umem_release(umem); + ib_umem_release(cq->umem); rdma_restrack_put(&cq->res); kfree(cq); err_event_file: diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verb= s.c index 47a97797d7be..ad48d2458a3f 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include =20 @@ -2249,6 +2250,7 @@ int ib_destroy_cq_user(struct ib_cq *cq, struct ib_ud= ata *udata) if (ret) return ret; =20 + ib_umem_release(cq->umem); rdma_restrack_del(&cq->res); kfree(cq); return ret; diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/= efa/efa_verbs.c index 19e3033d4ff7..ae9b98b4b528 100644 --- a/drivers/infiniband/hw/efa/efa_verbs.c +++ b/drivers/infiniband/hw/efa/efa_verbs.c @@ -1083,15 +1083,14 @@ int efa_destroy_cq(struct ib_cq *ibcq, struct ib_ud= ata *udata) cq->cq_idx, cq->cpu_addr, cq->size, &cq->dma_addr); =20 efa_destroy_cq_idx(dev, cq->cq_idx); - efa_cq_user_mmap_entries_remove(cq); + if (cq->cpu_addr) + efa_cq_user_mmap_entries_remove(cq); if (cq->eq) { xa_erase(&dev->cqs_xa, cq->cq_idx); synchronize_irq(cq->eq->irq.irqn); } =20 - if (cq->umem) - ib_umem_release(cq->umem); - else + if (cq->cpu_addr) efa_free_mapped(dev, cq->cpu_addr, cq->dma_addr, cq->size, DMA_FROM_DEVI= CE); return 0; } @@ -1212,22 +1211,20 @@ int efa_create_cq_umem(struct ib_cq *ibcq, const st= ruct ib_cq_init_attr *attr, cq->ucontext =3D ucontext; cq->size =3D PAGE_ALIGN(cmd.cq_entry_size * entries * cmd.num_sub_cqs); =20 - if (umem) { - if (umem->length < cq->size) { + if (ibcq->umem) { + if (ibcq->umem->length < cq->size) { ibdev_dbg(&dev->ibdev, "External memory too small\n"); err =3D -EINVAL; goto err_out; } =20 - if (!ib_umem_is_contiguous(umem)) { + if (!ib_umem_is_contiguous(ibcq->umem)) { ibdev_dbg(&dev->ibdev, "Non contiguous CQ unsupported\n"); err =3D -EINVAL; goto err_out; } =20 - cq->cpu_addr =3D NULL; - cq->dma_addr =3D ib_umem_start_dma_addr(umem); - cq->umem =3D umem; + cq->dma_addr =3D ib_umem_start_dma_addr(ibcq->umem); } else { cq->cpu_addr =3D efa_zalloc_mapped(dev, &cq->dma_addr, cq->size, DMA_FROM_DEVICE); @@ -1259,7 +1256,7 @@ int efa_create_cq_umem(struct ib_cq *ibcq, const stru= ct ib_cq_init_attr *attr, cq->ibcq.cqe =3D result.actual_depth; WARN_ON_ONCE(entries !=3D result.actual_depth); =20 - if (!umem) + if (cq->cpu_addr) err =3D cq_mmap_entries_setup(dev, cq, &resp, result.db_valid); =20 if (err) { @@ -1296,11 +1293,12 @@ int efa_create_cq_umem(struct ib_cq *ibcq, const st= ruct ib_cq_init_attr *attr, if (cq->eq) xa_erase(&dev->cqs_xa, cq->cq_idx); err_remove_mmap: - efa_cq_user_mmap_entries_remove(cq); + if (cq->cpu_addr) + efa_cq_user_mmap_entries_remove(cq); err_destroy_cq: efa_destroy_cq_idx(dev, cq->cq_idx); err_free_mapped: - if (!umem) + if (cq->cpu_addr) efa_free_mapped(dev, cq->cpu_addr, cq->dma_addr, cq->size, DMA_FROM_DEVICE); err_out: diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index e1ec5a6c74e6..b1e34fd2ed5f 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1649,6 +1649,7 @@ struct ib_cq { u8 interrupt:1; u8 shared:1; unsigned int comp_vector; + struct ib_umem *umem; =20 /* * Implementation details of the RDMA core, don't use in drivers: --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B18A352921; Fri, 13 Feb 2026 10:59:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980369; cv=none; b=M6YiApUcIUKnB0BHTrGhhkas4GKHPzLZrfxLEPShN/n/00/Iep8fSu+rvicEBaeuOPNtqjIihS0ggZrogsHgnXv8XXsunus2X+L+IMVNPOKHZejhnw9MNKQicfgOYUt1Dd7QE2Aju5sz+thKWWG9YgoJBfwyvjzSKOtJpOnSlqk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980369; c=relaxed/simple; bh=i/qKvrjNfvmFI1sFm/qwVSuao4YeuySQMuQRd70krlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bt6suvXGAATiDwGxwkaVsskQkIVI+0/BhjtKbwMZd52wKy1t4dYWsVWefvaKudxXg7xW4R0WRCVj3QUVBHfT44ns5WuIOxoeyiNw7Zw2BQxDe/nQ7YmCvfqa06LbnCgbyxJ4N6syeA8tQJM/FEoT6VZh6v2cTukbee9NKinPvnc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VKXiziMZ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VKXiziMZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4DCD2C116C6; Fri, 13 Feb 2026 10:59:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980369; bh=i/qKvrjNfvmFI1sFm/qwVSuao4YeuySQMuQRd70krlo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VKXiziMZYUNuGfCQ0RULIqDte/ZGcOWiRPBH84iwuWflzmGecugR/bfnatOMUSehV fVLtP8JQ+333JomO+2dkf4vdI4/vn/IgNGR0aGDqoLPcYovkOZKa9pmiECk2V47aN3 VSADKx5ijPiFho1qXXXHq7s2Vh5E+H7SKWWZkLTOPyEDwW8zRNFc5G7FQrhMdezaU+ LHP9mn4ATVmhFM0u/Q4i35r03D4z9Yj5QQWp2k7NkAHc7fETVSOvY0LaSv5wK2uksa fHmy/Ctd60nrAYatFEddhV2R5/U3UBYX6KHEThdswPFFxbBQYuGUSEnQplzxN8ye0K ZZo6BNUEwCfsw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: =?utf-8?q?=5BPATCH_rdma-next_06/50=5D_RDMA/efa=3A_Rely_on_CPU_ad?= =?utf-8?q?dress_in_create=E2=80=91QP?= Date: Fri, 13 Feb 2026 12:57:42 +0200 Message-ID: <20260213-refactor-umem-v1-6-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Align this code with other locations where efa_free_mapped() depends on the presence of a valid CPU address, which is guaranteed when qp->rq_size !=3D = 0. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/efa/efa_verbs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/= efa/efa_verbs.c index ae9b98b4b528..bc69aef3e436 100644 --- a/drivers/infiniband/hw/efa/efa_verbs.c +++ b/drivers/infiniband/hw/efa/efa_verbs.c @@ -579,7 +579,7 @@ static int qp_mmap_entries_setup(struct efa_qp *qp, =20 resp->llq_desc_offset &=3D ~PAGE_MASK; =20 - if (qp->rq_size) { + if (qp->rq_cpu_addr) { address =3D dev->db_bar_addr + resp->rq_db_offset; =20 qp->rq_db_mmap_entry =3D @@ -828,7 +828,7 @@ int efa_create_qp(struct ib_qp *ibqp, struct ib_qp_init= _attr *init_attr, err_destroy_qp: efa_destroy_qp_handle(dev, create_qp_resp.qp_handle); err_free_mapped: - if (qp->rq_size) + if (qp->rq_cpu_addr) efa_free_mapped(dev, qp->rq_cpu_addr, qp->rq_dma_addr, qp->rq_size, DMA_TO_DEVICE); err_out: --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7820B355020; Fri, 13 Feb 2026 10:59:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980358; cv=none; b=SHNpR6b2gNStTvKAPuM5LYAjSiypq0fQu6A7CDtrshOZh42Jt9PvX9xQ0Ded6APQtcnsXYHhpI+vg4T6GCbVNS83YFWNRnCngLPCERDx4dhh0rX25k9rL4CTdwG0NfITheqQ9jojn/hym5uF+sF8boNqz26O6EetgvfExIHy2EQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980358; c=relaxed/simple; bh=rYH5HyXwxD1symtbsN1uVQMrg094hCT9fjaacofZLOU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=H2OkevspTptj1qS7H2FfjOXo+ZCwVHzokkw0n/l1157b6aSQHAXNHZdPzVkVOze6TRHbm+czn9oo17Uv5dXJxtE8NmADQG0W5rJuA0hDn7f8EdDMaI0NlW7HZed64C7Z+vWC0zspJrGjJUJ3/68h6rqoiCJiKwCjsKp3jpFvfU8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n8sM4rSO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="n8sM4rSO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 42A23C4AF09; Fri, 13 Feb 2026 10:59:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980358; bh=rYH5HyXwxD1symtbsN1uVQMrg094hCT9fjaacofZLOU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n8sM4rSOdUEG/M/TzshrL//oLw9vpCl3qfAS22do1sFm1/4LsvdEbGuLp2E8soZQP eHpBcGk77UTEX20+baIr9Kt3IYmavuj3jt8IokEMSCeSby9OdBAUbe+VnR1FFUCNU6 hqDaXeV/jr/rvOPNSQlHj0PxEk5pQSgLQdF+tT8kMW+WV+wq1xQYLoxBfw3JjpOZr9 ZPrWBAoDD50DuAwjn0vlS7NWeEtHsZOvbMKy76W3XtMfyNkvUahIZQj0z/zfQs9sIW QpBaQSkdTl9EIne/MFn1U8oaocPRBgmMqwlpnTvZj9cueHzb/ZkkepCkEN/McYFZlJ tuq7/N5VBAAUw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 07/50] RDMA/core: Prepare create CQ path for API unification Date: Fri, 13 Feb 2026 12:57:43 +0200 Message-ID: <20260213-refactor-umem-v1-7-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Ensure that .create_cq_umem() and .create_cq() follow the same API contract, allowing drivers to be gradually migrated to the umem-aware CQ management flow. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/device.c | 2 +- drivers/infiniband/core/uverbs_cmd.c | 5 ++++- drivers/infiniband/core/uverbs_std_types_cq.c | 16 +++++++++++----- drivers/infiniband/core/verbs.c | 6 +++++- drivers/infiniband/hw/efa/efa.h | 6 ++---- drivers/infiniband/hw/efa/efa_main.c | 3 +-- drivers/infiniband/hw/efa/efa_verbs.c | 10 ++-------- include/rdma/ib_verbs.h | 3 +-- 8 files changed, 27 insertions(+), 24 deletions(-) diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/dev= ice.c index 4e09f6e0995e..9209b8c664ef 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -2701,7 +2701,7 @@ void ib_set_device_ops(struct ib_device *dev, const s= truct ib_device_ops *ops) SET_DEVICE_OP(dev_ops, create_ah); SET_DEVICE_OP(dev_ops, create_counters); SET_DEVICE_OP(dev_ops, create_cq); - SET_DEVICE_OP(dev_ops, create_cq_umem); + SET_DEVICE_OP(dev_ops, create_user_cq); SET_DEVICE_OP(dev_ops, create_flow); SET_DEVICE_OP(dev_ops, create_qp); SET_DEVICE_OP(dev_ops, create_rwq_ind_table); diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index fb19395b9f2a..c7be592f60e8 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1068,7 +1068,10 @@ static int create_cq(struct uverbs_attr_bundle *attr= s, rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); rdma_restrack_set_name(&cq->res, NULL); =20 - ret =3D ib_dev->ops.create_cq(cq, &attr, attrs); + if (ib_dev->ops.create_user_cq) + ret =3D ib_dev->ops.create_user_cq(cq, &attr, attrs); + else + ret =3D ib_dev->ops.create_cq(cq, &attr, attrs); if (ret) goto err_free; rdma_restrack_add(&cq->res); diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infini= band/core/uverbs_std_types_cq.c index 05809f9ff0f6..b999d8d62694 100644 --- a/drivers/infiniband/core/uverbs_std_types_cq.c +++ b/drivers/infiniband/core/uverbs_std_types_cq.c @@ -78,7 +78,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( int buffer_fd; int ret; =20 - if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_cq_umem) || !ib_dev->o= ps.destroy_cq) + if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_user_cq) || + !ib_dev->ops.destroy_cq) return -EOPNOTSUPP; =20 ret =3D uverbs_copy_from(&attr.comp_vector, attrs, @@ -130,7 +131,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( =20 if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD) || uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET) || - !ib_dev->ops.create_cq_umem) { + !ib_dev->ops.create_user_cq) { ret =3D -EINVAL; goto err_event_file; } @@ -155,7 +156,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( goto err_event_file; =20 if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA) || - !ib_dev->ops.create_cq_umem) { + !ib_dev->ops.create_user_cq) { ret =3D -EINVAL; goto err_event_file; } @@ -196,11 +197,16 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); rdma_restrack_set_name(&cq->res, NULL); =20 - ret =3D umem ? ib_dev->ops.create_cq_umem(cq, &attr, umem, attrs) : - ib_dev->ops.create_cq(cq, &attr, attrs); + if (ib_dev->ops.create_user_cq) + ret =3D ib_dev->ops.create_user_cq(cq, &attr, attrs); + else + ret =3D ib_dev->ops.create_cq(cq, &attr, attrs); if (ret) goto err_free; =20 + /* Check that driver didn't overrun existing umem */ + WARN_ON(umem && cq->umem !=3D umem); + obj->uevent.uobject.object =3D cq; obj->uevent.uobject.user_handle =3D user_handle; rdma_restrack_add(&cq->res); diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verb= s.c index ad48d2458a3f..d0880346ebe2 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -2204,7 +2204,6 @@ struct ib_cq *__ib_create_cq(struct ib_device *device, return ERR_PTR(-ENOMEM); =20 cq->device =3D device; - cq->uobject =3D NULL; cq->comp_handler =3D comp_handler; cq->event_handler =3D event_handler; cq->cq_context =3D cq_context; @@ -2219,6 +2218,11 @@ struct ib_cq *__ib_create_cq(struct ib_device *devic= e, kfree(cq); return ERR_PTR(ret); } + /* + * We are in kernel verbs flow and drivers are not allowed + * to set umem pointer, it needs to stay NULL. + */ + WARN_ON_ONCE(cq->umem); =20 rdma_restrack_add(&cq->res); return cq; diff --git a/drivers/infiniband/hw/efa/efa.h b/drivers/infiniband/hw/efa/ef= a.h index 96f9c3bc98b2..00b19f2ba3da 100644 --- a/drivers/infiniband/hw/efa/efa.h +++ b/drivers/infiniband/hw/efa/efa.h @@ -161,10 +161,8 @@ int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata= *udata); int efa_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr, struct ib_udata *udata); int efa_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); -int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs); -int efa_create_cq_umem(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, - struct ib_umem *umem, struct uverbs_attr_bundle *attrs); +int efa_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, + struct uverbs_attr_bundle *attrs); struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length, u64 virt_addr, int access_flags, struct ib_dmah *dmah, diff --git a/drivers/infiniband/hw/efa/efa_main.c b/drivers/infiniband/hw/e= fa/efa_main.c index 6c415b9adb5f..a1d68dc49e45 100644 --- a/drivers/infiniband/hw/efa/efa_main.c +++ b/drivers/infiniband/hw/efa/efa_main.c @@ -371,8 +371,7 @@ static const struct ib_device_ops efa_dev_ops =3D { .alloc_hw_device_stats =3D efa_alloc_hw_device_stats, .alloc_pd =3D efa_alloc_pd, .alloc_ucontext =3D efa_alloc_ucontext, - .create_cq =3D efa_create_cq, - .create_cq_umem =3D efa_create_cq_umem, + .create_user_cq =3D efa_create_user_cq, .create_qp =3D efa_create_qp, .create_user_ah =3D efa_create_ah, .dealloc_pd =3D efa_dealloc_pd, diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/= efa/efa_verbs.c index bc69aef3e436..d465e6acfe3c 100644 --- a/drivers/infiniband/hw/efa/efa_verbs.c +++ b/drivers/infiniband/hw/efa/efa_verbs.c @@ -1130,8 +1130,8 @@ static int cq_mmap_entries_setup(struct efa_dev *dev,= struct efa_cq *cq, return 0; } =20 -int efa_create_cq_umem(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, - struct ib_umem *umem, struct uverbs_attr_bundle *attrs) +int efa_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct efa_ucontext *ucontext =3D rdma_udata_to_drv_context( @@ -1306,12 +1306,6 @@ int efa_create_cq_umem(struct ib_cq *ibcq, const str= uct ib_cq_init_attr *attr, return err; } =20 -int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) -{ - return efa_create_cq_umem(ibcq, attr, NULL, attrs); -} - static int umem_to_page_list(struct efa_dev *dev, struct ib_umem *umem, u64 *page_list, diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index b1e34fd2ed5f..67aa5fc2c0b7 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -2529,9 +2529,8 @@ struct ib_device_ops { int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata); int (*create_cq)(struct ib_cq *cq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); - int (*create_cq_umem)(struct ib_cq *cq, + int (*create_user_cq)(struct ib_cq *cq, const struct ib_cq_init_attr *attr, - struct ib_umem *umem, struct uverbs_attr_bundle *attrs); int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period); int (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata); --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A04D35292B; Fri, 13 Feb 2026 10:59:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980362; cv=none; b=PbCOJ42LkQB2XRKCrYLVF8fKbuCq76QML4UaxWs6HWfnYE8J+5P6DMRGs2cTYE0U85pIRxFbtyBTpNdjVq/HDbYEk6StwwXVOeV6cryvWY8XjV5n/dHVEaSgIDIGL5kd2Wbv+GiKlSVBG7gUHohKlKydbfMsoq+auWVMMTnp/GY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980362; c=relaxed/simple; bh=ZILxVEto2dj+Iffa0Sa1Wb70T82yzlvYw9kGejs6jBw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=c5yWmNfTmqj3PZaBp4XVWYVUWwncAdnHz76yGiJki6abNKjhuLyBOGezCGnuep/S3Gr5JTFKEfqBq5FgNKlm7NqXz4Mqg+7If1aGL3LoeSH6nVJRpxWrwkJgIv7Ggd6Jb4d29T1dalarINAz1rIqTgUMNoFZW5xinrXCEqJkHoU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fTwv9NGD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fTwv9NGD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F05CEC19424; Fri, 13 Feb 2026 10:59:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980361; bh=ZILxVEto2dj+Iffa0Sa1Wb70T82yzlvYw9kGejs6jBw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fTwv9NGDFfVLOYoBNBJOs+KZpr8/U1GDQ1r7U98CpZCpf/Lr/e/YHay2cCb8lGwK+ QSEkenAemqrc3AhuytwHLzSP9qgWxKZOOMTjp0cXPoWI7LddISHaQgk/4Af+h9BEBv SUABRjCsF9DwOumCW3rclXWW1pfVBndubJKGZvw4ARvURMZAVwzKU+APxnUx/gfzka Bm9jN2rKuRbiFsJH7lL4F+YLNWRSsHBoOHTcen1XXOjhuCn1RnDrmHX4mMsMyvXRqL UEvrbADxyFpjJJO3XCbmK2H/ZIN4iVYKt7Mv4wZszKK333eFdxeiqxAh+C80mPkOmP zswM2t4SfIGZw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 08/50] RDMA/core: Reject zero CQE count Date: Fri, 13 Feb 2026 12:57:44 +0200 Message-ID: <20260213-refactor-umem-v1-8-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky All drivers already ensure that the number of CQEs is at least 1. Add this validation to the core so drivers no longer need to repeat it. Future patches converting to the .create_user_cq() interface will remove the per=E2=80=91driver checks. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/cq.c | 3 +++ drivers/infiniband/core/uverbs_cmd.c | 3 +++ drivers/infiniband/core/uverbs_std_types_cq.c | 15 +++++++++------ drivers/infiniband/core/verbs.c | 3 +++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c index 584537c71545..7e0b54ec4141 100644 --- a/drivers/infiniband/core/cq.c +++ b/drivers/infiniband/core/cq.c @@ -220,6 +220,9 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void= *private, int nr_cqe, struct ib_cq *cq; int ret =3D -ENOMEM; =20 + if (WARN_ON_ONCE(!nr_cqe)) + return ERR_PTR(-EINVAL); + cq =3D rdma_zalloc_drv_obj(dev, ib_cq); if (!cq) return ERR_PTR(ret); diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index c7be592f60e8..041bed7a43b4 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1032,6 +1032,9 @@ static int create_cq(struct uverbs_attr_bundle *attrs, if (cmd->comp_vector >=3D attrs->ufile->device->num_comp_vectors) return -EINVAL; =20 + if (!cmd->cqe) + return -EINVAL; + obj =3D (struct ib_ucq_object *)uobj_alloc(UVERBS_OBJECT_CQ, attrs, &ib_dev); if (IS_ERR(obj)) diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infini= band/core/uverbs_std_types_cq.c index b999d8d62694..d2c8f71f934c 100644 --- a/drivers/infiniband/core/uverbs_std_types_cq.c +++ b/drivers/infiniband/core/uverbs_std_types_cq.c @@ -84,12 +84,15 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( =20 ret =3D uverbs_copy_from(&attr.comp_vector, attrs, UVERBS_ATTR_CREATE_CQ_COMP_VECTOR); - if (!ret) - ret =3D uverbs_copy_from(&attr.cqe, attrs, - UVERBS_ATTR_CREATE_CQ_CQE); - if (!ret) - ret =3D uverbs_copy_from(&user_handle, attrs, - UVERBS_ATTR_CREATE_CQ_USER_HANDLE); + if (ret) + return ret; + + ret =3D uverbs_copy_from(&attr.cqe, attrs, UVERBS_ATTR_CREATE_CQ_CQE); + if (ret || !attr.cqe) + return ret ? : -EINVAL; + + ret =3D uverbs_copy_from(&user_handle, attrs, + UVERBS_ATTR_CREATE_CQ_USER_HANDLE); if (ret) return ret; =20 diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verb= s.c index d0880346ebe2..9d075eeda463 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -2203,6 +2203,9 @@ struct ib_cq *__ib_create_cq(struct ib_device *device, if (!cq) return ERR_PTR(-ENOMEM); =20 + if (WARN_ON_ONCE(!cq_attr->cqe)) + return ERR_PTR(-EINVAL); + cq->device =3D device; cq->comp_handler =3D comp_handler; cq->event_handler =3D event_handler; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A94A43542C3; Fri, 13 Feb 2026 10:59:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980365; cv=none; b=NU95e2QKCGVWdyqKdXVz9XDsDQXvgSUoz1rOW5ooYgAhBztni+I6XSK83v5agW3E9LqB74qaKExaNNNGCb3DK8VRgUpCRRxM0d93Q+63H3HH3Q4HN1Oeb0eiVx2/HQPDqu6myJWZ00W9co8YksmnpxmsHuvmkNtvY3XNG9UpLVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980365; c=relaxed/simple; bh=1ErXtXjMtbxeTxtvFK/BCqEq2E/Df+Cbp/EEhtbCYwY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lXZwvAygOEmnguoUqAa32dcXOHi7fLS/42+gVeqH0B7N7u8/cfihLmSz3zv3XWuGGpNnEzb13x9qFUy+mRXaH+RiRQYb5gE/4CW6y4fwvP4boiofD9DLUfEWJ3gFTZzGrh084A/kP08jmWCs6krPyjklntQ2GcaPirZrLJr4Hc4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JWRlqrA+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JWRlqrA+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 793ACC19423; Fri, 13 Feb 2026 10:59:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980365; bh=1ErXtXjMtbxeTxtvFK/BCqEq2E/Df+Cbp/EEhtbCYwY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JWRlqrA+hjIuJXjGlavduge9xrmc9R6N4iPtT+JKX9L3u1qXXfFnsiwXZlG6KcbpW NjQMkF5wczKXvUHw4zrur1PefrhSyzQzgN5IzJTdHZigfnG9MvDd3z2BVqBOO1SnVj W4MWypDpp7jPAwpqvCzUcrudHfpeg/DLXjRQNKNKNoqTThJhVeT5UyIzzS5EL/F9r1 tCVGg+lG+JbLXkGDoSDxpX+QKbMntxcmgI2WPCvzTrYxJDWwjFeo6IJQnA0dAXZt3Q Pyq6acssg/uhjzaYODOW4S0g2lnAPIPIRarIjAMHzBzLN0XDIx7eEB6fw50tEBM/rY KAhsemOP1NIQw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 09/50] RDMA/efa: Remove check for zero CQE count Date: Fri, 13 Feb 2026 12:57:45 +0200 Message-ID: <20260213-refactor-umem-v1-9-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Since ib_core now handles validation, the device driver no longer needs to verify that the CQE count is non=E2=80=91zero. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/efa/efa_verbs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/= efa/efa_verbs.c index d465e6acfe3c..e8fb99b61be8 100644 --- a/drivers/infiniband/hw/efa/efa_verbs.c +++ b/drivers/infiniband/hw/efa/efa_verbs.c @@ -1152,9 +1152,9 @@ int efa_create_user_cq(struct ib_cq *ibcq, const stru= ct ib_cq_init_attr *attr, if (attr->flags) return -EOPNOTSUPP; =20 - if (entries < 1 || entries > dev->dev_attr.max_cq_depth) { + if (entries > dev->dev_attr.max_cq_depth) { ibdev_dbg(ibdev, - "cq: requested entries[%u] non-positive or greater than max[%u]\n", + "cq: requested entries[%u] greater than max[%u]\n", entries, dev->dev_attr.max_cq_depth); err =3D -EINVAL; goto err_out; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 456F83559DA; Fri, 13 Feb 2026 10:59:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980377; cv=none; b=W1L6C/7G7GpCDUPZVPLSwt3Hv/byfx2PTw+luKRDpwcjR01B8KSrSuu75+Xzdtmxknx67nuQ47fKhruFutTO4ZNPPGMnWDxTuGCt2C3Y48xdWw35j8KSSd0WTWUzC+YNPzQwe3uUQzUMVbHGI29mLxeIdEXGtMPI4MxGrWFQe3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980377; c=relaxed/simple; bh=2cJ/2G3yJQf9uq5dUHoj/dBMQbpJF7L8DGWnhKjqzU4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=p+1tz0gNBYzsRGlPc6koekOZdC7hQcHPBvBUiAjRDWeyQE6rZ865biKLlJh8Zst0UA72dyk8vcF+Vxb+OcaGxQyNPVNuXF0i1ScZ0OtygTQ27taAfrkHEVcCAcCgOTdJM7uyL7jFWk5zJUKCyDiwaE44U6a8X1FspTH3iOiID+k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nRl5BlrG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nRl5BlrG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0CCAC116C6; Fri, 13 Feb 2026 10:59:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980376; bh=2cJ/2G3yJQf9uq5dUHoj/dBMQbpJF7L8DGWnhKjqzU4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nRl5BlrGaVvfG9Cs/mFmkYuol0KmH1YCBzQihNoDehDGG+6r52y6mgyuylyp2FEl1 99NZdX2hpBtynHOabD/lDnglkRV8Oju9SZ7yB4pXPehEjdQ/Q2hoFgR7jiQ1QEJxar rH7X1tbWeNEUmIeljKaq/EzK3EYTZXx6TcmiC7d7TDdSBgeLsLWOScCF54tGiZ4nDS /J3Iqz3DGprT3qYTBjVCD5KbgQrb0FuO0q24BwQwlx8NQUSAs1nmEppuUME5xLnVaQ T/VVcFSubN5AAw6r9UfBoEZe9LtQ0oTDwq3fi7eo6KzTy0F8XU00+oWgYXYYEswTwT p8cPEBu3sHpOA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 10/50] RDMA/mlx5: Save 4 bytes in CQ structure Date: Fri, 13 Feb 2026 12:57:46 +0200 Message-ID: <20260213-refactor-umem-v1-10-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There is no need to maintain separate, nearly empty create_flags and private_flags fields. Unifying them reduces memory usage. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 5 +++-- drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 +- drivers/infiniband/hw/mlx5/qp.c | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index 651d76bca114..1b4290166e87 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -983,7 +983,8 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, spin_lock_init(&cq->lock); cq->resize_buf =3D NULL; cq->resize_umem =3D NULL; - cq->create_flags =3D attr->flags; + if (attr->flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) + cq->private_flags |=3D MLX5_IB_CQ_PR_TIMESTAMP_COMPLETION; INIT_LIST_HEAD(&cq->list_send_qp); INIT_LIST_HEAD(&cq->list_recv_qp); =20 @@ -1017,7 +1018,7 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, MLX5_SET(cqc, cqc, uar_page, index); MLX5_SET(cqc, cqc, c_eqn_or_apu_element, eqn); MLX5_SET64(cqc, cqc, dbr_addr, cq->db.dma); - if (cq->create_flags & IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN) + if (attr->flags & IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN) MLX5_SET(cqc, cqc, oi, 1); =20 if (udata) { diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/m= lx5/mlx5_ib.h index 4f4114d95130..ce3372aea48b 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -561,6 +561,7 @@ struct mlx5_ib_cq_buf { enum mlx5_ib_cq_pr_flags { MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD =3D 1 << 0, MLX5_IB_CQ_PR_FLAGS_REAL_TIME_TS =3D 1 << 1, + MLX5_IB_CQ_PR_TIMESTAMP_COMPLETION =3D 1 << 2, }; =20 struct mlx5_ib_cq { @@ -581,7 +582,6 @@ struct mlx5_ib_cq { int cqe_size; struct list_head list_send_qp; struct list_head list_recv_qp; - u32 create_flags; struct list_head wc_list; enum ib_cq_notify_flags notify_flags; struct work_struct notify_work; diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/q= p.c index 0324909e3151..7af09e668c4c 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -1274,7 +1274,7 @@ static int get_ts_format(struct mlx5_ib_dev *dev, str= uct mlx5_ib_cq *cq, } return MLX5_TIMESTAMP_FORMAT_REAL_TIME; } - if (cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) { + if (cq->private_flags & MLX5_IB_CQ_PR_TIMESTAMP_COMPLETION) { if (!fr_sup) { mlx5_ib_dbg(dev, "Free running TS format is not supported\n"); --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F0FA32C924; Fri, 13 Feb 2026 10:59:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980373; cv=none; b=CGeTkmcq5kJI0VG0wB2V9zI9Lf0UQEK8cbDRmrYlgIFbu1oZmf6W9KnZejcVfNhYhyb4V2v8y0zRFBpNDzTMweiZ4jzhVdlW4PdKBtTLHO9scxipAiLs0DZubH99E3abIDpV9fQ7G9MmAGaYCZqqTzZcK9K2wx9P7GkTuIh/8vE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980373; c=relaxed/simple; bh=60pBjLgyboHd3chw+dOmTg8slowfyyIq1cBDoIGl9YQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Gh5tDKzcnBggCcAf3tA2DbVtyXKGrC4DQa1cxVlM6xL5Wh/SvMPtTp7h946vSNFWpLZsxHLiWVZ2XApsbc01Mgu3PwOqR6Uuv/X8Zy3Y25wvcUgkEmyRW0VDRnBCXLl6iDt5HyGlxRD1yuuGFhxmqMXBP6mEaE69Z39U2gIJHEQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q72EEKBc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Q72EEKBc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56216C116C6; Fri, 13 Feb 2026 10:59:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980373; bh=60pBjLgyboHd3chw+dOmTg8slowfyyIq1cBDoIGl9YQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q72EEKBcADy6oOsvCnhYXIRmuV8O5u/uD5csUGS1ZSsCCecFJqx2ybun50/nzbDKw 0yB9TAjOVHrAnPh3SBcK+j1VB1ufYh32oHgVVI5oowKtwcidPP5KR15apM3NP0JAwh Tp5AoKo5OzX5ImYDMreAfmHSg/WbLUCeCa8NufXMvxlZRiGjUt5lVEnJCpm6y2Cw2W we/pcBDFUZxpAcilARq/rrPHF/lSpy7l0YX+XLlRxLHqZtzOnSOaPAxldReJrDEAfM w1aWGUGpnMWYIGcYl+bvvoI3XVH/hbaecyKSehc9uJ4CWohq4vr0M9xjamN86BpZg8 l5VQBJemJ9MPw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 11/50] RDMA/mlx5: Provide a modern CQ creation interface Date: Fri, 13 Feb 2026 12:57:47 +0200 Message-ID: <20260213-refactor-umem-v1-11-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The uverbs CQ creation UAPI allows users to supply their own umem for a CQ. Update mlx5 to support this workflow while preserving support for creating umem through the legacy interface. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 154 +++++++++++++++++++++++--------= ---- drivers/infiniband/hw/mlx5/main.c | 1 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 3 + 3 files changed, 107 insertions(+), 51 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index 1b4290166e87..52a435efd0de 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -749,16 +749,15 @@ static int create_cq_user(struct mlx5_ib_dev *dev, st= ruct ib_udata *udata, =20 *cqe_size =3D ucmd.cqe_size; =20 - cq->buf.umem =3D - ib_umem_get(&dev->ib_dev, ucmd.buf_addr, - entries * ucmd.cqe_size, IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(cq->buf.umem)) { - err =3D PTR_ERR(cq->buf.umem); - return err; - } + if (!cq->ibcq.umem) + cq->ibcq.umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, + entries * ucmd.cqe_size, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(cq->ibcq.umem)) + return PTR_ERR(cq->ibcq.umem); =20 page_size =3D mlx5_umem_find_best_cq_quantized_pgoff( - cq->buf.umem, cqc, log_page_size, MLX5_ADAPTER_PAGE_SHIFT, + cq->ibcq.umem, cqc, log_page_size, MLX5_ADAPTER_PAGE_SHIFT, page_offset, 64, &page_offset_quantized); if (!page_size) { err =3D -EINVAL; @@ -769,12 +768,12 @@ static int create_cq_user(struct mlx5_ib_dev *dev, st= ruct ib_udata *udata, if (err) goto err_umem; =20 - ncont =3D ib_umem_num_dma_blocks(cq->buf.umem, page_size); + ncont =3D ib_umem_num_dma_blocks(cq->ibcq.umem, page_size); mlx5_ib_dbg( dev, "addr 0x%llx, size %u, npages %zu, page_size %lu, ncont %d\n", ucmd.buf_addr, entries * ucmd.cqe_size, - ib_umem_num_pages(cq->buf.umem), page_size, ncont); + ib_umem_num_pages(cq->ibcq.umem), page_size, ncont); =20 *inlen =3D MLX5_ST_SZ_BYTES(create_cq_in) + MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) * ncont; @@ -785,7 +784,7 @@ static int create_cq_user(struct mlx5_ib_dev *dev, stru= ct ib_udata *udata, } =20 pas =3D (__be64 *)MLX5_ADDR_OF(create_cq_in, *cqb, pas); - mlx5_ib_populate_pas(cq->buf.umem, page_size, pas, 0); + mlx5_ib_populate_pas(cq->ibcq.umem, page_size, pas, 0); =20 cqc =3D MLX5_ADDR_OF(create_cq_in, *cqb, cq_context); MLX5_SET(cqc, cqc, log_page_size, @@ -858,7 +857,7 @@ static int create_cq_user(struct mlx5_ib_dev *dev, stru= ct ib_udata *udata, mlx5_ib_db_unmap_user(context, &cq->db); =20 err_umem: - ib_umem_release(cq->buf.umem); + /* UMEM is released by ib_core */ return err; } =20 @@ -868,7 +867,6 @@ static void destroy_cq_user(struct mlx5_ib_cq *cq, stru= ct ib_udata *udata) udata, struct mlx5_ib_ucontext, ibucontext); =20 mlx5_ib_db_unmap_user(context, &cq->db); - ib_umem_release(cq->buf.umem); } =20 static void init_cq_frag_buf(struct mlx5_ib_cq_buf *buf) @@ -949,8 +947,9 @@ static void notify_soft_wc_handler(struct work_struct *= work) cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context); } =20 -int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, - struct uverbs_attr_bundle *attrs) +int mlx5_ib_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -967,8 +966,7 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, int eqn; int err; =20 - if (entries < 0 || - (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)))) + if (attr->cqe > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) return -EINVAL; =20 if (check_cq_create_flags(attr->flags)) @@ -981,27 +979,15 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, cq->ibcq.cqe =3D entries - 1; mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); - cq->resize_buf =3D NULL; - cq->resize_umem =3D NULL; if (attr->flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) cq->private_flags |=3D MLX5_IB_CQ_PR_TIMESTAMP_COMPLETION; INIT_LIST_HEAD(&cq->list_send_qp); INIT_LIST_HEAD(&cq->list_recv_qp); =20 - if (udata) { - err =3D create_cq_user(dev, udata, cq, entries, &cqb, &cqe_size, - &index, &inlen, attrs); - if (err) - return err; - } else { - cqe_size =3D cache_line_size() =3D=3D 128 ? 128 : 64; - err =3D create_cq_kernel(dev, cq, entries, cqe_size, &cqb, - &index, &inlen); - if (err) - return err; - - INIT_WORK(&cq->notify_work, notify_soft_wc_handler); - } + err =3D create_cq_user(dev, udata, cq, entries, &cqb, &cqe_size, &index, + &inlen, attrs); + if (err) + return err; =20 err =3D mlx5_comp_eqn_get(dev->mdev, vector, &eqn); if (err) @@ -1021,12 +1007,8 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const stru= ct ib_cq_init_attr *attr, if (attr->flags & IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN) MLX5_SET(cqc, cqc, oi, 1); =20 - if (udata) { - cq->mcq.comp =3D mlx5_add_cq_to_tasklet; - cq->mcq.tasklet_ctx.comp =3D mlx5_ib_cq_comp; - } else { - cq->mcq.comp =3D mlx5_ib_cq_comp; - } + cq->mcq.comp =3D mlx5_add_cq_to_tasklet; + cq->mcq.tasklet_ctx.comp =3D mlx5_ib_cq_comp; =20 err =3D mlx5_core_create_cq(dev->mdev, &cq->mcq, cqb, inlen, out, sizeof(= out)); if (err) @@ -1037,12 +1019,10 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const str= uct ib_cq_init_attr *attr, =20 INIT_LIST_HEAD(&cq->wc_list); =20 - if (udata) - if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof(__u32))) { - err =3D -EFAULT; - goto err_cmd; - } - + if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof(__u32))) { + err =3D -EFAULT; + goto err_cmd; + } =20 kvfree(cqb); return 0; @@ -1052,10 +1032,82 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const str= uct ib_cq_init_attr *attr, =20 err_cqb: kvfree(cqb); - if (udata) - destroy_cq_user(cq, udata); - else - destroy_cq_kernel(dev, cq); + destroy_cq_user(cq, udata); + return err; +} + + +int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + int entries =3D attr->cqe; + int vector =3D attr->comp_vector; + struct mlx5_ib_dev *dev =3D to_mdev(ibdev); + struct mlx5_ib_cq *cq =3D to_mcq(ibcq); + u32 out[MLX5_ST_SZ_DW(create_cq_out)]; + int index; + int inlen; + u32 *cqb =3D NULL; + void *cqc; + int cqe_size; + int eqn; + int err; + + if (attr->cqe > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) + return -EINVAL; + + entries =3D roundup_pow_of_two(entries + 1); + if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) + return -EINVAL; + + cq->ibcq.cqe =3D entries - 1; + mutex_init(&cq->resize_mutex); + spin_lock_init(&cq->lock); + INIT_LIST_HEAD(&cq->list_send_qp); + INIT_LIST_HEAD(&cq->list_recv_qp); + + cqe_size =3D cache_line_size() =3D=3D 128 ? 128 : 64; + err =3D create_cq_kernel(dev, cq, entries, cqe_size, &cqb, &index, + &inlen); + if (err) + return err; + + INIT_WORK(&cq->notify_work, notify_soft_wc_handler); + + err =3D mlx5_comp_eqn_get(dev->mdev, vector, &eqn); + if (err) + goto err_cqb; + + cq->cqe_size =3D cqe_size; + + cqc =3D MLX5_ADDR_OF(create_cq_in, cqb, cq_context); + MLX5_SET(cqc, cqc, cqe_sz, + cqe_sz_to_mlx_sz(cqe_size, + cq->private_flags & + MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD)); + MLX5_SET(cqc, cqc, log_cq_size, ilog2(entries)); + MLX5_SET(cqc, cqc, uar_page, index); + MLX5_SET(cqc, cqc, c_eqn_or_apu_element, eqn); + MLX5_SET64(cqc, cqc, dbr_addr, cq->db.dma); + + cq->mcq.comp =3D mlx5_ib_cq_comp; + + err =3D mlx5_core_create_cq(dev->mdev, &cq->mcq, cqb, inlen, out, + sizeof(out)); + if (err) + goto err_cqb; + + mlx5_ib_dbg(dev, "cqn 0x%x\n", cq->mcq.cqn); + cq->mcq.event =3D mlx5_ib_cq_event; + + INIT_LIST_HEAD(&cq->wc_list); + kvfree(cqb); + return 0; + +err_cqb: + kvfree(cqb); + destroy_cq_kernel(dev, cq); return err; } =20 @@ -1390,8 +1442,8 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries= , struct ib_udata *udata) =20 if (udata) { cq->ibcq.cqe =3D entries - 1; - ib_umem_release(cq->buf.umem); - cq->buf.umem =3D cq->resize_umem; + ib_umem_release(cq->ibcq.umem); + cq->ibcq.umem =3D cq->resize_umem; cq->resize_umem =3D NULL; } else { struct mlx5_ib_cq_buf tbuf; diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5= /main.c index eba023b7af0f..4f49f65e2c16 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -4447,6 +4447,7 @@ static const struct ib_device_ops mlx5_ib_dev_ops =3D= { .check_mr_status =3D mlx5_ib_check_mr_status, .create_ah =3D mlx5_ib_create_ah, .create_cq =3D mlx5_ib_create_cq, + .create_user_cq =3D mlx5_ib_create_user_cq, .create_qp =3D mlx5_ib_create_qp, .create_srq =3D mlx5_ib_create_srq, .create_user_ah =3D mlx5_ib_create_ah, diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/m= lx5/mlx5_ib.h index ce3372aea48b..2556e326afde 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -1371,6 +1371,9 @@ int mlx5_ib_read_wqe_srq(struct mlx5_ib_srq *srq, int= wqe_index, void *buffer, size_t buflen, size_t *bc); int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, struct uverbs_attr_bundle *attrs); +int mlx5_ib_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs); int mlx5_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); int mlx5_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); int mlx5_ib_pre_destroy_cq(struct ib_cq *cq); --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5466B355020; Fri, 13 Feb 2026 10:59:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980388; cv=none; b=PLcREXbqFWyF4eJQPMaKsa1B+adJdkcSbRnEK4bR4VI/0lqUG9WE3TJ42YKWP21vfHLAGyAXzHAzn0NgAIp1FGfttr/+cECWC/42Nzj/UQ+zWKNl4l+nkCryxXjlc+6LfQuD6mFlim4kNda1o8JaDuieoyL63kA2OQs8WfUP4ec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980388; c=relaxed/simple; bh=AQVvvIH7DY2oowq/cNaZ9Og/FMsRdoik9sIHT+wgp/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rQslAURO9GvFXt6DV33s+E3/ClKduCxhvndLWlPhlJP4O/TKNvqsbl74UWrnnM9ZqTNtuOHt/syC6J2XYgjlHSZxOajjFipmUCppaRZAMdyY81YRONEVEHkRQ3Zq4nyXBkX5UM0u1abh4UEklUNxrXRu7KkFsexkVSEBoVdEVjI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=U0YOypzT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="U0YOypzT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 89170C19423; Fri, 13 Feb 2026 10:59:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980388; bh=AQVvvIH7DY2oowq/cNaZ9Og/FMsRdoik9sIHT+wgp/E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=U0YOypzTbix1qroBXmhxEWScAbtSr0lr6JKloJKtIhXM6xRLLICPbVH/KcWtNHLjb WjS+tNGbk0VsRt9slTUTgPxKF1d2fHPuoGHlQtYWFxfuVPKPHj/m8feGov+bsTb/Vi k7SDNtlYtTk53yJYXEeSddO0mXTwf8ulaPFYCHpAsKdyn4YSHxC7AKbgVke7A4bOH/ niKrnzbWGlA9MWttPR7hR3nKHkMV59SmISR1BxjYKC0XHCSzNJ/feeIxx3X8CuZowQ a8+oEC0DKFsLGlX+9nvZ9MAfZ6seiubLoXkl0AvdXAI3fuDF3QEoRfDdC7DJwW6xjO FPYXlXKL3709g== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 12/50] RDMA/mlx4: Inline mlx4_ib_get_cq_umem into callers Date: Fri, 13 Feb 2026 12:57:48 +0200 Message-ID: <20260213-refactor-umem-v1-12-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Inline the mlx4_ib_get_cq_umem helper function into its two call sites (mlx4_ib_create_cq and mlx4_alloc_resize_umem) to prepare for the transition to modern CQ creation interface. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx4/cq.c | 108 ++++++++++++++++++++++--------------= ---- 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index c592374f4a58..94e9ff45725a 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -135,45 +135,6 @@ static void mlx4_ib_free_cq_buf(struct mlx4_ib_dev *de= v, struct mlx4_ib_cq_buf * mlx4_buf_free(dev->dev, (cqe + 1) * buf->entry_size, &buf->buf); } =20 -static int mlx4_ib_get_cq_umem(struct mlx4_ib_dev *dev, - struct mlx4_ib_cq_buf *buf, - struct ib_umem **umem, u64 buf_addr, int cqe) -{ - int err; - int cqe_size =3D dev->dev->caps.cqe_size; - int shift; - int n; - - *umem =3D ib_umem_get(&dev->ib_dev, buf_addr, cqe * cqe_size, - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(*umem)) - return PTR_ERR(*umem); - - shift =3D mlx4_ib_umem_calc_optimal_mtt_size(*umem, 0, &n); - if (shift < 0) { - err =3D shift; - goto err_buf; - } - - err =3D mlx4_mtt_init(dev->dev, n, shift, &buf->mtt); - if (err) - goto err_buf; - - err =3D mlx4_ib_umem_write_mtt(dev, &buf->mtt, *umem); - if (err) - goto err_mtt; - - return 0; - -err_mtt: - mlx4_mtt_cleanup(dev->dev, &buf->mtt); - -err_buf: - ib_umem_release(*umem); - - return err; -} - #define CQ_CREATE_FLAGS_SUPPORTED IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, struct uverbs_attr_bundle *attrs) @@ -208,6 +169,9 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, =20 if (udata) { struct mlx4_ib_create_cq ucmd; + int cqe_size =3D dev->dev->caps.cqe_size; + int shift; + int n; =20 if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) { err =3D -EFAULT; @@ -215,10 +179,28 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, } =20 buf_addr =3D (void *)(unsigned long)ucmd.buf_addr; - err =3D mlx4_ib_get_cq_umem(dev, &cq->buf, &cq->umem, - ucmd.buf_addr, entries); - if (err) + + cq->umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, + entries * cqe_size, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(cq->umem)) { + err =3D PTR_ERR(cq->umem); goto err_cq; + } + + shift =3D mlx4_ib_umem_calc_optimal_mtt_size(cq->umem, 0, &n); + if (shift < 0) { + err =3D shift; + goto err_umem; + } + + err =3D mlx4_mtt_init(dev->dev, n, shift, &cq->buf.mtt); + if (err) + goto err_umem; + + err =3D mlx4_ib_umem_write_mtt(dev, &cq->buf.mtt, cq->umem); + if (err) + goto err_mtt; =20 err =3D mlx4_ib_db_map_user(udata, ucmd.db_addr, &cq->db); if (err) @@ -281,6 +263,7 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, err_mtt: mlx4_mtt_cleanup(dev->dev, &cq->buf.mtt); =20 +err_umem: ib_umem_release(cq->umem); if (!udata) mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); @@ -320,6 +303,9 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *d= ev, struct mlx4_ib_cq *cq int entries, struct ib_udata *udata) { struct mlx4_ib_resize_cq ucmd; + int cqe_size =3D dev->dev->caps.cqe_size; + int shift; + int n; int err; =20 if (cq->resize_umem) @@ -332,17 +318,43 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev = *dev, struct mlx4_ib_cq *cq if (!cq->resize_buf) return -ENOMEM; =20 - err =3D mlx4_ib_get_cq_umem(dev, &cq->resize_buf->buf, &cq->resize_umem, - ucmd.buf_addr, entries); - if (err) { - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - return err; + cq->resize_umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, + entries * cqe_size, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(cq->resize_umem)) { + err =3D PTR_ERR(cq->resize_umem); + goto err_buf; + } + + shift =3D mlx4_ib_umem_calc_optimal_mtt_size(cq->resize_umem, 0, &n); + if (shift < 0) { + err =3D shift; + goto err_umem; } =20 + err =3D mlx4_mtt_init(dev->dev, n, shift, &cq->resize_buf->buf.mtt); + if (err) + goto err_umem; + + err =3D mlx4_ib_umem_write_mtt(dev, &cq->resize_buf->buf.mtt, + cq->resize_umem); + if (err) + goto err_mtt; + cq->resize_buf->cqe =3D entries - 1; =20 return 0; + +err_mtt: + mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); + +err_umem: + ib_umem_release(cq->resize_umem); + +err_buf: + kfree(cq->resize_buf); + cq->resize_buf =3D NULL; + return err; } =20 static int mlx4_ib_get_outstanding_cqes(struct mlx4_ib_cq *cq) --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B4FB21D3D6; Fri, 13 Feb 2026 10:59:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980381; cv=none; b=aKIRVLvWSxLwFe5xQVA3cRAbIH6y8Ck/sYXJiY039duDpeoM8HzF+el4Bybxm+DDgfiLPNHAaBe5KsrCI8v0lX1Dmr28G/j+ki7mNc38CT1zYr/L5Jq5IPiJCtBFAShKNnZD2j4REcmp1PXIz96hrzWzfjVqK1ThEpYZQjU7jYk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980381; c=relaxed/simple; bh=DEbhTn6F1UX1TVdzezjFp62nwdCYX6NjcS4gjHmKhtM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TGjuC7G/0vHetR4+8rkN8TI84EO2C80q2fqsPxvIxXbnvRZT9fHlouzDAVVMgi7Wn+uO14PcnFKqEavYelVH7uAurtD6e3YlkI8GFlgch9XObCDAbKqEJ19nkmCnktDh+yFB1KcxKkfxCQOlRnyYpd35erlhp7cOjNeN/Bk8fqw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DDmXI31W; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DDmXI31W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB03CC116C6; Fri, 13 Feb 2026 10:59:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980381; bh=DEbhTn6F1UX1TVdzezjFp62nwdCYX6NjcS4gjHmKhtM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DDmXI31WWgbZ8pUEXO/805G1YKrgTEuot9/XK3KnN1ugHGmzERuFkN68ZqUyjMhxt gv7lgafxmY5HahAeHE8mxQNCeZel2efnz13xB6ux3vXZCxbBto+OgQnOKPudyjkaBa nyFK72PVOkJjjXiqaFOwmJjGi/daUl4IY+kiWRdYIgl/JLUG3SAhXTyhtaWN95o4LT 1Ej3drJ3xgLHJ82HINrxtA7Ep5BjppiaEzodK7VJQ4FHCvR/j5ATnSvcLrFWUXxHje KxPB4MM622PSV4LSaMHqM7GZknTA37rzX12KwWByr0MRpklJwPuOQTV+Zu6URMdn4s UsVUlb0BqIG2A== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 13/50] RDMA/mlx4: Introduce a modern CQ creation interface Date: Fri, 13 Feb 2026 12:57:49 +0200 Message-ID: <20260213-refactor-umem-v1-13-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The uverbs CQ creation UAPI allows users to supply their own umem when creating a CQ. Update mlx4 to support this model while preserving compatibi= lity with the legacy interface that allocates umem internally. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx4/cq.c | 191 ++++++++++++++++++++-----------= ---- drivers/infiniband/hw/mlx4/main.c | 1 + drivers/infiniband/hw/mlx4/mlx4_ib.h | 4 +- 3 files changed, 111 insertions(+), 85 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index 94e9ff45725a..4bee08317620 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -136,8 +136,9 @@ static void mlx4_ib_free_cq_buf(struct mlx4_ib_dev *dev= , struct mlx4_ib_cq_buf * } =20 #define CQ_CREATE_FLAGS_SUPPORTED IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION -int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, - struct uverbs_attr_bundle *attrs) +int mlx4_ib_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -145,13 +146,16 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, int vector =3D attr->comp_vector; struct mlx4_ib_dev *dev =3D to_mdev(ibdev); struct mlx4_ib_cq *cq =3D to_mcq(ibcq); - struct mlx4_uar *uar; + struct mlx4_ib_create_cq ucmd; + int cqe_size =3D dev->dev->caps.cqe_size; void *buf_addr; + int shift; + int n; int err; struct mlx4_ib_ucontext *context =3D rdma_udata_to_drv_context( udata, struct mlx4_ib_ucontext, ibucontext); =20 - if (entries < 1 || entries > dev->dev->caps.max_cqes) + if (attr->cqe > dev->dev->caps.max_cqes) return -EINVAL; =20 if (attr->flags & ~CQ_CREATE_FLAGS_SUPPORTED) @@ -161,95 +165,63 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, cq->ibcq.cqe =3D entries - 1; mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); - cq->resize_buf =3D NULL; - cq->resize_umem =3D NULL; cq->create_flags =3D attr->flags; INIT_LIST_HEAD(&cq->send_qp_list); INIT_LIST_HEAD(&cq->recv_qp_list); =20 - if (udata) { - struct mlx4_ib_create_cq ucmd; - int cqe_size =3D dev->dev->caps.cqe_size; - int shift; - int n; - - if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) { - err =3D -EFAULT; - goto err_cq; - } - - buf_addr =3D (void *)(unsigned long)ucmd.buf_addr; - - cq->umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, - entries * cqe_size, - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(cq->umem)) { - err =3D PTR_ERR(cq->umem); - goto err_cq; - } - - shift =3D mlx4_ib_umem_calc_optimal_mtt_size(cq->umem, 0, &n); - if (shift < 0) { - err =3D shift; - goto err_umem; - } - - err =3D mlx4_mtt_init(dev->dev, n, shift, &cq->buf.mtt); - if (err) - goto err_umem; - - err =3D mlx4_ib_umem_write_mtt(dev, &cq->buf.mtt, cq->umem); - if (err) - goto err_mtt; + if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { + err =3D -EFAULT; + goto err_cq; + } =20 - err =3D mlx4_ib_db_map_user(udata, ucmd.db_addr, &cq->db); - if (err) - goto err_mtt; + buf_addr =3D (void *)(unsigned long)ucmd.buf_addr; =20 - uar =3D &context->uar; - cq->mcq.usage =3D MLX4_RES_USAGE_USER_VERBS; - } else { - err =3D mlx4_db_alloc(dev->dev, &cq->db, 1); - if (err) - goto err_cq; + if (!ibcq->umem) + ibcq->umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, + entries * cqe_size, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(ibcq->umem)) { + err =3D PTR_ERR(ibcq->umem); + goto err_cq; + } =20 - cq->mcq.set_ci_db =3D cq->db.db; - cq->mcq.arm_db =3D cq->db.db + 1; - *cq->mcq.set_ci_db =3D 0; - *cq->mcq.arm_db =3D 0; + shift =3D mlx4_ib_umem_calc_optimal_mtt_size(cq->ibcq.umem, 0, &n); + if (shift < 0) { + err =3D shift; + goto err_cq; + } =20 - err =3D mlx4_ib_alloc_cq_buf(dev, &cq->buf, entries); - if (err) - goto err_db; + err =3D mlx4_mtt_init(dev->dev, n, shift, &cq->buf.mtt); + if (err) + goto err_cq; =20 - buf_addr =3D &cq->buf.buf; + err =3D mlx4_ib_umem_write_mtt(dev, &cq->buf.mtt, cq->ibcq.umem); + if (err) + goto err_mtt; =20 - uar =3D &dev->priv_uar; - cq->mcq.usage =3D MLX4_RES_USAGE_DRIVER; - } + err =3D mlx4_ib_db_map_user(udata, ucmd.db_addr, &cq->db); + if (err) + goto err_mtt; =20 if (dev->eq_table) vector =3D dev->eq_table[vector % ibdev->num_comp_vectors]; =20 - err =3D mlx4_cq_alloc(dev->dev, entries, &cq->buf.mtt, uar, cq->db.dma, - &cq->mcq, vector, 0, + err =3D mlx4_cq_alloc(dev->dev, entries, &cq->buf.mtt, &context->uar, + cq->db.dma, &cq->mcq, vector, 0, !!(cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION), - buf_addr, !!udata); + buf_addr, true); if (err) goto err_dbmap; =20 - if (udata) - cq->mcq.tasklet_ctx.comp =3D mlx4_ib_cq_comp; - else - cq->mcq.comp =3D mlx4_ib_cq_comp; + cq->mcq.tasklet_ctx.comp =3D mlx4_ib_cq_comp; cq->mcq.event =3D mlx4_ib_cq_event; + cq->mcq.usage =3D MLX4_RES_USAGE_USER_VERBS; =20 - if (udata) - if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) { - err =3D -EFAULT; - goto err_cq_free; - } + if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof(__u32))) { + err =3D -EFAULT; + goto err_cq_free; + } =20 return 0; =20 @@ -257,21 +229,72 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, mlx4_cq_free(dev->dev, &cq->mcq); =20 err_dbmap: - if (udata) - mlx4_ib_db_unmap_user(context, &cq->db); + mlx4_ib_db_unmap_user(context, &cq->db); =20 err_mtt: mlx4_mtt_cleanup(dev->dev, &cq->buf.mtt); + /* UMEM is released by ib_core */ =20 -err_umem: - ib_umem_release(cq->umem); - if (!udata) - mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); +err_cq: + return err; +} + +int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + int entries =3D attr->cqe; + int vector =3D attr->comp_vector; + struct mlx4_ib_dev *dev =3D to_mdev(ibdev); + struct mlx4_ib_cq *cq =3D to_mcq(ibcq); + void *buf_addr; + int err; + + if (attr->cqe > dev->dev->caps.max_cqes) + return -EINVAL; + + entries =3D roundup_pow_of_two(entries + 1); + cq->ibcq.cqe =3D entries - 1; + mutex_init(&cq->resize_mutex); + spin_lock_init(&cq->lock); + INIT_LIST_HEAD(&cq->send_qp_list); + INIT_LIST_HEAD(&cq->recv_qp_list); + + err =3D mlx4_db_alloc(dev->dev, &cq->db, 1); + if (err) + return err; + + cq->mcq.set_ci_db =3D cq->db.db; + cq->mcq.arm_db =3D cq->db.db + 1; + *cq->mcq.set_ci_db =3D 0; + *cq->mcq.arm_db =3D 0; + + err =3D mlx4_ib_alloc_cq_buf(dev, &cq->buf, entries); + if (err) + goto err_db; + + buf_addr =3D &cq->buf.buf; + + if (dev->eq_table) + vector =3D dev->eq_table[vector % ibdev->num_comp_vectors]; + + err =3D mlx4_cq_alloc(dev->dev, entries, &cq->buf.mtt, &dev->priv_uar, + cq->db.dma, &cq->mcq, vector, 0, 0, + buf_addr, false); + if (err) + goto err_buf; + + cq->mcq.comp =3D mlx4_ib_cq_comp; + cq->mcq.event =3D mlx4_ib_cq_event; + cq->mcq.usage =3D MLX4_RES_USAGE_DRIVER; + + return 0; + +err_buf: + mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); =20 err_db: - if (!udata) - mlx4_db_free(dev->dev, &cq->db); -err_cq: + mlx4_db_free(dev->dev, &cq->db); return err; } =20 @@ -445,8 +468,8 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, = struct ib_udata *udata) if (ibcq->uobject) { cq->buf =3D cq->resize_buf->buf; cq->ibcq.cqe =3D cq->resize_buf->cqe; - ib_umem_release(cq->umem); - cq->umem =3D cq->resize_umem; + ib_umem_release(cq->ibcq.umem); + cq->ibcq.umem =3D cq->resize_umem; =20 kfree(cq->resize_buf); cq->resize_buf =3D NULL; @@ -506,11 +529,11 @@ int mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_ud= ata *udata) struct mlx4_ib_ucontext, ibucontext), &mcq->db); + /* UMEM is released by ib_core */ } else { mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe); mlx4_db_free(dev->dev, &mcq->db); } - ib_umem_release(mcq->umem); return 0; } =20 diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4= /main.c index dd35e03402ab..fc05e7a1a870 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -2527,6 +2527,7 @@ static const struct ib_device_ops mlx4_ib_dev_ops =3D= { .attach_mcast =3D mlx4_ib_mcg_attach, .create_ah =3D mlx4_ib_create_ah, .create_cq =3D mlx4_ib_create_cq, + .create_user_cq =3D mlx4_ib_create_user_cq, .create_qp =3D mlx4_ib_create_qp, .create_srq =3D mlx4_ib_create_srq, .dealloc_pd =3D mlx4_ib_dealloc_pd, diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/m= lx4/mlx4_ib.h index 5df5b955114e..96563c0836ce 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -121,7 +121,6 @@ struct mlx4_ib_cq { struct mlx4_db db; spinlock_t lock; struct mutex resize_mutex; - struct ib_umem *umem; struct ib_umem *resize_umem; int create_flags; /* List of qps that it serves.*/ @@ -772,6 +771,9 @@ int mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u= 16 cq_period); int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata); int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, struct uverbs_attr_bundle *attrs); +int mlx4_ib_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs); int mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); int mlx4_ib_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags); --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B290435294F; Fri, 13 Feb 2026 10:59:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980384; cv=none; b=qDbX5+3WheypdbXG4k2r/mov+AEP54rv0CSDZHK8hE9i3MXfnJQ7G9voB84ur1txJYm4MbXC7lTS2/yBJnsMQ4l0MxW7TH+egNWfCLqswf4fdvMEvfTFEc5OR/Hl2cyzCCbMaSxgK7GUHAbc9g19mplz7I3xFlC2ybo9+efHemo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980384; c=relaxed/simple; bh=8eMb3Q5rwUIFizfROKKCiitPdmAXPkVddaMbWoQJ9iA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gxKULQ3NfKjBI0k9Qdd8yNgl38ekcvjMVDB9AanPoxyWfykdPY1W2iG7OvyJU/JCQ/3ctuq7vjdfhnmVhr6rePgMHzF8AzuUvK0HAJllVaYZrYPlt1xZhcbWveBkZRNOLOqgfQMTron1ybaAJu8uJZOg05Qtturxu1RylOggl6E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V7j2tVQC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="V7j2tVQC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B88A0C16AAE; Fri, 13 Feb 2026 10:59:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980384; bh=8eMb3Q5rwUIFizfROKKCiitPdmAXPkVddaMbWoQJ9iA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V7j2tVQC0mZgo79iYz40OcfqBk1Vvbu2n9O0NtY7KcbpUUsQmIm8JbTCLfsqtsHwO GnkpRpsd4j3de0N2cML3jbhWw18VjMQxaXihf8aTI/bZaPF6LhH9N7NARejC71nNKu /PV8Thw0Kt5IV19yzB4Jrmuo8O7YvXZ8ZqEiA53JkhvBxf8sTU2CF3soRZcy7+P6dq kWt1KBme7viUVsvaS9SVhneJjaG7fbLcftOmq+srGB2KN88CbY9JbP1noyaZwkZPpq naANnxVrxik5OaN0wuNZbrp9+bDMo0HdsElY4/o3/luXEsMurzg+wRyMWj8KFoROGW 298rUYaU49Mug== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 14/50] RDMA/mlx4: Remove unused create_flags field from CQ structure Date: Fri, 13 Feb 2026 12:57:50 +0200 Message-ID: <20260213-refactor-umem-v1-14-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The CQ creation flags do not need to be cached, as they are used immediately at the point where they are stored. Remove the unused field and reclaim 4 bytes. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx4/cq.c | 4 +--- drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index 4bee08317620..83169060d120 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -165,7 +165,6 @@ int mlx4_ib_create_user_cq(struct ib_cq *ibcq, cq->ibcq.cqe =3D entries - 1; mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); - cq->create_flags =3D attr->flags; INIT_LIST_HEAD(&cq->send_qp_list); INIT_LIST_HEAD(&cq->recv_qp_list); =20 @@ -208,8 +207,7 @@ int mlx4_ib_create_user_cq(struct ib_cq *ibcq, =20 err =3D mlx4_cq_alloc(dev->dev, entries, &cq->buf.mtt, &context->uar, cq->db.dma, &cq->mcq, vector, 0, - !!(cq->create_flags & - IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION), + attr->flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION, buf_addr, true); if (err) goto err_dbmap; diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/m= lx4/mlx4_ib.h index 96563c0836ce..6a7ed5225c7d 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -122,7 +122,6 @@ struct mlx4_ib_cq { spinlock_t lock; struct mutex resize_mutex; struct ib_umem *resize_umem; - int create_flags; /* List of qps that it serves.*/ struct list_head send_qp_list; struct list_head recv_qp_list; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5DA193542C3; Fri, 13 Feb 2026 10:59:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980392; cv=none; b=hiD7RzV6Bi9LRSXy6RUFnRBnj4nYaXVv7CQekrpkFpelcIR8oK/DB+fDebs6b9YXfIS4/Hx6HQfSGyl9LO4YCkc/c6DuoTIeDqQdUQWBWoowhdqYlXEBpooQYwUJmLr7jOQHPABUD8TapJAvrns9VSV9YFTzcridDdgmcG02/to= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980392; c=relaxed/simple; bh=ZborabYXJjoUYEGPeI/iufICv6OuWGf8T6x7aVLTvRw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sWrhUV+OodYHz8OQrY2tqIBTY8ZIFZJCFUD/13HZhNVdi6JsWTIXLUZ5BdKG2Y5evX4g1SHsUG/jdOWn2sO1cmipQJLFAjrSGqr0BYQbbbIFfJDw09K8qnM77l0Tv0OePVR6ltmZOtJUWQwa3qMJ+SGxIylCZoLkKwNmwqioxTY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EXoNAZfl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EXoNAZfl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8F307C116C6; Fri, 13 Feb 2026 10:59:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980392; bh=ZborabYXJjoUYEGPeI/iufICv6OuWGf8T6x7aVLTvRw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EXoNAZfl47tvar57MNO96L49geh3mELr/AR1xtxBTN4faHv84M3uHCXipxcfEvG/0 CdFyJtywtaGyzS3Jc5VZAr22CHfA14KRmkyWyGY+bKmdHcFGwl/DruIyORxUcG1KJr UroayRN9ypjZ/62ww8NPzcFRSDadeKpOIRhLEyVWDX4eMc1VC+asGipiTR0acuRcIz Hza/znWMTnxEM8yynVzBmzVbT3t6/jwg1BrdByZPBnfbjDiiuGARx2hpVD7CgE65/Q 0a/SAW+D7X5T6shUxZpgBU/AC8JtzyC2L7/hlhLlY38P1JRnk1XY1mjTSpORpk26rg 7AcByv5nDRzVg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 15/50] RDMA/bnxt_re: Convert to modern CQ interface Date: Fri, 13 Feb 2026 12:57:51 +0200 Message-ID: <20260213-refactor-umem-v1-15-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Allow users to supply their own umem. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 172 ++++++++++++++++++++-------= ---- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 4 +- drivers/infiniband/hw/bnxt_re/main.c | 1 + 3 files changed, 113 insertions(+), 64 deletions(-) diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/= hw/bnxt_re/ib_verbs.c index c146f43ae875..b8516d8b8426 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -3134,22 +3134,20 @@ int bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct = ib_udata *udata) nq =3D cq->qplib_cq.nq; cctx =3D rdev->chip_ctx; =20 - if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) { - free_page((unsigned long)cq->uctx_cq_page); + free_page((unsigned long)cq->uctx_cq_page); + if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) hash_del(&cq->hash_entry); - } - bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); =20 + bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); bnxt_re_put_nq(rdev, nq); - ib_umem_release(cq->umem); - atomic_dec(&rdev->stats.res.cq_count); kfree(cq->cql); return 0; } =20 -int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, - struct uverbs_attr_bundle *attrs) +int bnxt_re_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { struct bnxt_re_cq *cq =3D container_of(ibcq, struct bnxt_re_cq, ib_cq); struct bnxt_re_dev *rdev =3D to_bnxt_re_dev(ibcq->device, ibdev); @@ -3158,6 +3156,8 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext, ib_uctx); struct bnxt_qplib_dev_attr *dev_attr =3D rdev->dev_attr; struct bnxt_qplib_chip_ctx *cctx; + struct bnxt_re_cq_resp resp =3D {}; + struct bnxt_re_cq_req req; int cqe =3D attr->cqe; int rc, entries; u32 active_cqs; @@ -3166,7 +3166,7 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, return -EOPNOTSUPP; =20 /* Validate CQ fields */ - if (cqe < 1 || cqe > dev_attr->max_cq_wqes) { + if (attr->cqe > dev_attr->max_cq_wqes) { ibdev_err(&rdev->ibdev, "Failed to create CQ -max exceeded"); return -EINVAL; } @@ -3181,33 +3181,107 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const st= ruct ib_cq_init_attr *attr, =20 cq->qplib_cq.sg_info.pgsize =3D PAGE_SIZE; cq->qplib_cq.sg_info.pgshft =3D PAGE_SHIFT; - if (udata) { - struct bnxt_re_cq_req req; - if (ib_copy_from_udata(&req, udata, sizeof(req))) { - rc =3D -EFAULT; - goto fail; - } =20 - cq->umem =3D ib_umem_get(&rdev->ibdev, req.cq_va, - entries * sizeof(struct cq_base), - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(cq->umem)) { - rc =3D PTR_ERR(cq->umem); - goto fail; - } - cq->qplib_cq.sg_info.umem =3D cq->umem; - cq->qplib_cq.dpi =3D &uctx->dpi; - } else { - cq->max_cql =3D min_t(u32, entries, MAX_CQL_PER_POLL); - cq->cql =3D kcalloc(cq->max_cql, sizeof(struct bnxt_qplib_cqe), - GFP_KERNEL); - if (!cq->cql) { + if (ib_copy_from_udata(&req, udata, sizeof(req))) + return -EFAULT; + + if (!ibcq->umem) + ibcq->umem =3D ib_umem_get(&rdev->ibdev, req.cq_va, + entries * sizeof(struct cq_base), + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(ibcq->umem)) + return PTR_ERR(ibcq->umem); + + cq->qplib_cq.sg_info.umem =3D cq->ib_cq.umem; + cq->qplib_cq.dpi =3D &uctx->dpi; + + cq->qplib_cq.max_wqe =3D entries; + cq->qplib_cq.coalescing =3D &rdev->cq_coalescing; + cq->qplib_cq.nq =3D bnxt_re_get_nq(rdev); + cq->qplib_cq.cnq_hw_ring_id =3D cq->qplib_cq.nq->ring_id; + + rc =3D bnxt_qplib_create_cq(&rdev->qplib_res, &cq->qplib_cq); + if (rc) + goto create_cq; + + cq->ib_cq.cqe =3D entries; + cq->cq_period =3D cq->qplib_cq.period; + + active_cqs =3D atomic_inc_return(&rdev->stats.res.cq_count); + if (active_cqs > rdev->stats.res.cq_watermark) + rdev->stats.res.cq_watermark =3D active_cqs; + spin_lock_init(&cq->cq_lock); + + if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) { + /* Allocate a page */ + cq->uctx_cq_page =3D (void *)get_zeroed_page(GFP_KERNEL); + if (!cq->uctx_cq_page) { rc =3D -ENOMEM; - goto fail; + goto c2fail; } + hash_add(rdev->cq_hash, &cq->hash_entry, cq->qplib_cq.id); + resp.comp_mask |=3D BNXT_RE_CQ_TOGGLE_PAGE_SUPPORT; + } + resp.cqid =3D cq->qplib_cq.id; + resp.tail =3D cq->qplib_cq.hwq.cons; + resp.phase =3D cq->qplib_cq.period; + rc =3D ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen)); + if (rc) { + ibdev_err(&rdev->ibdev, "Failed to copy CQ udata"); + goto free_mem; + } =20 - cq->qplib_cq.dpi =3D &rdev->dpi_privileged; + return 0; + +free_mem: + if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) + hash_del(&cq->hash_entry); + free_page((unsigned long)cq->uctx_cq_page); +c2fail: + atomic_dec(&rdev->stats.res.cq_count); + bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); + /* UMEM is released by ib_core */ +create_cq: + bnxt_re_put_nq(rdev, cq->qplib_cq.nq); + return rc; +} + +int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, + struct uverbs_attr_bundle *attrs) +{ + struct bnxt_re_cq *cq =3D container_of(ibcq, struct bnxt_re_cq, ib_cq); + struct bnxt_re_dev *rdev =3D to_bnxt_re_dev(ibcq->device, ibdev); + struct bnxt_qplib_dev_attr *dev_attr =3D rdev->dev_attr; + int cqe =3D attr->cqe; + int rc, entries; + u32 active_cqs; + + if (attr->flags) + return -EOPNOTSUPP; + + /* Validate CQ fields */ + if (attr->cqe > dev_attr->max_cq_wqes) { + ibdev_err(&rdev->ibdev, "Failed to create CQ -max exceeded"); + return -EINVAL; } + + cq->rdev =3D rdev; + cq->qplib_cq.cq_handle =3D (u64)(unsigned long)(&cq->qplib_cq); + + entries =3D bnxt_re_init_depth(cqe + 1, NULL); + if (entries > dev_attr->max_cq_wqes + 1) + entries =3D dev_attr->max_cq_wqes + 1; + + cq->qplib_cq.sg_info.pgsize =3D PAGE_SIZE; + cq->qplib_cq.sg_info.pgshft =3D PAGE_SHIFT; + + cq->max_cql =3D min_t(u32, entries, MAX_CQL_PER_POLL); + cq->cql =3D kcalloc(cq->max_cql, sizeof(struct bnxt_qplib_cqe), + GFP_KERNEL); + if (!cq->cql) + return -ENOMEM; + + cq->qplib_cq.dpi =3D &rdev->dpi_privileged; cq->qplib_cq.max_wqe =3D entries; cq->qplib_cq.coalescing =3D &rdev->cq_coalescing; cq->qplib_cq.nq =3D bnxt_re_get_nq(rdev); @@ -3227,38 +3301,10 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const str= uct ib_cq_init_attr *attr, rdev->stats.res.cq_watermark =3D active_cqs; spin_lock_init(&cq->cq_lock); =20 - if (udata) { - struct bnxt_re_cq_resp resp =3D {}; - - if (cctx->modes.toggle_bits & BNXT_QPLIB_CQ_TOGGLE_BIT) { - hash_add(rdev->cq_hash, &cq->hash_entry, cq->qplib_cq.id); - /* Allocate a page */ - cq->uctx_cq_page =3D (void *)get_zeroed_page(GFP_KERNEL); - if (!cq->uctx_cq_page) { - rc =3D -ENOMEM; - goto c2fail; - } - resp.comp_mask |=3D BNXT_RE_CQ_TOGGLE_PAGE_SUPPORT; - } - resp.cqid =3D cq->qplib_cq.id; - resp.tail =3D cq->qplib_cq.hwq.cons; - resp.phase =3D cq->qplib_cq.period; - resp.rsvd =3D 0; - rc =3D ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen)); - if (rc) { - ibdev_err(&rdev->ibdev, "Failed to copy CQ udata"); - bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); - goto free_mem; - } - } - return 0; =20 -free_mem: - free_page((unsigned long)cq->uctx_cq_page); -c2fail: - ib_umem_release(cq->umem); fail: + bnxt_re_put_nq(rdev, cq->qplib_cq.nq); kfree(cq->cql); return rc; } @@ -3271,8 +3317,8 @@ static void bnxt_re_resize_cq_complete(struct bnxt_re= _cq *cq) =20 cq->qplib_cq.max_wqe =3D cq->resize_cqe; if (cq->resize_umem) { - ib_umem_release(cq->umem); - cq->umem =3D cq->resize_umem; + ib_umem_release(cq->ib_cq.umem); + cq->ib_cq.umem =3D cq->resize_umem; cq->resize_umem =3D NULL; cq->resize_cqe =3D 0; } @@ -3872,7 +3918,7 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entr= ies, struct ib_wc *wc) /* User CQ; the only processing we do is to * complete any pending CQ resize operation. */ - if (cq->umem) { + if (cq->ib_cq.umem) { if (cq->resize_umem) bnxt_re_resize_cq_complete(cq); return 0; diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/= hw/bnxt_re/ib_verbs.h index 76ba9ab04d5c..cac3e10b73f6 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h @@ -108,7 +108,6 @@ struct bnxt_re_cq { struct bnxt_qplib_cqe *cql; #define MAX_CQL_PER_POLL 1024 u32 max_cql; - struct ib_umem *umem; struct ib_umem *resize_umem; int resize_cqe; void *uctx_cq_page; @@ -247,6 +246,9 @@ int bnxt_re_post_recv(struct ib_qp *qp, const struct ib= _recv_wr *recv_wr, const struct ib_recv_wr **bad_recv_wr); int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, struct uverbs_attr_bundle *attrs); +int bnxt_re_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs); int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata); int bnxt_re_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc); diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/b= nxt_re/main.c index 73003ad25ee8..368c1fd8172e 100644 --- a/drivers/infiniband/hw/bnxt_re/main.c +++ b/drivers/infiniband/hw/bnxt_re/main.c @@ -1334,6 +1334,7 @@ static const struct ib_device_ops bnxt_re_dev_ops =3D= { .alloc_ucontext =3D bnxt_re_alloc_ucontext, .create_ah =3D bnxt_re_create_ah, .create_cq =3D bnxt_re_create_cq, + .create_user_cq =3D bnxt_re_create_user_cq, .create_qp =3D bnxt_re_create_qp, .create_srq =3D bnxt_re_create_srq, .create_user_ah =3D bnxt_re_create_ah, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41267356A1F; Fri, 13 Feb 2026 10:59:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980396; cv=none; b=S6wxp1wRiyCr93Wdw8MfolOiFcZYpheBHMfOlZxX28GNnJbwTgU+/hAhvbNIBGREZboJz+j7irgwlU2EMkqp6KjzBMWmwG+EJ0rrJQ3yXEcd0gsr0106kcScfj5pZcworU6EwA0WVLigmZEzLwU3cjvTOt8tzPuHT7CW+7E/dVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980396; c=relaxed/simple; bh=uCqkDM6MRpkhJ5KrDUZXo/iZqDu91ZV3NReLY1r+Hh0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=K17zeVUUxk2L5kryLU9nuJznHmhHJCz9tgygOjMVgaisFlDvj/lZ0dcz26u2FViz7Y0sHYa4F/erk1umIL1mG834zbTbssYJDNJGO4WOgEiysXDGOZXsm3MRYLy5YYIMP+3/TNztkrWDDteumAyXeyk6gudiz2D+4C7YrYn3Xg8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Hbc+73oB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Hbc+73oB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2AB3AC19423; Fri, 13 Feb 2026 10:59:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980395; bh=uCqkDM6MRpkhJ5KrDUZXo/iZqDu91ZV3NReLY1r+Hh0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Hbc+73oB3BKQQD9ONRcDM9VW1dC7YNTfBBmMnZpdWy4m5sUJP0BJlAmpvtCOKRko5 wJSn7fjBP6POSnlInNlDo0D0+t7TFQeYkWiTCRe4wtsJHfYECDOu+B0NBWTyz4cO1r Ooq04DLiXDtZ7BPPdwblJhqOZEi0cBL1xkg+nsX5E7gIyOw0/VbLwR/+llqH+Y2LSU j7GxnEYxiC7Omg5iuhuUPVWwANh6YjuSh8eB88euVgV44XfXJka69sFwiXhn5jnc3U BpoFO5oRijYhBOK1mF9jItB0sOxA+lI8Os5gMu5/H7KWJDxvqHGhwXWExHtkksA3jU kfQRG1jIKBr+w== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 16/50] RDMA/cxgb4: Separate kernel and user CQ creation paths Date: Fri, 13 Feb 2026 12:57:52 +0200 Message-ID: <20260213-refactor-umem-v1-16-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Split the create CQ logic to clearly distinguish kernel and user flows. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/cxgb4/cq.c | 218 ++++++++++++++++++++++-------= ---- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 2 + drivers/infiniband/hw/cxgb4/provider.c | 1 + 3 files changed, 152 insertions(+), 69 deletions(-) diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4= /cq.c index 14ced7b667fa..d263cca47432 100644 --- a/drivers/infiniband/hw/cxgb4/cq.c +++ b/drivers/infiniband/hw/cxgb4/cq.c @@ -994,8 +994,8 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udat= a *udata) return 0; } =20 -int c4iw_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +int c4iw_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *= attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -1012,25 +1012,21 @@ int c4iw_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, udata, struct c4iw_ucontext, ibucontext); =20 pr_debug("ib_dev %p entries %d\n", ibdev, entries); - if (attr->flags) + if (attr->flags || ibcq->umem) return -EOPNOTSUPP; =20 - if (entries < 1 || entries > ibdev->attrs.max_cqe) + if (attr->cqe > ibdev->attrs.max_cqe) return -EINVAL; =20 if (vector >=3D rhp->rdev.lldi.nciq) return -EINVAL; =20 - if (udata) { - if (udata->inlen < sizeof(ucmd)) - ucontext->is_32b_cqe =3D 1; - } + if (udata->inlen < sizeof(ucmd)) + ucontext->is_32b_cqe =3D 1; =20 chp->wr_waitp =3D c4iw_alloc_wr_wait(GFP_KERNEL); - if (!chp->wr_waitp) { - ret =3D -ENOMEM; - goto err_free_chp; - } + if (!chp->wr_waitp) + return -ENOMEM; c4iw_init_wr_wait(chp->wr_waitp); =20 wr_len =3D sizeof(struct fw_ri_res_wr) + sizeof(struct fw_ri_res); @@ -1063,22 +1059,19 @@ int c4iw_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, if (hwentries < 64) hwentries =3D 64; =20 - memsize =3D hwentries * ((ucontext && ucontext->is_32b_cqe) ? + memsize =3D hwentries * (ucontext->is_32b_cqe ? (sizeof(*chp->cq.queue) / 2) : sizeof(*chp->cq.queue)); =20 /* * memsize must be a multiple of the page size if its a user cq. */ - if (udata) - memsize =3D roundup(memsize, PAGE_SIZE); + memsize =3D roundup(memsize, PAGE_SIZE); =20 chp->cq.size =3D hwentries; chp->cq.memsize =3D memsize; chp->cq.vector =3D vector; =20 - ret =3D create_cq(&rhp->rdev, &chp->cq, - ucontext ? &ucontext->uctx : &rhp->rdev.uctx, - chp->wr_waitp); + ret =3D create_cq(&rhp->rdev, &chp->cq, &ucontext->uctx, chp->wr_waitp); if (ret) goto err_free_skb; =20 @@ -1093,54 +1086,52 @@ int c4iw_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, if (ret) goto err_destroy_cq; =20 - if (ucontext) { - ret =3D -ENOMEM; - mm =3D kmalloc(sizeof(*mm), GFP_KERNEL); - if (!mm) - goto err_remove_handle; - mm2 =3D kmalloc(sizeof(*mm2), GFP_KERNEL); - if (!mm2) - goto err_free_mm; - - memset(&uresp, 0, sizeof(uresp)); - uresp.qid_mask =3D rhp->rdev.cqmask; - uresp.cqid =3D chp->cq.cqid; - uresp.size =3D chp->cq.size; - uresp.memsize =3D chp->cq.memsize; - spin_lock(&ucontext->mmap_lock); - uresp.key =3D ucontext->key; - ucontext->key +=3D PAGE_SIZE; - uresp.gts_key =3D ucontext->key; - ucontext->key +=3D PAGE_SIZE; - /* communicate to the userspace that - * kernel driver supports 64B CQE - */ - uresp.flags |=3D C4IW_64B_CQE; - - spin_unlock(&ucontext->mmap_lock); - ret =3D ib_copy_to_udata(udata, &uresp, - ucontext->is_32b_cqe ? - sizeof(uresp) - sizeof(uresp.flags) : - sizeof(uresp)); - if (ret) - goto err_free_mm2; - - mm->key =3D uresp.key; - mm->addr =3D 0; - mm->vaddr =3D chp->cq.queue; - mm->dma_addr =3D chp->cq.dma_addr; - mm->len =3D chp->cq.memsize; - insert_flag_to_mmap(&rhp->rdev, mm, mm->addr); - insert_mmap(ucontext, mm); - - mm2->key =3D uresp.gts_key; - mm2->addr =3D chp->cq.bar2_pa; - mm2->len =3D PAGE_SIZE; - mm2->vaddr =3D NULL; - mm2->dma_addr =3D 0; - insert_flag_to_mmap(&rhp->rdev, mm2, mm2->addr); - insert_mmap(ucontext, mm2); - } + ret =3D -ENOMEM; + mm =3D kmalloc(sizeof(*mm), GFP_KERNEL); + if (!mm) + goto err_remove_handle; + mm2 =3D kmalloc(sizeof(*mm2), GFP_KERNEL); + if (!mm2) + goto err_free_mm; + + memset(&uresp, 0, sizeof(uresp)); + uresp.qid_mask =3D rhp->rdev.cqmask; + uresp.cqid =3D chp->cq.cqid; + uresp.size =3D chp->cq.size; + uresp.memsize =3D chp->cq.memsize; + spin_lock(&ucontext->mmap_lock); + uresp.key =3D ucontext->key; + ucontext->key +=3D PAGE_SIZE; + uresp.gts_key =3D ucontext->key; + ucontext->key +=3D PAGE_SIZE; + /* communicate to the userspace that + * kernel driver supports 64B CQE + */ + uresp.flags |=3D C4IW_64B_CQE; + + spin_unlock(&ucontext->mmap_lock); + ret =3D ib_copy_to_udata(udata, &uresp, + ucontext->is_32b_cqe ? + sizeof(uresp) - sizeof(uresp.flags) : + sizeof(uresp)); + if (ret) + goto err_free_mm2; + + mm->key =3D uresp.key; + mm->addr =3D 0; + mm->vaddr =3D chp->cq.queue; + mm->dma_addr =3D chp->cq.dma_addr; + mm->len =3D chp->cq.memsize; + insert_flag_to_mmap(&rhp->rdev, mm, mm->addr); + insert_mmap(ucontext, mm); + + mm2->key =3D uresp.gts_key; + mm2->addr =3D chp->cq.bar2_pa; + mm2->len =3D PAGE_SIZE; + mm2->vaddr =3D NULL; + mm2->dma_addr =3D 0; + insert_flag_to_mmap(&rhp->rdev, mm2, mm2->addr); + insert_mmap(ucontext, mm2); =20 pr_debug("cqid 0x%0x chp %p size %u memsize %zu, dma_addr %pad\n", chp->cq.cqid, chp, chp->cq.size, chp->cq.memsize, @@ -1153,14 +1144,103 @@ int c4iw_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, err_remove_handle: xa_erase_irq(&rhp->cqs, chp->cq.cqid); err_destroy_cq: - destroy_cq(&chp->rhp->rdev, &chp->cq, - ucontext ? &ucontext->uctx : &rhp->rdev.uctx, + destroy_cq(&chp->rhp->rdev, &chp->cq, &ucontext->uctx, + chp->destroy_skb, chp->wr_waitp); +err_free_skb: + kfree_skb(chp->destroy_skb); +err_free_wr_wait: + c4iw_put_wr_wait(chp->wr_waitp); + return ret; +} + +int c4iw_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + int entries =3D attr->cqe; + int vector =3D attr->comp_vector; + struct c4iw_dev *rhp =3D to_c4iw_dev(ibcq->device); + struct c4iw_cq *chp =3D to_c4iw_cq(ibcq); + int ret, wr_len; + size_t memsize, hwentries; + + pr_debug("ib_dev %p entries %d\n", ibdev, entries); + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > ibdev->attrs.max_cqe) + return -EINVAL; + + if (vector >=3D rhp->rdev.lldi.nciq) + return -EINVAL; + + chp->wr_waitp =3D c4iw_alloc_wr_wait(GFP_KERNEL); + if (!chp->wr_waitp) + return -ENOMEM; + c4iw_init_wr_wait(chp->wr_waitp); + + wr_len =3D sizeof(struct fw_ri_res_wr) + sizeof(struct fw_ri_res); + chp->destroy_skb =3D alloc_skb(wr_len, GFP_KERNEL); + if (!chp->destroy_skb) { + ret =3D -ENOMEM; + goto err_free_wr_wait; + } + + /* account for the status page. */ + entries++; + + /* IQ needs one extra entry to differentiate full vs empty. */ + entries++; + + /* + * entries must be multiple of 16 for HW. + */ + entries =3D roundup(entries, 16); + + /* + * Make actual HW queue 2x to avoid cdix_inc overflows. + */ + hwentries =3D min(entries * 2, rhp->rdev.hw_queue.t4_max_iq_size); + + /* + * Make HW queue at least 64 entries so GTS updates aren't too + * frequent. + */ + if (hwentries < 64) + hwentries =3D 64; + + memsize =3D hwentries * sizeof(*chp->cq.queue); + + chp->cq.size =3D hwentries; + chp->cq.memsize =3D memsize; + chp->cq.vector =3D vector; + + ret =3D create_cq(&rhp->rdev, &chp->cq, &rhp->rdev.uctx, chp->wr_waitp); + if (ret) + goto err_free_skb; + + chp->rhp =3D rhp; + chp->cq.size--; /* status page */ + chp->ibcq.cqe =3D entries - 2; + spin_lock_init(&chp->lock); + spin_lock_init(&chp->comp_handler_lock); + refcount_set(&chp->refcnt, 1); + init_completion(&chp->cq_rel_comp); + ret =3D xa_insert_irq(&rhp->cqs, chp->cq.cqid, chp, GFP_KERNEL); + if (ret) + goto err_destroy_cq; + + pr_debug("cqid 0x%0x chp %p size %u memsize %zu, dma_addr %pad\n", + chp->cq.cqid, chp, chp->cq.size, chp->cq.memsize, + &chp->cq.dma_addr); + return 0; +err_destroy_cq: + destroy_cq(&chp->rhp->rdev, &chp->cq, &rhp->rdev.uctx, chp->destroy_skb, chp->wr_waitp); err_free_skb: kfree_skb(chp->destroy_skb); err_free_wr_wait: c4iw_put_wr_wait(chp->wr_waitp); -err_free_chp: return ret; } =20 diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw= /cxgb4/iw_cxgb4.h index e17c1252536b..b8e3ee2a0c84 100644 --- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h +++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h @@ -1014,6 +1014,8 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_ud= ata *udata); void c4iw_cq_rem_ref(struct c4iw_cq *chp); int c4iw_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); +int c4iw_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *= attr, + struct uverbs_attr_bundle *attrs); int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); int c4iw_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *attr, enum ib_srq_attr_mask srq_attr_mask, diff --git a/drivers/infiniband/hw/cxgb4/provider.c b/drivers/infiniband/hw= /cxgb4/provider.c index e059f92d90fd..b9c183d1389d 100644 --- a/drivers/infiniband/hw/cxgb4/provider.c +++ b/drivers/infiniband/hw/cxgb4/provider.c @@ -461,6 +461,7 @@ static const struct ib_device_ops c4iw_dev_ops =3D { .alloc_pd =3D c4iw_allocate_pd, .alloc_ucontext =3D c4iw_alloc_ucontext, .create_cq =3D c4iw_create_cq, + .create_user_cq =3D c4iw_create_user_cq, .create_qp =3D c4iw_create_qp, .create_srq =3D c4iw_create_srq, .dealloc_pd =3D c4iw_deallocate_pd, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AAFF03570DF; Fri, 13 Feb 2026 10:59:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980399; cv=none; b=Pjwm9FTjBcvs1rMJ8N22Fov4f7lW25gh3tcqhsdxhq56LawaKrSV7aLggCzOZ2sQCZ6Thqoax+k4hwErQSeMqsglyK7olkeQc8wZSJUlM2DbMVLaedOdaNVD0jbOGEAIdsYBLn1b31IbQSu4uRW3Lkbv8OOhGdbvpVLRRtfSMHo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980399; c=relaxed/simple; bh=7fFZ6JJEIyaVScCFaDNjSIxSR73zFnfTIaDDncJUwpQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XUKclqHHPNZe9NRQIeCpHoeOxqzfgMHKAnMnKumdU5RrlakqSZQc8RFy9JD2loshIaV+64AcadKuMXYadYFT4huabD6KpLJ7LC8dCo8XyJF+Xm6V5KKDX8qYeUZseV/9NR+PvX1iqZS5cZW8fqZyk0Ww0VdFnROk75LIxwtV4ds= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iVe7uFUX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iVe7uFUX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7176C19424; Fri, 13 Feb 2026 10:59:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980399; bh=7fFZ6JJEIyaVScCFaDNjSIxSR73zFnfTIaDDncJUwpQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iVe7uFUXrW3mJp3+JO5L26ZW5PE4SHXRB2eV4j1ZkpFXckh9dE4IE97lf7vKYcbLg mNFFEjOJR5R3XIQdKApgLb2A7XIyaq1pZ9VW+XLW/y+kzdJ4DgSdnYWNT5s5BDE/ct piFZuQv0JKmJPEOZHOtPpUqiGGnubxolnxdGZ4g/cPOEhMhx56VuDPnovadS1B3p4Y 93Yc0MQYw5TptU/WFqKab2VR4Be+o666fDsiJtR/XGEJg67wWQ/XmqhEIKSQmtu+rm TQ42dA3/SDGY0zoEI0N/p25hYRjhiTxg9FOR9IYh8qY6/+cYYt8f8Z3eTUOFOAyTK+ J/14cimagEmeg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 17/50] RDMA/mthca: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:57:53 +0200 Message-ID: <20260213-refactor-umem-v1-17-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the create=E2=80=91CQ logic into distinct user and kernel code paths. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mthca/mthca_provider.c | 92 ++++++++++++++++++------= ---- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infinib= and/hw/mthca/mthca_provider.c index aa5ca5c4ff77..6bf825978846 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -572,9 +572,9 @@ static int mthca_destroy_qp(struct ib_qp *qp, struct ib= _udata *udata) return 0; } =20 -static int mthca_create_cq(struct ib_cq *ibcq, - const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +static int mthca_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -586,47 +586,41 @@ static int mthca_create_cq(struct ib_cq *ibcq, struct mthca_ucontext *context =3D rdma_udata_to_drv_context( udata, struct mthca_ucontext, ibucontext); =20 - if (attr->flags) + if (attr->flags || ibcq->umem) return -EOPNOTSUPP; =20 - if (entries < 1 || entries > to_mdev(ibdev)->limits.max_cqes) + if (attr->cqe > to_mdev(ibdev)->limits.max_cqes) return -EINVAL; =20 - if (udata) { - if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) - return -EFAULT; + if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) + return -EFAULT; =20 - err =3D mthca_map_user_db(to_mdev(ibdev), &context->uar, - context->db_tab, ucmd.set_db_index, - ucmd.set_db_page); - if (err) - return err; + err =3D mthca_map_user_db(to_mdev(ibdev), &context->uar, + context->db_tab, ucmd.set_db_index, + ucmd.set_db_page); + if (err) + return err; =20 - err =3D mthca_map_user_db(to_mdev(ibdev), &context->uar, - context->db_tab, ucmd.arm_db_index, - ucmd.arm_db_page); - if (err) - goto err_unmap_set; - } + err =3D mthca_map_user_db(to_mdev(ibdev), &context->uar, + context->db_tab, ucmd.arm_db_index, + ucmd.arm_db_page); + if (err) + goto err_unmap_set; =20 cq =3D to_mcq(ibcq); =20 - if (udata) { - cq->buf.mr.ibmr.lkey =3D ucmd.lkey; - cq->set_ci_db_index =3D ucmd.set_db_index; - cq->arm_db_index =3D ucmd.arm_db_index; - } + cq->buf.mr.ibmr.lkey =3D ucmd.lkey; + cq->set_ci_db_index =3D ucmd.set_db_index; + cq->arm_db_index =3D ucmd.arm_db_index; =20 for (nent =3D 1; nent <=3D entries; nent <<=3D 1) ; /* nothing */ =20 - err =3D mthca_init_cq(to_mdev(ibdev), nent, context, - udata ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num, - cq); + err =3D mthca_init_cq(to_mdev(ibdev), nent, context, ucmd.pdn, cq); if (err) goto err_unmap_arm; =20 - if (udata && ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) { + if (ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) { mthca_free_cq(to_mdev(ibdev), cq); err =3D -EFAULT; goto err_unmap_arm; @@ -637,18 +631,47 @@ static int mthca_create_cq(struct ib_cq *ibcq, return 0; =20 err_unmap_arm: - if (udata) - mthca_unmap_user_db(to_mdev(ibdev), &context->uar, - context->db_tab, ucmd.arm_db_index); + mthca_unmap_user_db(to_mdev(ibdev), &context->uar, + context->db_tab, ucmd.arm_db_index); =20 err_unmap_set: - if (udata) - mthca_unmap_user_db(to_mdev(ibdev), &context->uar, - context->db_tab, ucmd.set_db_index); + mthca_unmap_user_db(to_mdev(ibdev), &context->uar, + context->db_tab, ucmd.set_db_index); =20 return err; } =20 +static int mthca_create_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + int entries =3D attr->cqe; + struct mthca_cq *cq; + int nent; + int err; + + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > to_mdev(ibdev)->limits.max_cqes) + return -EINVAL; + + cq =3D to_mcq(ibcq); + + for (nent =3D 1; nent <=3D entries; nent <<=3D 1) + ; /* nothing */ + + err =3D mthca_init_cq(to_mdev(ibdev), nent, NULL, + to_mdev(ibdev)->driver_pd.pd_num, cq); + if (err) + return err; + + cq->resize_buf =3D NULL; + + return 0; +} + static int mthca_alloc_resize_buf(struct mthca_dev *dev, struct mthca_cq *= cq, int entries) { @@ -1070,6 +1093,7 @@ static const struct ib_device_ops mthca_dev_ops =3D { .attach_mcast =3D mthca_multicast_attach, .create_ah =3D mthca_ah_create, .create_cq =3D mthca_create_cq, + .create_user_cq =3D mthca_create_user_cq, .create_qp =3D mthca_create_qp, .dealloc_pd =3D mthca_dealloc_pd, .dealloc_ucontext =3D mthca_dealloc_ucontext, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C08F3559F8; Fri, 13 Feb 2026 11:00:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980404; cv=none; b=jxFDZ66bTNz69Kd+28stA8ZPpjn2L4vdZ/JMHaWWeQ+SlSiyZgYFrvKX65XSvdxyjmPk9YlXvkNGwNGvMTLV3KfFStgLml7qIRyH7oTzm7n5yto3EcnDNUpR6RUrU6dNg/lG9NEn0XlVQltmVxhwIAcl8HwzDWQFxNx9wgZk4v4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980404; c=relaxed/simple; bh=hn7YzjvK8jxXt9+ur6KEPT/X9OAdVySLRDWe9dlWIoU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uSZiw0/6Lj8yKrfwz2tAxyIYf/E1DAlm31fgs7v/L0hrrJo7QrLMHZgICAHldqVaO+XtSuTngChAUs+IZr3wMUvPb8cBqnkwr1qIpmM7/0zbMCM0TqrmebmLMFYUIVrzErbyJNUDflaEWga6ysNWAgJtezV2ToD3+6EjSd2u2HU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FUFtQUL9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FUFtQUL9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4D54CC19423; Fri, 13 Feb 2026 11:00:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980404; bh=hn7YzjvK8jxXt9+ur6KEPT/X9OAdVySLRDWe9dlWIoU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FUFtQUL9JdM3h8II8cr+oS/z4A3tqdTDCJQg9NkOOBhopVK1gyJOFlNPMRUAx99lq mBkEuUBhinWZcAUITdRxLb9jvbW2D/RdyUNskf/H5u3Fcxe+H9ErtrhkqoWT/Nzcqj MKHuQUkz+kOxu5SD3xiTvVBNtTpkknBNqJyD2pBB6iMxY9CgsA9sesktV8XZp/x5W8 37U3HqWnHjd7/YtOWvHbcIkbxmqZjJcopIrBu8TV2C91uxLk3h9I+O6Gqe0cIEHkrr fyzug4yNYCJrwTK75XV464doH3PK2gdITx/ObI04grdqx5/QvOiO8rkxPQk6Xyd3I9 CsdggKu1iR+Pg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 18/50] RDMA/erdma: Separate user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:57:54 +0200 Message-ID: <20260213-refactor-umem-v1-18-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Split CQ creation into distinct kernel and user flows. The erdma driver, inherited from mlx4, uses a problematic pattern that shares and caches umem in erdma_map_user_dbrecords(). This design blocks the driver from supporting generic umem sources (VMA, dmabuf, memfd, and others). Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/erdma/erdma_main.c | 1 + drivers/infiniband/hw/erdma/erdma_verbs.c | 97 ++++++++++++++++++++-------= ---- drivers/infiniband/hw/erdma/erdma_verbs.h | 2 + 3 files changed, 67 insertions(+), 33 deletions(-) diff --git a/drivers/infiniband/hw/erdma/erdma_main.c b/drivers/infiniband/= hw/erdma/erdma_main.c index f35b30235018..1b6426e89d80 100644 --- a/drivers/infiniband/hw/erdma/erdma_main.c +++ b/drivers/infiniband/hw/erdma/erdma_main.c @@ -505,6 +505,7 @@ static const struct ib_device_ops erdma_device_ops =3D { .alloc_pd =3D erdma_alloc_pd, .alloc_ucontext =3D erdma_alloc_ucontext, .create_cq =3D erdma_create_cq, + .create_user_cq =3D erdma_create_user_cq, .create_qp =3D erdma_create_qp, .dealloc_pd =3D erdma_dealloc_pd, .dealloc_ucontext =3D erdma_dealloc_ucontext, diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.c b/drivers/infiniband= /hw/erdma/erdma_verbs.c index 058edc42de58..6f809907fec5 100644 --- a/drivers/infiniband/hw/erdma/erdma_verbs.c +++ b/drivers/infiniband/hw/erdma/erdma_verbs.c @@ -1952,8 +1952,8 @@ static int erdma_init_kernel_cq(struct erdma_cq *cq) return -ENOMEM; } =20 -int erdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +int erdma_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr = *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct erdma_cq *cq =3D to_ecq(ibcq); @@ -1962,6 +1962,11 @@ int erdma_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, int ret; struct erdma_ucontext *ctx =3D rdma_udata_to_drv_context( udata, struct erdma_ucontext, ibucontext); + struct erdma_ureq_create_cq ureq; + struct erdma_uresp_create_cq uresp; + + if (ibcq->umem) + return -EOPNOTSUPP; =20 if (depth > dev->attrs.max_cqe) return -EINVAL; @@ -1977,31 +1982,22 @@ int erdma_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, if (ret < 0) return ret; =20 - if (!rdma_is_kernel_res(&ibcq->res)) { - struct erdma_ureq_create_cq ureq; - struct erdma_uresp_create_cq uresp; - - ret =3D ib_copy_from_udata(&ureq, udata, - min(udata->inlen, sizeof(ureq))); - if (ret) - goto err_out_xa; + ret =3D ib_copy_from_udata(&ureq, udata, + min(udata->inlen, sizeof(ureq))); + if (ret) + goto err_out_xa; =20 - ret =3D erdma_init_user_cq(ctx, cq, &ureq); - if (ret) - goto err_out_xa; + ret =3D erdma_init_user_cq(ctx, cq, &ureq); + if (ret) + goto err_out_xa; =20 - uresp.cq_id =3D cq->cqn; - uresp.num_cqe =3D depth; + uresp.cq_id =3D cq->cqn; + uresp.num_cqe =3D depth; =20 - ret =3D ib_copy_to_udata(udata, &uresp, - min(sizeof(uresp), udata->outlen)); - if (ret) - goto err_free_res; - } else { - ret =3D erdma_init_kernel_cq(cq); - if (ret) - goto err_out_xa; - } + ret =3D ib_copy_to_udata(udata, &uresp, + min(sizeof(uresp), udata->outlen)); + if (ret) + goto err_free_res; =20 ret =3D create_cq_cmd(ctx, cq); if (ret) @@ -2010,19 +2006,54 @@ int erdma_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, return 0; =20 err_free_res: - if (!rdma_is_kernel_res(&ibcq->res)) { - erdma_unmap_user_dbrecords(ctx, &cq->user_cq.user_dbr_page); - put_mtt_entries(dev, &cq->user_cq.qbuf_mem); - } else { - dma_free_coherent(&dev->pdev->dev, depth << CQE_SHIFT, - cq->kern_cq.qbuf, cq->kern_cq.qbuf_dma_addr); - dma_pool_free(dev->db_pool, cq->kern_cq.dbrec, - cq->kern_cq.dbrec_dma); - } + erdma_unmap_user_dbrecords(ctx, &cq->user_cq.user_dbr_page); + put_mtt_entries(dev, &cq->user_cq.qbuf_mem); =20 err_out_xa: xa_erase(&dev->cq_xa, cq->cqn); + return ret; +} + +int erdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct erdma_cq *cq =3D to_ecq(ibcq); + struct erdma_dev *dev =3D to_edev(ibcq->device); + unsigned int depth =3D attr->cqe; + int ret; + + if (depth > dev->attrs.max_cqe) + return -EINVAL; =20 + depth =3D roundup_pow_of_two(depth); + cq->ibcq.cqe =3D depth; + cq->depth =3D depth; + cq->assoc_eqn =3D attr->comp_vector + 1; + + ret =3D xa_alloc_cyclic(&dev->cq_xa, &cq->cqn, cq, + XA_LIMIT(1, dev->attrs.max_cq - 1), + &dev->next_alloc_cqn, GFP_KERNEL); + if (ret < 0) + return ret; + + ret =3D erdma_init_kernel_cq(cq); + if (ret) + goto err_out_xa; + + ret =3D create_cq_cmd(NULL, cq); + if (ret) + goto err_free_res; + + return 0; + +err_free_res: + dma_free_coherent(&dev->pdev->dev, depth << CQE_SHIFT, + cq->kern_cq.qbuf, cq->kern_cq.qbuf_dma_addr); + dma_pool_free(dev->db_pool, cq->kern_cq.dbrec, + cq->kern_cq.dbrec_dma); + +err_out_xa: + xa_erase(&dev->cq_xa, cq->cqn); return ret; } =20 diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.h b/drivers/infiniband= /hw/erdma/erdma_verbs.h index 7d8d3fe501d5..21a4fb404806 100644 --- a/drivers/infiniband/hw/erdma/erdma_verbs.h +++ b/drivers/infiniband/hw/erdma/erdma_verbs.h @@ -435,6 +435,8 @@ int erdma_get_port_immutable(struct ib_device *dev, u32= port, struct ib_port_immutable *ib_port_immutable); int erdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); +int erdma_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr = *attr, + struct uverbs_attr_bundle *attrs); int erdma_query_port(struct ib_device *dev, u32 port, struct ib_port_attr *attr); int erdma_query_gid(struct ib_device *dev, u32 port, int idx, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41D2234B661; Fri, 13 Feb 2026 11:00:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980415; cv=none; b=mnTbH0NMrRr9Sf1CNsqsgrtwDvRNByaxyXmKT9JgrfXaYPDUUT0n1xLnpm/DSb55i3Npy2gGzzQtu3hIUOxnJX5lTKgPUZeAcyJOaCUqQoFCB6xMFAlk3bo2OoRWh2nB9q3Hjvcz/yAuZHggZEhhf3CpgwfhpEdZcqc20oUnxv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980415; c=relaxed/simple; bh=a19PQ2D2C2DCb3hfZ+sOatc/4oV1zbjy3TOeGnf+Dj8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZB5PzdrQpMRjLpT69Hk5QM92T6ETHQNzqPH451SmezN0LMpheK2rl0wOodRTd4C9+slx0LvlFr6/R770vK5W5EGmaEk4XG1CwSZ4Chx51VE+Ld/sJg+kFuoEcQjvcmmy68RVxNqGWLGDkAeoiJNrKiFAdyChqiPWmIcPQwJ8+wc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KHRERZpq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KHRERZpq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4DC9CC16AAE; Fri, 13 Feb 2026 11:00:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980415; bh=a19PQ2D2C2DCb3hfZ+sOatc/4oV1zbjy3TOeGnf+Dj8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KHRERZpq/kwOnJlNAtMLy4ABMFIGwIy5tc67If7UpWtDkSgv5sTONi3R4nhmT2JIK iEmzfC47O8p/WdQGQzKSuBGmuLoLNGe32yGqNXuWZHsqCjfLROaUWepxVXv9aJ0IjM u7ZbgPgUM3gSo8wZCpU+j7SmP+2BVJGdKLDbQCv1AVFiz8GhMcN71K2fUEu+VfODk/ Ry7cdQ3wthFxhPZh2BlaiYjanhFqlDTu8PMl51sRjtzI1ctNS0qx5eW/GPFJkpHnAk 0XV3jq633YSL8kRZ0UFRB/5ftBEhglJimbAoXP15VmvYmGaoKPn7TFCL57h725n8Gi oz9535P/Opeqg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 19/50] RDMA/ionic: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:57:55 +0200 Message-ID: <20260213-refactor-umem-v1-19-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the CQ creation logic into distinct kernel and user flows. The ion= ic driver may allocate two umems per CQ, and the current layout prevents it fr= om supporting generic umem sources (VMA, dmabuf, memfd, and others). Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/ionic/ionic_controlpath.c | 88 +++++++++++++++++----= ---- drivers/infiniband/hw/ionic/ionic_ibdev.c | 1 + drivers/infiniband/hw/ionic/ionic_ibdev.h | 2 + 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/drivers/infiniband/hw/ionic/ionic_controlpath.c b/drivers/infi= niband/hw/ionic/ionic_controlpath.c index ea12d9b8e125..5b8b6baaf5d4 100644 --- a/drivers/infiniband/hw/ionic/ionic_controlpath.c +++ b/drivers/infiniband/hw/ionic/ionic_controlpath.c @@ -89,7 +89,7 @@ int ionic_create_cq_common(struct ionic_vcq *vcq, =20 cq->vcq =3D vcq; =20 - if (attr->cqe < 1 || attr->cqe + IONIC_CQ_GRACE > 0xffff) { + if (attr->cqe > 0xffff - IONIC_CQ_GRACE) { rc =3D -EINVAL; goto err_args; } @@ -1209,8 +1209,8 @@ static int ionic_destroy_cq_cmd(struct ionic_ibdev *d= ev, u32 cqid) return ionic_admin_wait(dev, &wr, IONIC_ADMIN_F_TEARDOWN); } =20 -int ionic_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +int ionic_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr = *attr, + struct uverbs_attr_bundle *attrs) { struct ionic_ibdev *dev =3D to_ionic_ibdev(ibcq->device); struct ib_udata *udata =3D &attrs->driver_udata; @@ -1222,21 +1222,18 @@ int ionic_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, struct ionic_cq_req req; int udma_idx =3D 0, rc; =20 - if (udata) { - rc =3D ib_copy_from_udata(&req, udata, sizeof(req)); - if (rc) - return rc; - } + if (ibcq->umem) + return -EOPNOTSUPP; =20 - vcq->udma_mask =3D BIT(dev->lif_cfg.udma_count) - 1; + rc =3D ib_copy_from_udata(&req, udata, sizeof(req)); + if (rc) + return rc; =20 - if (udata) - vcq->udma_mask &=3D req.udma_mask; + vcq->udma_mask =3D BIT(dev->lif_cfg.udma_count) - 1; + vcq->udma_mask &=3D req.udma_mask; =20 - if (!vcq->udma_mask) { - rc =3D -EINVAL; - goto err_init; - } + if (!vcq->udma_mask) + return -EINVAL; =20 for (; udma_idx < dev->lif_cfg.udma_count; ++udma_idx) { if (!(vcq->udma_mask & BIT(udma_idx))) @@ -1247,24 +1244,25 @@ int ionic_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, &resp.cqid[udma_idx], udma_idx); if (rc) - goto err_init; + goto err_resp; =20 rc =3D ionic_create_cq_cmd(dev, ctx, &vcq->cq[udma_idx], &buf); - if (rc) - goto err_cmd; + if (rc) { + ionic_pgtbl_unbuf(dev, &buf); + ionic_destroy_cq_common(dev, &vcq->cq[udma_idx]); + goto err_resp; + } =20 ionic_pgtbl_unbuf(dev, &buf); } =20 vcq->ibcq.cqe =3D attr->cqe; =20 - if (udata) { - resp.udma_mask =3D vcq->udma_mask; + resp.udma_mask =3D vcq->udma_mask; =20 - rc =3D ib_copy_to_udata(udata, &resp, sizeof(resp)); - if (rc) - goto err_resp; - } + rc =3D ib_copy_to_udata(udata, &resp, sizeof(resp)); + if (rc) + goto err_resp; =20 return 0; =20 @@ -1274,11 +1272,47 @@ int ionic_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, if (!(vcq->udma_mask & BIT(udma_idx))) continue; ionic_destroy_cq_cmd(dev, vcq->cq[udma_idx].cqid); -err_cmd: ionic_pgtbl_unbuf(dev, &buf); ionic_destroy_cq_common(dev, &vcq->cq[udma_idx]); -err_init: - ; + } + + return rc; +} + +int ionic_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ionic_ibdev *dev =3D to_ionic_ibdev(ibcq->device); + struct ionic_vcq *vcq =3D to_ionic_vcq(ibcq); + struct ionic_tbl_buf buf =3D {}; + int udma_idx =3D 0, rc; + + vcq->udma_mask =3D BIT(dev->lif_cfg.udma_count) - 1; + for (; udma_idx < dev->lif_cfg.udma_count; ++udma_idx) { + rc =3D ionic_create_cq_common(vcq, &buf, attr, NULL, NULL, NULL, + NULL, udma_idx); + if (rc) + goto err_resp; + + rc =3D ionic_create_cq_cmd(dev, NULL, &vcq->cq[udma_idx], &buf); + if (rc) { + ionic_pgtbl_unbuf(dev, &buf); + ionic_destroy_cq_common(dev, &vcq->cq[udma_idx]); + goto err_resp; + } + + ionic_pgtbl_unbuf(dev, &buf); + } + + vcq->ibcq.cqe =3D attr->cqe; + + return 0; + +err_resp: + while (udma_idx--) { + ionic_destroy_cq_cmd(dev, vcq->cq[udma_idx].cqid); + ionic_pgtbl_unbuf(dev, &buf); + ionic_destroy_cq_common(dev, &vcq->cq[udma_idx]); } =20 return rc; diff --git a/drivers/infiniband/hw/ionic/ionic_ibdev.c b/drivers/infiniband= /hw/ionic/ionic_ibdev.c index 164046d00e5d..32321a8996d6 100644 --- a/drivers/infiniband/hw/ionic/ionic_ibdev.c +++ b/drivers/infiniband/hw/ionic/ionic_ibdev.c @@ -229,6 +229,7 @@ static const struct ib_device_ops ionic_dev_ops =3D { .alloc_mw =3D ionic_alloc_mw, .dealloc_mw =3D ionic_dealloc_mw, .create_cq =3D ionic_create_cq, + .create_user_cq =3D ionic_create_user_cq, .destroy_cq =3D ionic_destroy_cq, .create_qp =3D ionic_create_qp, .modify_qp =3D ionic_modify_qp, diff --git a/drivers/infiniband/hw/ionic/ionic_ibdev.h b/drivers/infiniband= /hw/ionic/ionic_ibdev.h index 63828240d659..0bcb8be6fb62 100644 --- a/drivers/infiniband/hw/ionic/ionic_ibdev.h +++ b/drivers/infiniband/hw/ionic/ionic_ibdev.h @@ -482,6 +482,8 @@ int ionic_alloc_mw(struct ib_mw *ibmw, struct ib_udata = *udata); int ionic_dealloc_mw(struct ib_mw *ibmw); int ionic_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); +int ionic_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr = *attr, + struct uverbs_attr_bundle *attrs); int ionic_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); int ionic_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr, struct ib_udata *udata); --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEB52352C2C; Fri, 13 Feb 2026 11:00:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980407; cv=none; b=F7qIZxSvUEs+czO2g6MwOGzUtWfe2vOG9vKC6aBG/hgxQvqro0Et0XoGFR7wQ5mqsblXpxa3sPv52M6K/leC9AN+FgHErsQ+TFsWtkQVUYYbWlASPXnQFzbDqaE9OgiloGKH9DWRjUVrfyizOq+Co9e/tY7DsHDVl+HnZfUnhgM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980407; c=relaxed/simple; bh=4C3Qyv6Y1h2iqjB9LkmzvU5Mldz+78igtPuIUQbWB/Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FUyOaQQQf/MHuE/Itcq0+31+yi+6Y/+/Ho24RQjjlW1z/QjZHjM/ynTndb4sapDHeNQMVbJnkC3SRS3Wk3phdDPeDx2S7QmCuF+By3ViZ9qj5x5YThwaXCZC7b/0sJQNVEeetKGmjOL/ovwZmszRA3XqGQHs8QjuvzfzBjEksJA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rzcBqSz1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rzcBqSz1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id ED93EC116C6; Fri, 13 Feb 2026 11:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980407; bh=4C3Qyv6Y1h2iqjB9LkmzvU5Mldz+78igtPuIUQbWB/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rzcBqSz17HLUPTCJr8NIiz9NprNkarmm9i6d24BpVFY0k5XV9hEF+M68lG58bQJYt sWGjvl29MJXzRMfojliNhO5VL2teZYTJwXA4kILaTPwuwAHkdK8ouocdpdZvezrpB7 1JKZf27lpafCUvg1MKR6M357HKxB5zElwgk1dVErDSkmKGOhbbm/T9G0rZU4AREc+C qp2i27WwA1mvoAMS1CxEcuI0/tuB5ddi/SGnyyNeLPCymZawa6efRq2gE06ZfwemfD hZrgPf+bYwdn93kbgprDR7QEDyiLlzbKvNEs503O7VPWC6VTAewopz9IZ4E+MV4JMj 5dx3HJPGn+BCA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 20/50] RDMA/qedr: Convert to modern CQ interface Date: Fri, 13 Feb 2026 12:57:56 +0200 Message-ID: <20260213-refactor-umem-v1-20-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Allow users to supply their own umem. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/qedr/main.c | 1 + drivers/infiniband/hw/qedr/verbs.c | 323 +++++++++++++++++++++------------= ---- drivers/infiniband/hw/qedr/verbs.h | 2 + 3 files changed, 188 insertions(+), 138 deletions(-) diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr= /main.c index ecdfeff3d44f..c6ca95983492 100644 --- a/drivers/infiniband/hw/qedr/main.c +++ b/drivers/infiniband/hw/qedr/main.c @@ -199,6 +199,7 @@ static const struct ib_device_ops qedr_dev_ops =3D { .alloc_ucontext =3D qedr_alloc_ucontext, .create_ah =3D qedr_create_ah, .create_cq =3D qedr_create_cq, + .create_user_cq =3D qedr_create_user_cq, .create_qp =3D qedr_create_qp, .create_srq =3D qedr_create_srq, .dealloc_pd =3D qedr_dealloc_pd, diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qed= r/verbs.c index cb06c5d894b8..10010ccf63b3 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c @@ -789,52 +789,33 @@ static int qedr_init_user_db_rec(struct ib_udata *uda= ta, =20 static inline int qedr_init_user_queue(struct ib_udata *udata, struct qedr_dev *dev, - struct qedr_userq *q, u64 buf_addr, - size_t buf_len, bool requires_db_rec, - int access, + struct qedr_userq *q, + bool requires_db_rec, int alloc_and_init) { u32 fw_pages; int rc; =20 - q->buf_addr =3D buf_addr; - q->buf_len =3D buf_len; - q->umem =3D ib_umem_get(&dev->ibdev, q->buf_addr, q->buf_len, access); - if (IS_ERR(q->umem)) { - DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n", - PTR_ERR(q->umem)); - return PTR_ERR(q->umem); - } - fw_pages =3D ib_umem_num_dma_blocks(q->umem, 1 << FW_PAGE_SHIFT); rc =3D qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0); if (rc) - goto err0; + return rc; =20 if (alloc_and_init) { q->pbl_tbl =3D qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL); - if (IS_ERR(q->pbl_tbl)) { - rc =3D PTR_ERR(q->pbl_tbl); - goto err0; - } + if (IS_ERR(q->pbl_tbl)) + return PTR_ERR(q->pbl_tbl); + qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info, FW_PAGE_SHIFT); } else { q->pbl_tbl =3D kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL); - if (!q->pbl_tbl) { - rc =3D -ENOMEM; - goto err0; - } + if (!q->pbl_tbl) + return -ENOMEM; } =20 /* mmap the user address used to store doorbell data for recovery */ return qedr_init_user_db_rec(udata, dev, q, requires_db_rec); - -err0: - ib_umem_release(q->umem); - q->umem =3D NULL; - - return rc; } =20 static inline void qedr_init_cq_params(struct qedr_cq *cq, @@ -899,8 +880,8 @@ int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_f= lags flags) return 0; } =20 -int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +int qedr_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *= attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -908,6 +889,104 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct i= b_cq_init_attr *attr, udata, struct qedr_ucontext, ibucontext); struct qed_rdma_destroy_cq_out_params destroy_oparams; struct qed_rdma_destroy_cq_in_params destroy_iparams; + struct qedr_dev *dev =3D get_qedr_dev(ibdev); + struct qed_rdma_create_cq_in_params params; + struct qedr_create_cq_ureq ureq =3D {}; + int vector =3D attr->comp_vector; + int entries =3D attr->cqe; + struct qedr_cq *cq =3D get_qedr_cq(ibcq); + int chain_entries; + u32 db_offset; + int page_cnt; + u64 pbl_ptr; + u16 icid; + int rc; + + DP_DEBUG(dev, QEDR_MSG_INIT, + "create_cq: called from User Lib. entries=3D%d, vector=3D%d\n", + entries, vector); + + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > QEDR_MAX_CQES) + return -EINVAL; + + chain_entries =3D qedr_align_cq_entries(entries); + chain_entries =3D min_t(int, chain_entries, QEDR_MAX_CQES); + + /* calc db offset. user will add DPI base, kernel will add db addr */ + db_offset =3D DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT); + + if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq), udata->inlen))) + return -EINVAL; + + cq->cq_type =3D QEDR_CQ_TYPE_USER; + + cq->q.buf_addr =3D ureq.addr; + cq->q.buf_len =3D ureq.len; + if (!ibcq->umem) + ibcq->umem =3D ib_umem_get(&dev->ibdev, ureq.addr, ureq.len, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(ibcq->umem)) + return PTR_ERR(ibcq->umem); + cq->q.umem =3D ibcq->umem; + + rc =3D qedr_init_user_queue(udata, dev, &cq->q, true, 1); + if (rc) + return rc; + + pbl_ptr =3D cq->q.pbl_tbl->pa; + page_cnt =3D cq->q.pbl_info.num_pbes; + + cq->ibcq.cqe =3D chain_entries; + cq->q.db_addr =3D ctx->dpi_addr + db_offset; + + qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt, + pbl_ptr, ¶ms); + + rc =3D dev->ops->rdma_create_cq(dev->rdma_ctx, ¶ms, &icid); + if (rc) + goto err1; + + cq->icid =3D icid; + cq->sig =3D QEDR_CQ_MAGIC_NUMBER; + spin_lock_init(&cq->cq_lock); + + rc =3D qedr_copy_cq_uresp(dev, cq, udata, db_offset); + if (rc) + goto err2; + + rc =3D qedr_db_recovery_add(dev, cq->q.db_addr, + &cq->q.db_rec_data->db_data, + DB_REC_WIDTH_64B, + DB_REC_USER); + if (rc) + goto err2; + + DP_DEBUG(dev, QEDR_MSG_CQ, + "create cq: icid=3D0x%0x, addr=3D%p, size(entries)=3D0x%0x\n", + cq->icid, cq, params.cq_size); + + return 0; + +err2: + destroy_iparams.icid =3D cq->icid; + dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams, + &destroy_oparams); +err1: + qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl); + if (cq->q.db_mmap_entry) + rdma_user_mmap_entry_remove(cq->q.db_mmap_entry); + return rc; +} + +int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + struct qed_rdma_destroy_cq_out_params destroy_oparams; + struct qed_rdma_destroy_cq_in_params destroy_iparams; struct qed_chain_init_params chain_params =3D { .mode =3D QED_CHAIN_MODE_PBL, .intended_use =3D QED_CHAIN_USE_TO_CONSUME, @@ -916,7 +995,6 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct ib_= cq_init_attr *attr, }; struct qedr_dev *dev =3D get_qedr_dev(ibdev); struct qed_rdma_create_cq_in_params params; - struct qedr_create_cq_ureq ureq =3D {}; int vector =3D attr->comp_vector; int entries =3D attr->cqe; struct qedr_cq *cq =3D get_qedr_cq(ibcq); @@ -928,18 +1006,14 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, int rc; =20 DP_DEBUG(dev, QEDR_MSG_INIT, - "create_cq: called from %s. entries=3D%d, vector=3D%d\n", - udata ? "User Lib" : "Kernel", entries, vector); + "create_cq: called from Kernel. entries=3D%d, vector=3D%d\n", + entries, vector); =20 if (attr->flags) return -EOPNOTSUPP; =20 - if (entries > QEDR_MAX_CQES) { - DP_ERR(dev, - "create cq: the number of entries %d is too high. Must be equal o= r below %d.\n", - entries, QEDR_MAX_CQES); + if (attr->cqe > QEDR_MAX_CQES) return -EINVAL; - } =20 chain_entries =3D qedr_align_cq_entries(entries); chain_entries =3D min_t(int, chain_entries, QEDR_MAX_CQES); @@ -948,47 +1022,18 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, /* calc db offset. user will add DPI base, kernel will add db addr */ db_offset =3D DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT); =20 - if (udata) { - if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq), - udata->inlen))) { - DP_ERR(dev, - "create cq: problem copying data from user space\n"); - goto err0; - } + cq->cq_type =3D QEDR_CQ_TYPE_KERNEL; =20 - if (!ureq.len) { - DP_ERR(dev, - "create cq: cannot create a cq with 0 entries\n"); - goto err0; - } - - cq->cq_type =3D QEDR_CQ_TYPE_USER; - - rc =3D qedr_init_user_queue(udata, dev, &cq->q, ureq.addr, - ureq.len, true, IB_ACCESS_LOCAL_WRITE, - 1); - if (rc) - goto err0; - - pbl_ptr =3D cq->q.pbl_tbl->pa; - page_cnt =3D cq->q.pbl_info.num_pbes; - - cq->ibcq.cqe =3D chain_entries; - cq->q.db_addr =3D ctx->dpi_addr + db_offset; - } else { - cq->cq_type =3D QEDR_CQ_TYPE_KERNEL; + rc =3D dev->ops->common->chain_alloc(dev->cdev, &cq->pbl, + &chain_params); + if (rc) + return rc; =20 - rc =3D dev->ops->common->chain_alloc(dev->cdev, &cq->pbl, - &chain_params); - if (rc) - goto err0; + page_cnt =3D qed_chain_get_page_cnt(&cq->pbl); + pbl_ptr =3D qed_chain_get_pbl_phys(&cq->pbl); + cq->ibcq.cqe =3D cq->pbl.capacity; =20 - page_cnt =3D qed_chain_get_page_cnt(&cq->pbl); - pbl_ptr =3D qed_chain_get_pbl_phys(&cq->pbl); - cq->ibcq.cqe =3D cq->pbl.capacity; - } - - qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt, + qedr_init_cq_params(cq, NULL, dev, vector, chain_entries, page_cnt, pbl_ptr, ¶ms); =20 rc =3D dev->ops->rdma_create_cq(dev->rdma_ctx, ¶ms, &icid); @@ -999,37 +1044,23 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, cq->sig =3D QEDR_CQ_MAGIC_NUMBER; spin_lock_init(&cq->cq_lock); =20 - if (udata) { - rc =3D qedr_copy_cq_uresp(dev, cq, udata, db_offset); - if (rc) - goto err2; - - rc =3D qedr_db_recovery_add(dev, cq->q.db_addr, - &cq->q.db_rec_data->db_data, - DB_REC_WIDTH_64B, - DB_REC_USER); - if (rc) - goto err2; + /* Generate doorbell address. */ + cq->db.data.icid =3D cq->icid; + cq->db_addr =3D dev->db_addr + db_offset; + cq->db.data.params =3D DB_AGG_CMD_MAX << + RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT; =20 - } else { - /* Generate doorbell address. */ - cq->db.data.icid =3D cq->icid; - cq->db_addr =3D dev->db_addr + db_offset; - cq->db.data.params =3D DB_AGG_CMD_MAX << - RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT; - - /* point to the very last element, passing it we will toggle */ - cq->toggle_cqe =3D qed_chain_get_last_elem(&cq->pbl); - cq->pbl_toggle =3D RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK; - cq->latest_cqe =3D NULL; - consume_cqe(cq); - cq->cq_cons =3D qed_chain_get_cons_idx_u32(&cq->pbl); + /* point to the very last element, passing it we will toggle */ + cq->toggle_cqe =3D qed_chain_get_last_elem(&cq->pbl); + cq->pbl_toggle =3D RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK; + cq->latest_cqe =3D NULL; + consume_cqe(cq); + cq->cq_cons =3D qed_chain_get_cons_idx_u32(&cq->pbl); =20 - rc =3D qedr_db_recovery_add(dev, cq->db_addr, &cq->db.data, - DB_REC_WIDTH_64B, DB_REC_KERNEL); - if (rc) - goto err2; - } + rc =3D qedr_db_recovery_add(dev, cq->db_addr, &cq->db.data, + DB_REC_WIDTH_64B, DB_REC_KERNEL); + if (rc) + goto err2; =20 DP_DEBUG(dev, QEDR_MSG_CQ, "create cq: icid=3D0x%0x, addr=3D%p, size(entries)=3D0x%0x\n", @@ -1042,16 +1073,8 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams, &destroy_oparams); err1: - if (udata) { - qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl); - ib_umem_release(cq->q.umem); - if (cq->q.db_mmap_entry) - rdma_user_mmap_entry_remove(cq->q.db_mmap_entry); - } else { - dev->ops->common->chain_free(dev->cdev, &cq->pbl); - } -err0: - return -EINVAL; + dev->ops->common->chain_free(dev->cdev, &cq->pbl); + return rc; } =20 #define QEDR_DESTROY_CQ_MAX_ITERATIONS (10) @@ -1081,7 +1104,6 @@ int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_uda= ta *udata) =20 if (udata) { qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl); - ib_umem_release(cq->q.umem); =20 if (cq->q.db_rec_data) { qedr_db_recovery_del(dev, cq->q.db_addr, @@ -1472,26 +1494,33 @@ static int qedr_init_srq_user_params(struct ib_udat= a *udata, struct scatterlist *sg; int rc; =20 - rc =3D qedr_init_user_queue(udata, srq->dev, &srq->usrq, ureq->srq_addr, - ureq->srq_len, false, access, 1); + srq->usrq.buf_addr =3D ureq->srq_addr; + srq->usrq.buf_len =3D ureq->srq_len; + srq->usrq.umem =3D ib_umem_get(&srq->dev->ibdev, ureq->srq_addr, + ureq->srq_len, access); + if (IS_ERR(srq->usrq.umem)) + return PTR_ERR(srq->usrq.umem); + + rc =3D qedr_init_user_queue(udata, srq->dev, &srq->usrq, false, 1); if (rc) - return rc; + goto err_umem; =20 srq->prod_umem =3D ib_umem_get(srq->ibsrq.device, ureq->prod_pair_addr, sizeof(struct rdma_srq_producers), access); if (IS_ERR(srq->prod_umem)) { + rc =3D PTR_ERR(srq->prod_umem); qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl); - ib_umem_release(srq->usrq.umem); - DP_ERR(srq->dev, - "create srq: failed ib_umem_get for producer, got %ld\n", - PTR_ERR(srq->prod_umem)); - return PTR_ERR(srq->prod_umem); + goto err_umem; } =20 sg =3D srq->prod_umem->sgt_append.sgt.sgl; srq->hw_srq.phy_prod_pair_addr =3D sg_dma_address(sg); =20 return 0; + +err_umem: + ib_umem_release(srq->usrq.umem); + return rc; } =20 static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq, @@ -1870,27 +1899,34 @@ static int qedr_create_user_qp(struct qedr_dev *dev, =20 if (qedr_qp_has_sq(qp)) { /* SQ - read access only (0) */ - rc =3D qedr_init_user_queue(udata, dev, &qp->usq, ureq.sq_addr, - ureq.sq_len, true, 0, alloc_and_init); + qp->usq.buf_addr =3D ureq.sq_addr; + qp->usq.buf_len =3D ureq.sq_len; + qp->usq.umem =3D ib_umem_get(&dev->ibdev, ureq.sq_addr, + ureq.sq_len, 0); + if (IS_ERR(qp->usq.umem)) + return PTR_ERR(qp->usq.umem); + + rc =3D qedr_init_user_queue(udata, dev, &qp->usq, true, + alloc_and_init); if (rc) - return rc; + goto err_sq_umem; } =20 if (qedr_qp_has_rq(qp)) { /* RQ - read access only (0) */ - rc =3D qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr, - ureq.rq_len, true, 0, alloc_and_init); - if (rc) { - ib_umem_release(qp->usq.umem); - qp->usq.umem =3D NULL; - if (rdma_protocol_roce(&dev->ibdev, 1)) { - qedr_free_pbl(dev, &qp->usq.pbl_info, - qp->usq.pbl_tbl); - } else { - kfree(qp->usq.pbl_tbl); - } - return rc; + qp->urq.buf_addr =3D ureq.rq_addr; + qp->urq.buf_len =3D ureq.rq_len; + qp->urq.umem =3D ib_umem_get(&dev->ibdev, ureq.rq_addr, + ureq.rq_len, 0); + if (IS_ERR(qp->urq.umem)) { + rc =3D PTR_ERR(qp->urq.umem); + goto err_rq_umem; } + + rc =3D qedr_init_user_queue(udata, dev, &qp->urq, true, + alloc_and_init); + if (rc) + goto err_rq_umem2; } =20 memset(&in_params, 0, sizeof(in_params)); @@ -1989,6 +2025,17 @@ static int qedr_create_user_qp(struct qedr_dev *dev, err1: qedr_cleanup_user(dev, ctx, qp); return rc; + +err_rq_umem2: + ib_umem_release(qp->urq.umem); +err_rq_umem: + if (rdma_protocol_roce(&dev->ibdev, 1)) + qedr_free_pbl(dev, &qp->usq.pbl_info, qp->usq.pbl_tbl); + else + kfree(qp->usq.pbl_tbl); +err_sq_umem: + ib_umem_release(qp->usq.umem); + return rc; } =20 static int qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp) diff --git a/drivers/infiniband/hw/qedr/verbs.h b/drivers/infiniband/hw/qed= r/verbs.h index 62420a15101b..292d77df562d 100644 --- a/drivers/infiniband/hw/qedr/verbs.h +++ b/drivers/infiniband/hw/qedr/verbs.h @@ -53,6 +53,8 @@ int qedr_alloc_xrcd(struct ib_xrcd *ibxrcd, struct ib_uda= ta *udata); int qedr_dealloc_xrcd(struct ib_xrcd *ibxrcd, struct ib_udata *udata); int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); +int qedr_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *= attr, + struct uverbs_attr_bundle *attrs); int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); int qedr_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *attrs, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83D613587A2; Fri, 13 Feb 2026 11:00:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980411; cv=none; b=CtRbzMxBOJeaKAP+p2zWuLUq/d0eE7SJKWw8mS4Sq+V0YqJjWxpEXLNE2x8++8QwpGFv+k0FMtt7aP7gn9vUam8q6xu52cNfEcDadcHYVoa286yVq+5Q0bSt6gXzifAh8V6uLRCruEN3hCw4ZYI/mH6RY8fN6BQ4HSgRntRHHZM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980411; c=relaxed/simple; bh=s78Zi7UXsBRgLKBAZ5n7fQmfZPeu1Dtkh9uqA8RaVzw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WXSK668oICNKuOS1XnJ5YhXTzLec0CnJjo5syTXVbr21TfXRUJtEn6Rw53CCIcRmcXhSpYSkW0ZVUIe4dKIBbVq0mH68gHcDxobzsRMu1ZbwYUWbW3XAN6rhwJicsBIkdKsDiaxFFmaqdOh7Aw2W8p2tAZ8DmZ4MQCQUIYyGpcg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XEGQDWfk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XEGQDWfk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96048C116C6; Fri, 13 Feb 2026 11:00:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980411; bh=s78Zi7UXsBRgLKBAZ5n7fQmfZPeu1Dtkh9uqA8RaVzw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XEGQDWfkcO/J4lqcTytbrozdtN2QImw6fX8TX2+VVw+kgh7Ul6sUjT3/+tn20G+xZ fGKgofiPyxNhood8LIOuMLXzh6K7QpUVj3vzDaEttTjAbEv38H+jVR7vqBWaEr6GPb NymVNsDTkKf+SacdhWRGWN5XKCwIS83otzgDKZBVjqoyRf3slF+8eWmLvqlCDHJwTF X8Rr+e7IF8oUYxc8Ocpdx1FcD9oiyCK6qYeho3amuxruHBXlyFsYepuIgti+IPy47a ZduKb9WTwNUsX5ytKvTPOMYS472HqhXZoXNYYEH0VpcAQUNt8slETwCACophh7VagA lBlOoAg2OE6Xw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 21/50] RDMA/vmw_pvrdma: Provide a modern CQ creation interface Date: Fri, 13 Feb 2026 12:57:57 +0200 Message-ID: <20260213-refactor-umem-v1-21-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The uverbs CQ creation UAPI allows users to supply their own umem for a CQ. Update vmw_pvrdma to support this workflow while preserving support for cre= ating umem through the legacy interface. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c | 171 ++++++++++++++++----= ---- drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c | 1 + drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h | 3 + 3 files changed, 121 insertions(+), 54 deletions(-) diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c b/drivers/infinib= and/hw/vmw_pvrdma/pvrdma_cq.c index b3df6eb9b8ef..c43c363565c1 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c @@ -90,16 +90,9 @@ int pvrdma_req_notify_cq(struct ib_cq *ibcq, return has_data; } =20 -/** - * pvrdma_create_cq - create completion queue - * @ibcq: Allocated CQ - * @attr: completion queue attributes - * @attrs: bundle - * - * @return: 0 on success - */ -int pvrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *att= r, - struct uverbs_attr_bundle *attrs) +int pvrdma_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -123,58 +116,48 @@ int pvrdma_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, if (attr->flags) return -EOPNOTSUPP; =20 - entries =3D roundup_pow_of_two(entries); - if (entries < 1 || entries > dev->dsr->caps.max_cqe) + if (attr->cqe > dev->dsr->caps.max_cqe) return -EINVAL; =20 + entries =3D roundup_pow_of_two(entries); + if (!atomic_add_unless(&dev->num_cqs, 1, dev->dsr->caps.max_cq)) return -ENOMEM; =20 cq->ibcq.cqe =3D entries; - cq->is_kernel =3D !udata; - - if (!cq->is_kernel) { - if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { - ret =3D -EFAULT; - goto err_cq; - } - - cq->umem =3D ib_umem_get(ibdev, ucmd.buf_addr, ucmd.buf_size, - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(cq->umem)) { - ret =3D PTR_ERR(cq->umem); - goto err_cq; - } + cq->is_kernel =3D false; =20 - npages =3D ib_umem_num_dma_blocks(cq->umem, PAGE_SIZE); - } else { - /* One extra page for shared ring state */ - npages =3D 1 + (entries * sizeof(struct pvrdma_cqe) + - PAGE_SIZE - 1) / PAGE_SIZE; + if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { + ret =3D -EFAULT; + goto err_cq; + } =20 - /* Skip header page. */ - cq->offset =3D PAGE_SIZE; + if (!ibcq->umem) + ibcq->umem =3D ib_umem_get(ibdev, ucmd.buf_addr, ucmd.buf_size, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(ibcq->umem)) { + ret =3D PTR_ERR(ibcq->umem); + goto err_cq; } =20 + npages =3D ib_umem_num_dma_blocks(cq->umem, PAGE_SIZE); + if (npages < 0 || npages > PVRDMA_PAGE_DIR_MAX_PAGES) { dev_warn(&dev->pdev->dev, "overflow pages in completion queue\n"); ret =3D -EINVAL; - goto err_umem; + goto err_cq; } =20 - ret =3D pvrdma_page_dir_init(dev, &cq->pdir, npages, cq->is_kernel); + ret =3D pvrdma_page_dir_init(dev, &cq->pdir, npages, false); if (ret) { dev_warn(&dev->pdev->dev, "could not allocate page directory\n"); - goto err_umem; + goto err_cq; } =20 /* Ring state is always the first page. Set in library for user cq. */ - if (cq->is_kernel) - cq->ring_state =3D cq->pdir.pages[0]; - else - pvrdma_page_dir_insert_umem(&cq->pdir, cq->umem, 0); + pvrdma_page_dir_insert_umem(&cq->pdir, cq->umem, 0); =20 refcount_set(&cq->refcnt, 1); init_completion(&cq->free); @@ -183,7 +166,7 @@ int pvrdma_create_cq(struct ib_cq *ibcq, const struct i= b_cq_init_attr *attr, memset(cmd, 0, sizeof(*cmd)); cmd->hdr.cmd =3D PVRDMA_CMD_CREATE_CQ; cmd->nchunks =3D npages; - cmd->ctx_handle =3D context ? context->ctx_handle : 0; + cmd->ctx_handle =3D context->ctx_handle; cmd->cqe =3D entries; cmd->pdir_dma =3D cq->pdir.dir_dma; ret =3D pvrdma_cmd_post(dev, &req, &rsp, PVRDMA_CMD_CREATE_CQ_RESP); @@ -200,24 +183,106 @@ int pvrdma_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, dev->cq_tbl[cq->cq_handle % dev->dsr->caps.max_cq] =3D cq; spin_unlock_irqrestore(&dev->cq_tbl_lock, flags); =20 - if (!cq->is_kernel) { - cq->uar =3D &context->uar; + cq->uar =3D &context->uar; =20 - /* Copy udata back. */ - if (ib_copy_to_udata(udata, &cq_resp, sizeof(cq_resp))) { - dev_warn(&dev->pdev->dev, - "failed to copy back udata\n"); - pvrdma_destroy_cq(&cq->ibcq, udata); - return -EINVAL; - } + /* Copy udata back. */ + if (ib_copy_to_udata(udata, &cq_resp, sizeof(cq_resp))) { + dev_warn(&dev->pdev->dev, + "failed to copy back udata\n"); + pvrdma_destroy_cq(&cq->ibcq, udata); + return -EINVAL; } =20 return 0; =20 err_page_dir: pvrdma_page_dir_cleanup(dev, &cq->pdir); -err_umem: - ib_umem_release(cq->umem); +err_cq: + atomic_dec(&dev->num_cqs); + return ret; +} + +int pvrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *att= r, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + int entries =3D attr->cqe; + struct pvrdma_dev *dev =3D to_vdev(ibdev); + struct pvrdma_cq *cq =3D to_vcq(ibcq); + int ret; + int npages; + unsigned long flags; + union pvrdma_cmd_req req; + union pvrdma_cmd_resp rsp; + struct pvrdma_cmd_create_cq *cmd =3D &req.create_cq; + struct pvrdma_cmd_create_cq_resp *resp =3D &rsp.create_cq_resp; + + BUILD_BUG_ON(sizeof(struct pvrdma_cqe) !=3D 64); + + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > dev->dsr->caps.max_cqe) + return -EINVAL; + entries =3D roundup_pow_of_two(entries); + + if (!atomic_add_unless(&dev->num_cqs, 1, dev->dsr->caps.max_cq)) + return -ENOMEM; + + cq->ibcq.cqe =3D entries; + cq->is_kernel =3D true; + + /* One extra page for shared ring state */ + npages =3D 1 + (entries * sizeof(struct pvrdma_cqe) + + PAGE_SIZE - 1) / PAGE_SIZE; + + /* Skip header page. */ + cq->offset =3D PAGE_SIZE; + + if (npages < 0 || npages > PVRDMA_PAGE_DIR_MAX_PAGES) { + dev_warn(&dev->pdev->dev, + "overflow pages in completion queue\n"); + ret =3D -EINVAL; + goto err_cq; + } + + ret =3D pvrdma_page_dir_init(dev, &cq->pdir, npages, true); + if (ret) { + dev_warn(&dev->pdev->dev, + "could not allocate page directory\n"); + goto err_cq; + } + + /* Ring state is always the first page. Set in library for user cq. */ + cq->ring_state =3D cq->pdir.pages[0]; + + refcount_set(&cq->refcnt, 1); + init_completion(&cq->free); + spin_lock_init(&cq->cq_lock); + + memset(cmd, 0, sizeof(*cmd)); + cmd->hdr.cmd =3D PVRDMA_CMD_CREATE_CQ; + cmd->nchunks =3D npages; + cmd->ctx_handle =3D 0; + cmd->cqe =3D entries; + cmd->pdir_dma =3D cq->pdir.dir_dma; + ret =3D pvrdma_cmd_post(dev, &req, &rsp, PVRDMA_CMD_CREATE_CQ_RESP); + if (ret < 0) { + dev_warn(&dev->pdev->dev, + "could not create completion queue, error: %d\n", ret); + goto err_page_dir; + } + + cq->ibcq.cqe =3D resp->cqe; + cq->cq_handle =3D resp->cq_handle; + spin_lock_irqsave(&dev->cq_tbl_lock, flags); + dev->cq_tbl[cq->cq_handle % dev->dsr->caps.max_cq] =3D cq; + spin_unlock_irqrestore(&dev->cq_tbl_lock, flags); + + return 0; + +err_page_dir: + pvrdma_page_dir_cleanup(dev, &cq->pdir); err_cq: atomic_dec(&dev->num_cqs); return ret; @@ -229,8 +294,6 @@ static void pvrdma_free_cq(struct pvrdma_dev *dev, stru= ct pvrdma_cq *cq) complete(&cq->free); wait_for_completion(&cq->free); =20 - ib_umem_release(cq->umem); - pvrdma_page_dir_cleanup(dev, &cq->pdir); } =20 diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c b/drivers/infin= iband/hw/vmw_pvrdma/pvrdma_main.c index 1664d1d7d969..3f5b94a1e517 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c @@ -194,6 +194,7 @@ static const struct ib_device_ops pvrdma_dev_ops =3D { .alloc_ucontext =3D pvrdma_alloc_ucontext, .create_ah =3D pvrdma_create_ah, .create_cq =3D pvrdma_create_cq, + .create_user_cq =3D pvrdma_create_user_cq, .create_qp =3D pvrdma_create_qp, .dealloc_pd =3D pvrdma_dealloc_pd, .dealloc_ucontext =3D pvrdma_dealloc_ucontext, diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h b/drivers/infi= niband/hw/vmw_pvrdma/pvrdma_verbs.h index 603e5a9311eb..18910d336744 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h @@ -375,6 +375,9 @@ int pvrdma_map_mr_sg(struct ib_mr *ibmr, struct scatter= list *sg, int sg_nents, unsigned int *sg_offset); int pvrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *att= r, struct uverbs_attr_bundle *attrs); +int pvrdma_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs); int pvrdma_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); int pvrdma_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); int pvrdma_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags); --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E29E635BDB4; Fri, 13 Feb 2026 11:00:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980431; cv=none; b=KjconfMflw/LnS4eE1CGC6/kj+vDuA6nfjJdhhCz31LZ9EwUDKoV5s39NILKPoEOrjHff5CpOzCgV/NEZIQhyB+7PFl2MJURU0/UHDxl0zCW5lXVH6cUnPtqeJKj4k6pq7RS6I0yloEoFMD2MLeuqAyxGESbLkORP4khGulkEvc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980431; c=relaxed/simple; bh=Ak3RmCVq6jtpD2K0Q8PWZX2hCkziroyuibiIfLhK4qA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GOV/QSGVh3kjAdU5wdeJfGybAUjgOarEHXA6J2J/Qzd7uZeT5klWeix/IDU16t7M2Dmrd1Znc7LSHkn0/LLMnd/oetCXzOhozlHX7+fcUC1Y7Lj6l3OMs7pGr4kbYJsYilAgmVKsXmOkf7GbXkI0nw0oJmBpGOn/AIDZckUFzaY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oGxmmSU6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oGxmmSU6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CEE85C16AAE; Fri, 13 Feb 2026 11:00:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980430; bh=Ak3RmCVq6jtpD2K0Q8PWZX2hCkziroyuibiIfLhK4qA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oGxmmSU6isRSNDBomgG5ajckBArUA7EwDs5ppPEPXkdoQKC52wPUf2z8Wpf6ZgCSQ xANqp56bWpVa2408k5MS3aXmOV/DPa5WKkzu+YQR5ZRta1i5zinnjhW5FWRNxpGTLG 8WWN/n7wwQu415CoBHNYsZf6wOWsNXMW5zpvhvNTMYGNik+7VpM7dU3sRdcGBhbkmu ujx6f9k5pv4C9mYqufOO7Fkdw7wWhVz1qEU/j8puOhlxqPizXrEQmktYRyAOrmr8Nq Eb41g9nJMKcfwNzK/eEY1YVuFLxVRQex1IsRvGVtrFe8UZjXqkkJLwk31gV0DUIMCo Td0bo5lTnsqQw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 22/50] RDMA/ocrdma: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:57:58 +0200 Message-ID: <20260213-refactor-umem-v1-22-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the CQ creation logic into distinct kernel and user flows. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/ocrdma/ocrdma_main.c | 1 + drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 56 +++++++++++++++++++------= ---- drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 3 ++ 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniban= d/hw/ocrdma/ocrdma_main.c index 5d4b3bc16493..0d89c5ec9a7a 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c @@ -141,6 +141,7 @@ static const struct ib_device_ops ocrdma_dev_ops =3D { .create_cq =3D ocrdma_create_cq, .create_qp =3D ocrdma_create_qp, .create_user_ah =3D ocrdma_create_ah, + .create_user_cq =3D ocrdma_create_user_cq, .dealloc_pd =3D ocrdma_dealloc_pd, .dealloc_ucontext =3D ocrdma_dealloc_ucontext, .dereg_mr =3D ocrdma_dereg_mr, diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniba= nd/hw/ocrdma/ocrdma_verbs.c index bf9211d8d130..034d8b937a77 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c @@ -966,8 +966,9 @@ static int ocrdma_copy_cq_uresp(struct ocrdma_dev *dev,= struct ocrdma_cq *cq, return status; } =20 -int ocrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *att= r, - struct uverbs_attr_bundle *attrs) +int ocrdma_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; @@ -976,36 +977,29 @@ int ocrdma_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, struct ocrdma_dev *dev =3D get_ocrdma_dev(ibdev); struct ocrdma_ucontext *uctx =3D rdma_udata_to_drv_context( udata, struct ocrdma_ucontext, ibucontext); - u16 pd_id =3D 0; int status; struct ocrdma_create_cq_ureq ureq; =20 - if (attr->flags) + if (attr->flags || ibcq->umem) return -EOPNOTSUPP; =20 - if (udata) { - if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) - return -EFAULT; - } else - ureq.dpp_cq =3D 0; + if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) + return -EFAULT; =20 spin_lock_init(&cq->cq_lock); spin_lock_init(&cq->comp_handler_lock); INIT_LIST_HEAD(&cq->sq_head); INIT_LIST_HEAD(&cq->rq_head); =20 - if (udata) - pd_id =3D uctx->cntxt_pd->id; - - status =3D ocrdma_mbx_create_cq(dev, cq, entries, ureq.dpp_cq, pd_id); + status =3D ocrdma_mbx_create_cq(dev, cq, entries, ureq.dpp_cq, + uctx->cntxt_pd->id); if (status) return status; =20 - if (udata) { - status =3D ocrdma_copy_cq_uresp(dev, cq, udata); - if (status) - goto ctx_err; - } + status =3D ocrdma_copy_cq_uresp(dev, cq, udata); + if (status) + goto ctx_err; + cq->phase =3D OCRDMA_CQE_VALID; dev->cq_tbl[cq->id] =3D cq; return 0; @@ -1015,6 +1009,32 @@ int ocrdma_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, return status; } =20 +int ocrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *att= r, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + int entries =3D attr->cqe; + struct ocrdma_cq *cq =3D get_ocrdma_cq(ibcq); + struct ocrdma_dev *dev =3D get_ocrdma_dev(ibdev); + int status; + + if (attr->flags) + return -EOPNOTSUPP; + + spin_lock_init(&cq->cq_lock); + spin_lock_init(&cq->comp_handler_lock); + INIT_LIST_HEAD(&cq->sq_head); + INIT_LIST_HEAD(&cq->rq_head); + + status =3D ocrdma_mbx_create_cq(dev, cq, entries, 0, 0); + if (status) + return status; + + cq->phase =3D OCRDMA_CQE_VALID; + dev->cq_tbl[cq->id] =3D cq; + return 0; +} + int ocrdma_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata) { diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h b/drivers/infiniba= nd/hw/ocrdma/ocrdma_verbs.h index 6c5c3755b8a9..4a572608fd9f 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h @@ -71,6 +71,9 @@ int ocrdma_dealloc_pd(struct ib_pd *pd, struct ib_udata *= udata); =20 int ocrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *att= r, struct uverbs_attr_bundle *attrs); +int ocrdma_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs); int ocrdma_resize_cq(struct ib_cq *, int cqe, struct ib_udata *); int ocrdma_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 362DA35A92E; Fri, 13 Feb 2026 11:00:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980419; cv=none; b=OjpBJ3oTVbGJd5Zg7XA+Qa7qzmeZVkXm+bPQBukhVsX3Cc2LmTcKsgYXJBePWGdz/hcwyUfMfUA2eEYKxHKOyHEg8vFqRtD3RN6kV/VROS81IjpU6yuCl7q07mH/WM2Q51JIgNve+TgV3gqlpXufTnS/7Tpk1ZMvA6XnY0ansjE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980419; c=relaxed/simple; bh=wEJW/ElIiQ34G6JWKBLls/fM/jLLfH5WfW9UCF7m7dI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RfePdnDB5T2sIqf/Cv9aq1N3zfp93zyW1E5sJ4cUCG+Qu7l6d/QqT48iJ8daJA0wXWVwWOwvBl9E/uCHQ41g8TgqKXABdKHcaJ1q8GLbMOTMGyKYzdaObVQ26Bknp1fCkKgjx7T3Czi4ZvhLCecBnTFemE1xZbRPfqxMFnEi8Uw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fMLKpf/7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fMLKpf/7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 593EBC19423; Fri, 13 Feb 2026 11:00:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980419; bh=wEJW/ElIiQ34G6JWKBLls/fM/jLLfH5WfW9UCF7m7dI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fMLKpf/7/DGGNTwjtT84VCiRUmzrundAgAKbLg3252wShyh+g9Z5RXK+TznVf0z8Q f8FpqPC7svm1cGb/YHie37HkLtQpO9V5n6IvXJQ4VI4aew7iju07gFxqSIOtn4/LYK /GSKzpKsTxNVoLIJr9gySv6MHZg5qAwLkYsDVhew98XJeNt7QQtxT3QGCXTKkhyq1f rwsaUS6fD+4Dgf9KFUYr4NqnXeZ0Xy9UWbMoEVvkDuTCUP6M3wIapfSR5y0pBLOtUX Jqb6Lmb6zE8ot6+treUWSO0PstkwWTG9ijxDDh3B+1GFrNu9ttt6KOwyIJ3tFdCkBD eJ8z2CR+HKXPA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 23/50] RDMA/irdma: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:57:59 +0200 Message-ID: <20260213-refactor-umem-v1-23-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the CQ creation logic into distinct kernel and user flows. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/irdma/verbs.c | 310 +++++++++++++++++++++++---------= ---- 1 file changed, 195 insertions(+), 115 deletions(-) diff --git a/drivers/infiniband/hw/irdma/verbs.c b/drivers/infiniband/hw/ir= dma/verbs.c index cf8d19150574..f2b3cfe125af 100644 --- a/drivers/infiniband/hw/irdma/verbs.c +++ b/drivers/infiniband/hw/irdma/verbs.c @@ -2461,15 +2461,9 @@ static inline int cq_validate_flags(u32 flags, u8 hw= _rev) return flags & ~IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ? -EOPNOTSUPP : 0; } =20 -/** - * irdma_create_cq - create cq - * @ibcq: CQ allocated - * @attr: attributes for cq - * @attrs: uverbs attribute bundle - */ -static int irdma_create_cq(struct ib_cq *ibcq, - const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +static int irdma_create_user_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) { #define IRDMA_CREATE_CQ_MIN_REQ_LEN offsetofend(struct irdma_create_cq_req= , user_cq_buf) #define IRDMA_CREATE_CQ_MIN_RESP_LEN offsetofend(struct irdma_create_cq_re= sp, cq_size) @@ -2489,14 +2483,22 @@ static int irdma_create_cq(struct ib_cq *ibcq, int err_code; int entries =3D attr->cqe; bool cqe_64byte_ena; - u8 cqe_size; + struct irdma_ucontext *ucontext; + struct irdma_create_cq_req req =3D {}; + struct irdma_cq_mr *cqmr; + struct irdma_pbl *iwpbl; + struct irdma_pbl *iwpbl_shadow; + struct irdma_cq_mr *cqmr_shadow; + + if (ibcq->umem) + return -EOPNOTSUPP; =20 err_code =3D cq_validate_flags(attr->flags, dev->hw_attrs.uk_attrs.hw_rev= ); if (err_code) return err_code; =20 - if (udata && (udata->inlen < IRDMA_CREATE_CQ_MIN_REQ_LEN || - udata->outlen < IRDMA_CREATE_CQ_MIN_RESP_LEN)) + if (udata->inlen < IRDMA_CREATE_CQ_MIN_REQ_LEN || + udata->outlen < IRDMA_CREATE_CQ_MIN_RESP_LEN) return -EINVAL; =20 err_code =3D irdma_alloc_rsrc(rf, rf->allocated_cqs, rf->max_cq, &cq_num, @@ -2516,7 +2518,6 @@ static int irdma_create_cq(struct ib_cq *ibcq, ukinfo->cq_id =3D cq_num; cqe_64byte_ena =3D dev->hw_attrs.uk_attrs.feature_flags & IRDMA_FEATURE_6= 4_BYTE_CQE ? true : false; - cqe_size =3D cqe_64byte_ena ? 64 : 32; ukinfo->avoid_mem_cflct =3D cqe_64byte_ena; iwcq->ibcq.cqe =3D info.cq_uk_init_info.cq_size; if (attr->comp_vector < rf->ceqs_count) @@ -2526,110 +2527,203 @@ static int irdma_create_cq(struct ib_cq *ibcq, info.type =3D IRDMA_CQ_TYPE_IWARP; info.vsi =3D &iwdev->vsi; =20 - if (udata) { - struct irdma_ucontext *ucontext; - struct irdma_create_cq_req req =3D {}; - struct irdma_cq_mr *cqmr; - struct irdma_pbl *iwpbl; - struct irdma_pbl *iwpbl_shadow; - struct irdma_cq_mr *cqmr_shadow; - - iwcq->user_mode =3D true; - ucontext =3D - rdma_udata_to_drv_context(udata, struct irdma_ucontext, - ibucontext); - if (ib_copy_from_udata(&req, udata, - min(sizeof(req), udata->inlen))) { - err_code =3D -EFAULT; - goto cq_free_rsrc; - } + iwcq->user_mode =3D true; + ucontext =3D + rdma_udata_to_drv_context(udata, struct irdma_ucontext, + ibucontext); + if (ib_copy_from_udata(&req, udata, + min(sizeof(req), udata->inlen))) { + err_code =3D -EFAULT; + goto cq_free_rsrc; + } =20 + spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags); + iwpbl =3D irdma_get_pbl((unsigned long)req.user_cq_buf, + &ucontext->cq_reg_mem_list); + spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); + if (!iwpbl) { + err_code =3D -EPROTO; + goto cq_free_rsrc; + } + + cqmr =3D &iwpbl->cq_mr; + + if (rf->sc_dev.hw_attrs.uk_attrs.feature_flags & + IRDMA_FEATURE_CQ_RESIZE && !ucontext->legacy_mode) { spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags); - iwpbl =3D irdma_get_pbl((unsigned long)req.user_cq_buf, - &ucontext->cq_reg_mem_list); + iwpbl_shadow =3D irdma_get_pbl( + (unsigned long)req.user_shadow_area, + &ucontext->cq_reg_mem_list); spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); - if (!iwpbl) { + + if (!iwpbl_shadow) { err_code =3D -EPROTO; goto cq_free_rsrc; } + cqmr_shadow =3D &iwpbl_shadow->cq_mr; + info.shadow_area_pa =3D cqmr_shadow->cq_pbl.addr; + cqmr->split =3D true; + } else { + info.shadow_area_pa =3D cqmr->shadow; + } + if (iwpbl->pbl_allocated) { + info.virtual_map =3D true; + info.pbl_chunk_size =3D 1; + info.first_pm_pbl_idx =3D cqmr->cq_pbl.idx; + } else { + info.cq_base_pa =3D cqmr->cq_pbl.addr; + } =20 - cqmr =3D &iwpbl->cq_mr; + info.shadow_read_threshold =3D min(info.cq_uk_init_info.cq_size / 2, + (u32)IRDMA_MAX_CQ_READ_THRESH); =20 - if (rf->sc_dev.hw_attrs.uk_attrs.feature_flags & - IRDMA_FEATURE_CQ_RESIZE && !ucontext->legacy_mode) { - spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags); - iwpbl_shadow =3D irdma_get_pbl( - (unsigned long)req.user_shadow_area, - &ucontext->cq_reg_mem_list); - spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); + if (irdma_sc_cq_init(cq, &info)) { + ibdev_dbg(&iwdev->ibdev, "VERBS: init cq fail\n"); + err_code =3D -EPROTO; + goto cq_free_rsrc; + } =20 - if (!iwpbl_shadow) { - err_code =3D -EPROTO; - goto cq_free_rsrc; - } - cqmr_shadow =3D &iwpbl_shadow->cq_mr; - info.shadow_area_pa =3D cqmr_shadow->cq_pbl.addr; - cqmr->split =3D true; - } else { - info.shadow_area_pa =3D cqmr->shadow; - } - if (iwpbl->pbl_allocated) { - info.virtual_map =3D true; - info.pbl_chunk_size =3D 1; - info.first_pm_pbl_idx =3D cqmr->cq_pbl.idx; - } else { - info.cq_base_pa =3D cqmr->cq_pbl.addr; - } - } else { - /* Kmode allocations */ - int rsize; + cqp_request =3D irdma_alloc_and_get_cqp_request(&rf->cqp, true); + if (!cqp_request) { + err_code =3D -ENOMEM; + goto cq_free_rsrc; + } =20 - if (entries < 1 || entries > rf->max_cqe) { - err_code =3D -EINVAL; - goto cq_free_rsrc; - } + cqp_info =3D &cqp_request->info; + cqp_info->cqp_cmd =3D IRDMA_OP_CQ_CREATE; + cqp_info->post_sq =3D 1; + cqp_info->in.u.cq_create.cq =3D cq; + cqp_info->in.u.cq_create.check_overflow =3D true; + cqp_info->in.u.cq_create.scratch =3D (uintptr_t)cqp_request; + err_code =3D irdma_handle_cqp_op(rf, cqp_request); + irdma_put_cqp_request(&rf->cqp, cqp_request); + if (err_code) + goto cq_free_rsrc; =20 - entries +=3D 2; - if (!cqe_64byte_ena && dev->hw_attrs.uk_attrs.hw_rev >=3D IRDMA_GEN_2) - entries *=3D 2; + struct irdma_create_cq_resp resp =3D {}; =20 - if (entries & 1) - entries +=3D 1; /* cq size must be an even number */ + resp.cq_id =3D info.cq_uk_init_info.cq_id; + resp.cq_size =3D info.cq_uk_init_info.cq_size; + if (ib_copy_to_udata(udata, &resp, + min(sizeof(resp), udata->outlen))) { + ibdev_dbg(&iwdev->ibdev, + "VERBS: copy to user data\n"); + err_code =3D -EPROTO; + goto cq_destroy; + } =20 - if (entries * cqe_size =3D=3D IRDMA_HW_PAGE_SIZE) - entries +=3D 2; + init_completion(&iwcq->free_cq); =20 - ukinfo->cq_size =3D entries; + /* Populate table entry after CQ is fully created. */ + smp_store_release(&rf->cq_table[cq_num], iwcq); =20 - if (cqe_64byte_ena) - rsize =3D info.cq_uk_init_info.cq_size * sizeof(struct irdma_extended_c= qe); - else - rsize =3D info.cq_uk_init_info.cq_size * sizeof(struct irdma_cqe); - iwcq->kmem.size =3D ALIGN(round_up(rsize, 256), 256); - iwcq->kmem.va =3D dma_alloc_coherent(dev->hw->device, - iwcq->kmem.size, - &iwcq->kmem.pa, GFP_KERNEL); - if (!iwcq->kmem.va) { - err_code =3D -ENOMEM; - goto cq_free_rsrc; - } + return 0; +cq_destroy: + irdma_cq_wq_destroy(rf, cq); +cq_free_rsrc: + irdma_cq_free_rsrc(rf, iwcq); =20 - iwcq->kmem_shadow.size =3D ALIGN(IRDMA_SHADOW_AREA_SIZE << 3, - 64); - iwcq->kmem_shadow.va =3D dma_alloc_coherent(dev->hw->device, - iwcq->kmem_shadow.size, - &iwcq->kmem_shadow.pa, - GFP_KERNEL); - if (!iwcq->kmem_shadow.va) { - err_code =3D -ENOMEM; - goto cq_free_rsrc; - } - info.shadow_area_pa =3D iwcq->kmem_shadow.pa; - ukinfo->shadow_area =3D iwcq->kmem_shadow.va; - ukinfo->cq_base =3D iwcq->kmem.va; - info.cq_base_pa =3D iwcq->kmem.pa; + return err_code; +} + +static int irdma_create_cq(struct ib_cq *ibcq, + const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + struct irdma_device *iwdev =3D to_iwdev(ibdev); + struct irdma_pci_f *rf =3D iwdev->rf; + struct irdma_cq *iwcq =3D to_iwcq(ibcq); + u32 cq_num =3D 0; + struct irdma_sc_cq *cq; + struct irdma_sc_dev *dev =3D &rf->sc_dev; + struct irdma_cq_init_info info =3D {}; + struct irdma_cqp_request *cqp_request; + struct cqp_cmds_info *cqp_info; + struct irdma_cq_uk_init_info *ukinfo =3D &info.cq_uk_init_info; + int err_code; + int entries =3D attr->cqe; + bool cqe_64byte_ena; + u8 cqe_size; + int rsize; + + err_code =3D cq_validate_flags(attr->flags, dev->hw_attrs.uk_attrs.hw_rev= ); + if (err_code) + return err_code; + + err_code =3D irdma_alloc_rsrc(rf, rf->allocated_cqs, rf->max_cq, &cq_num, + &rf->next_cq); + if (err_code) + return err_code; + + cq =3D &iwcq->sc_cq; + cq->back_cq =3D iwcq; + refcount_set(&iwcq->refcnt, 1); + spin_lock_init(&iwcq->lock); + INIT_LIST_HEAD(&iwcq->resize_list); + INIT_LIST_HEAD(&iwcq->cmpl_generated); + iwcq->cq_num =3D cq_num; + info.dev =3D dev; + ukinfo->cq_size =3D max(entries, 4); + ukinfo->cq_id =3D cq_num; + cqe_64byte_ena =3D dev->hw_attrs.uk_attrs.feature_flags & IRDMA_FEATURE_6= 4_BYTE_CQE ? + true : false; + cqe_size =3D cqe_64byte_ena ? 64 : 32; + ukinfo->avoid_mem_cflct =3D cqe_64byte_ena; + iwcq->ibcq.cqe =3D info.cq_uk_init_info.cq_size; + if (attr->comp_vector < rf->ceqs_count) + info.ceq_id =3D attr->comp_vector; + info.ceq_id_valid =3D true; + info.ceqe_mask =3D 1; + info.type =3D IRDMA_CQ_TYPE_IWARP; + info.vsi =3D &iwdev->vsi; + + /* Kmode allocations */ + if (entries < 1 || entries > rf->max_cqe) { + err_code =3D -EINVAL; + goto cq_free_rsrc; } =20 + entries +=3D 2; + if (!cqe_64byte_ena && dev->hw_attrs.uk_attrs.hw_rev >=3D IRDMA_GEN_2) + entries *=3D 2; + + if (entries & 1) + entries +=3D 1; /* cq size must be an even number */ + + if (entries * cqe_size =3D=3D IRDMA_HW_PAGE_SIZE) + entries +=3D 2; + + ukinfo->cq_size =3D entries; + + if (cqe_64byte_ena) + rsize =3D info.cq_uk_init_info.cq_size * sizeof(struct irdma_extended_cq= e); + else + rsize =3D info.cq_uk_init_info.cq_size * sizeof(struct irdma_cqe); + iwcq->kmem.size =3D ALIGN(round_up(rsize, 256), 256); + iwcq->kmem.va =3D dma_alloc_coherent(dev->hw->device, + iwcq->kmem.size, + &iwcq->kmem.pa, GFP_KERNEL); + if (!iwcq->kmem.va) { + err_code =3D -ENOMEM; + goto cq_free_rsrc; + } + + iwcq->kmem_shadow.size =3D ALIGN(IRDMA_SHADOW_AREA_SIZE << 3, + 64); + iwcq->kmem_shadow.va =3D dma_alloc_coherent(dev->hw->device, + iwcq->kmem_shadow.size, + &iwcq->kmem_shadow.pa, + GFP_KERNEL); + if (!iwcq->kmem_shadow.va) { + err_code =3D -ENOMEM; + goto cq_free_rsrc; + } + info.shadow_area_pa =3D iwcq->kmem_shadow.pa; + ukinfo->shadow_area =3D iwcq->kmem_shadow.va; + ukinfo->cq_base =3D iwcq->kmem.va; + info.cq_base_pa =3D iwcq->kmem.pa; + info.shadow_read_threshold =3D min(info.cq_uk_init_info.cq_size / 2, (u32)IRDMA_MAX_CQ_READ_THRESH); =20 @@ -2656,28 +2750,13 @@ static int irdma_create_cq(struct ib_cq *ibcq, if (err_code) goto cq_free_rsrc; =20 - if (udata) { - struct irdma_create_cq_resp resp =3D {}; - - resp.cq_id =3D info.cq_uk_init_info.cq_id; - resp.cq_size =3D info.cq_uk_init_info.cq_size; - if (ib_copy_to_udata(udata, &resp, - min(sizeof(resp), udata->outlen))) { - ibdev_dbg(&iwdev->ibdev, - "VERBS: copy to user data\n"); - err_code =3D -EPROTO; - goto cq_destroy; - } - } - init_completion(&iwcq->free_cq); =20 /* Populate table entry after CQ is fully created. */ smp_store_release(&rf->cq_table[cq_num], iwcq); =20 return 0; -cq_destroy: - irdma_cq_wq_destroy(rf, cq); + cq_free_rsrc: irdma_cq_free_rsrc(rf, iwcq); =20 @@ -5355,6 +5434,7 @@ static const struct ib_device_ops irdma_dev_ops =3D { .alloc_pd =3D irdma_alloc_pd, .alloc_ucontext =3D irdma_alloc_ucontext, .create_cq =3D irdma_create_cq, + .create_user_cq =3D irdma_create_user_cq, .create_qp =3D irdma_create_qp, .dealloc_driver =3D irdma_ib_dealloc_device, .dealloc_mw =3D irdma_dealloc_mw, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1DB8235B130; Fri, 13 Feb 2026 11:00:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980423; cv=none; b=nPkLXJx1S5Ida3z4NcbcMf5hKHmrqQDDtwcrha/HbHF5O2jNIpyKGnnwUnKCsCXRXrPLnFRdBKPFkl5TdYpMHeZH9XCwMr9aQTAxg6WbWMH4fjMRut6Ye9S4fam3DrkQ75z1pgXV3dGbDdKq9QSnoyvcDsF+1+zt8JXcOIUvAcU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980423; c=relaxed/simple; bh=U6oZSJ7BtAPy0JlnmcsfG4w7q3okdxecgWtK+w3OOF0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JEPnWA+Fn+djB6eSrtHP0k/o0Ya2M2G5EYhld4bWi0r7CRwVO6kcmEks3bnLNIN+Z3H9s0Or5htP0C+C5NIhKxh+my/kX0svTX0doWzid0tsPxl3TMJm9NbSblPl/PS+76rbjin2Foa9MH7nn0C+Z1RGOTDLFIOF31uD7SrMV3E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qTTeoEGS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qTTeoEGS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23A6CC116C6; Fri, 13 Feb 2026 11:00:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980423; bh=U6oZSJ7BtAPy0JlnmcsfG4w7q3okdxecgWtK+w3OOF0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qTTeoEGS2x15qGfAvIv2C/IL7k78V16eh/LYVSjQIVYQLkgGhePLwe8PBLJjXAmtr klM0DFvNAdirR5fhOY9Uf41RjSY80x5MtqDKqsWx0RugnmUKbS/A9rWYBjFGJnmT/X W61wIgqtsZZaODjUjxY0rMntaz2+0MPJTByvjFdjNTo8A+88ZtIzoifNDFS+pctDuO mRzeBv3rX8w4c0x87CPshiGEc4NFlJOgLCcZulqAY6K/69u9vk3A+nDeMR/PbrruCP Q5HW86GQKaPyv1oPBg99ItJac4wgAEN/bdD8+nmr3BQviRedqwAEFew526ngKI8nqx Xj2kvXHWIQ0ww== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 24/50] RDMA/usnic: Provide a modern CQ creation interface Date: Fri, 13 Feb 2026 12:58:00 +0200 Message-ID: <20260213-refactor-umem-v1-24-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky usnic doesn't support kernel verbs and should have only .create_user_cq() callback. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/usnic/usnic_ib_main.c | 2 +- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 6 +++--- drivers/infiniband/hw/usnic/usnic_ib_verbs.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/infiniband/hw/usnic/usnic_ib_main.c b/drivers/infiniba= nd/hw/usnic/usnic_ib_main.c index 11eca39b73a9..8a3b641d6059 100644 --- a/drivers/infiniband/hw/usnic/usnic_ib_main.c +++ b/drivers/infiniband/hw/usnic/usnic_ib_main.c @@ -356,7 +356,7 @@ static const struct ib_device_ops usnic_dev_ops =3D { =20 .alloc_pd =3D usnic_ib_alloc_pd, .alloc_ucontext =3D usnic_ib_alloc_ucontext, - .create_cq =3D usnic_ib_create_cq, + .create_user_cq =3D usnic_ib_create_user_cq, .create_qp =3D usnic_ib_create_qp, .dealloc_pd =3D usnic_ib_dealloc_pd, .dealloc_ucontext =3D usnic_ib_dealloc_ucontext, diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c b/drivers/infinib= and/hw/usnic/usnic_ib_verbs.c index ae5df96589d9..2b41ded14a65 100644 --- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c @@ -576,10 +576,10 @@ int usnic_ib_modify_qp(struct ib_qp *ibqp, struct ib_= qp_attr *attr, return status; } =20 -int usnic_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, - struct uverbs_attr_bundle *attrs) +int usnic_ib_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_at= tr *attr, + struct uverbs_attr_bundle *attrs) { - if (attr->flags) + if (attr->flags || ibcq->umem) return -EOPNOTSUPP; =20 return 0; diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.h b/drivers/infinib= and/hw/usnic/usnic_ib_verbs.h index e3031ac32488..15882110a5d5 100644 --- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.h +++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.h @@ -55,8 +55,8 @@ int usnic_ib_create_qp(struct ib_qp *qp, struct ib_qp_ini= t_attr *init_attr, int usnic_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata); int usnic_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask, struct ib_udata *udata); -int usnic_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, - struct uverbs_attr_bundle *attrs); +int usnic_ib_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_at= tr *attr, + struct uverbs_attr_bundle *attrs); int usnic_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); struct ib_mr *usnic_ib_reg_mr(struct ib_pd *pd, u64 start, u64 length, u64 virt_addr, int access_flags, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 104D8354AEC; Fri, 13 Feb 2026 11:00:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980427; cv=none; b=lkOZH4juwgGEAJYcKxSAY4MoPau93zg0253O0v6nSrJ8acZNOo8L2lT/y8iXOnDDSysNn8AXfCIf+BIM6y+wNcWf/ZPSsaP1uHgTgZ0n+C3GDe0qK43GloYzHw6nWshUQklggpy7lDaFIVFc6rO6HHNAut5uPwLyfNbcdBUYWWs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980427; c=relaxed/simple; bh=ie+0JBki2/glNSETQLy2aDTa3dexDvCcQEZRepXCc4s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IbiCR9Vbt/I5V9H7R9wY1UPKqPJ+uuRya9GRgaf7EsbcHRfYjHe/ub7/2rLjcUNwiRKE2V+ls7HOV1vr5DKGf4CLvowa4/5ccvabC1uwLt+ROXZokakEqW7qTLdVtOZofez6YJp5nVTH8nUd07GFbpesiwQvAjFTn/MyCcB7KDk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z60BlmFK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Z60BlmFK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AE252C116C6; Fri, 13 Feb 2026 11:00:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980426; bh=ie+0JBki2/glNSETQLy2aDTa3dexDvCcQEZRepXCc4s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z60BlmFKZA9KLWlKIWXibTo03BEI4Znra/QFK5qLMmskd3vMcQO/KSDf0M6cjr+UL 4879MvwQ7Rx3shHZT3TgbusodoiXCOWwMPV2uhdCM56aST0UBZ3RpGUdmAWsL3KqNJ OUR0SJn3g3a1jjGl+k+Ts+jJyPfwnymUDiswuNq5MyW3eezF2FTz1VpnGCqmg5UL9k xkr3JHLTq45C4lO78eb/0XYlfB8eTzbyfbiR4bA0WCr63b5gB/wZOBxqmwcjuO9Isc BmBgPnY5VqJaM2yhdmsSMRWD/yt4gLqSOox4oq392oFf+u8W8oNeWlk4S9hkXruRO+ HrxYW+//q5Svg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 25/50] RDMA/mana: Provide a modern CQ creation interface Date: Fri, 13 Feb 2026 12:58:01 +0200 Message-ID: <20260213-refactor-umem-v1-25-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The uverbs CQ creation UAPI allows users to supply their own umem for a CQ. Update mana to support this workflow while preserving support for creating umem through the legacy interface. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mana/cq.c | 128 +++++++++++++++++++++++--------= ---- drivers/infiniband/hw/mana/device.c | 1 + drivers/infiniband/hw/mana/main.c | 25 +++---- drivers/infiniband/hw/mana/mana_ib.h | 4 +- drivers/infiniband/hw/mana/qp.c | 42 ++++++++++-- drivers/infiniband/hw/mana/wq.c | 14 +++- 6 files changed, 147 insertions(+), 67 deletions(-) diff --git a/drivers/infiniband/hw/mana/cq.c b/drivers/infiniband/hw/mana/c= q.c index 2dce1b677115..605122ecf9f9 100644 --- a/drivers/infiniband/hw/mana/cq.c +++ b/drivers/infiniband/hw/mana/cq.c @@ -5,8 +5,8 @@ =20 #include "mana_ib.h" =20 -int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, - struct uverbs_attr_bundle *attrs) +int mana_ib_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_att= r *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct mana_ib_cq *cq =3D container_of(ibcq, struct mana_ib_cq, ibcq); @@ -17,7 +17,6 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib= _cq_init_attr *attr, struct mana_ib_dev *mdev; bool is_rnic_cq; u32 doorbell; - u32 buf_size; int err; =20 mdev =3D container_of(ibdev, struct mana_ib_dev, ib_dev); @@ -26,44 +25,100 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, cq->cq_handle =3D INVALID_MANA_HANDLE; is_rnic_cq =3D mana_ib_is_rnic(mdev); =20 - if (udata) { - if (udata->inlen < offsetof(struct mana_ib_create_cq, flags)) - return -EINVAL; + if (udata->inlen < offsetof(struct mana_ib_create_cq, flags)) + return -EINVAL; =20 - err =3D ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata->inlen)= ); - if (err) { - ibdev_dbg(ibdev, "Failed to copy from udata for create cq, %d\n", err); - return err; - } + err =3D ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata->inlen)); + if (err) { + ibdev_dbg(ibdev, "Failed to copy from udata for create cq, %d\n", err); + return err; + } =20 - if ((!is_rnic_cq && attr->cqe > mdev->adapter_caps.max_qp_wr) || - attr->cqe > U32_MAX / COMP_ENTRY_SIZE) { - ibdev_dbg(ibdev, "CQE %d exceeding limit\n", attr->cqe); - return -EINVAL; - } + if ((!is_rnic_cq && attr->cqe > mdev->adapter_caps.max_qp_wr) || + attr->cqe > U32_MAX / COMP_ENTRY_SIZE) { + ibdev_dbg(ibdev, "CQE %d exceeding limit\n", attr->cqe); + return -EINVAL; + } + + cq->cqe =3D attr->cqe; + if (!ibcq->umem) + ibcq->umem =3D ib_umem_get(ibdev, ucmd.buf_addr, + cq->cqe * COMP_ENTRY_SIZE, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(ibcq->umem)) + return PTR_ERR(ibcq->umem); + cq->queue.umem =3D ibcq->umem; + + err =3D mana_ib_create_queue(mdev, &cq->queue); + if (err) + return err; =20 - cq->cqe =3D attr->cqe; - err =3D mana_ib_create_queue(mdev, ucmd.buf_addr, cq->cqe * COMP_ENTRY_S= IZE, - &cq->queue); + mana_ucontext =3D rdma_udata_to_drv_context(udata, struct mana_ib_ucontex= t, + ibucontext); + doorbell =3D mana_ucontext->doorbell; + + if (is_rnic_cq) { + err =3D mana_ib_gd_create_cq(mdev, cq, doorbell); if (err) { - ibdev_dbg(ibdev, "Failed to create queue for create cq, %d\n", err); - return err; + ibdev_dbg(ibdev, "Failed to create RNIC cq, %d\n", err); + goto err_destroy_queue; } =20 - mana_ucontext =3D rdma_udata_to_drv_context(udata, struct mana_ib_uconte= xt, - ibucontext); - doorbell =3D mana_ucontext->doorbell; - } else { - buf_size =3D MANA_PAGE_ALIGN(roundup_pow_of_two(attr->cqe * COMP_ENTRY_S= IZE)); - cq->cqe =3D buf_size / COMP_ENTRY_SIZE; - err =3D mana_ib_create_kernel_queue(mdev, buf_size, GDMA_CQ, &cq->queue); + err =3D mana_ib_install_cq_cb(mdev, cq); if (err) { - ibdev_dbg(ibdev, "Failed to create kernel queue for create cq, %d\n", e= rr); - return err; + ibdev_dbg(ibdev, "Failed to install cq callback, %d\n", err); + goto err_destroy_rnic_cq; } - doorbell =3D mdev->gdma_dev->doorbell; } =20 + resp.cqid =3D cq->queue.id; + err =3D ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen)); + if (err) { + ibdev_dbg(&mdev->ib_dev, "Failed to copy to udata, %d\n", err); + goto err_remove_cq_cb; + } + + spin_lock_init(&cq->cq_lock); + INIT_LIST_HEAD(&cq->list_send_qp); + INIT_LIST_HEAD(&cq->list_recv_qp); + + return 0; + +err_remove_cq_cb: + mana_ib_remove_cq_cb(mdev, cq); +err_destroy_rnic_cq: + mana_ib_gd_destroy_cq(mdev, cq); +err_destroy_queue: + mana_ib_destroy_queue(mdev, &cq->queue); + return err; +} + +int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, + struct uverbs_attr_bundle *attrs) +{ + struct mana_ib_cq *cq =3D container_of(ibcq, struct mana_ib_cq, ibcq); + struct ib_device *ibdev =3D ibcq->device; + struct mana_ib_dev *mdev; + bool is_rnic_cq; + u32 doorbell; + u32 buf_size; + int err; + + mdev =3D container_of(ibdev, struct mana_ib_dev, ib_dev); + + cq->comp_vector =3D attr->comp_vector % ibdev->num_comp_vectors; + cq->cq_handle =3D INVALID_MANA_HANDLE; + is_rnic_cq =3D mana_ib_is_rnic(mdev); + + buf_size =3D MANA_PAGE_ALIGN(roundup_pow_of_two(attr->cqe * COMP_ENTRY_SI= ZE)); + cq->cqe =3D buf_size / COMP_ENTRY_SIZE; + err =3D mana_ib_create_kernel_queue(mdev, buf_size, GDMA_CQ, &cq->queue); + if (err) { + ibdev_dbg(ibdev, "Failed to create kernel queue for create cq, %d\n", er= r); + return err; + } + doorbell =3D mdev->gdma_dev->doorbell; + if (is_rnic_cq) { err =3D mana_ib_gd_create_cq(mdev, cq, doorbell); if (err) { @@ -78,23 +133,12 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, } } =20 - if (udata) { - resp.cqid =3D cq->queue.id; - err =3D ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen)); - if (err) { - ibdev_dbg(&mdev->ib_dev, "Failed to copy to udata, %d\n", err); - goto err_remove_cq_cb; - } - } - spin_lock_init(&cq->cq_lock); INIT_LIST_HEAD(&cq->list_send_qp); INIT_LIST_HEAD(&cq->list_recv_qp); =20 return 0; =20 -err_remove_cq_cb: - mana_ib_remove_cq_cb(mdev, cq); err_destroy_rnic_cq: mana_ib_gd_destroy_cq(mdev, cq); err_destroy_queue: diff --git a/drivers/infiniband/hw/mana/device.c b/drivers/infiniband/hw/ma= na/device.c index ccc2279ca63c..c5c5fe051424 100644 --- a/drivers/infiniband/hw/mana/device.c +++ b/drivers/infiniband/hw/mana/device.c @@ -21,6 +21,7 @@ static const struct ib_device_ops mana_ib_dev_ops =3D { .alloc_ucontext =3D mana_ib_alloc_ucontext, .create_ah =3D mana_ib_create_ah, .create_cq =3D mana_ib_create_cq, + .create_user_cq =3D mana_ib_create_user_cq, .create_qp =3D mana_ib_create_qp, .create_rwq_ind_table =3D mana_ib_create_rwq_ind_table, .create_wq =3D mana_ib_create_wq, diff --git a/drivers/infiniband/hw/mana/main.c b/drivers/infiniband/hw/mana= /main.c index fac159f7128d..a871b8287dc9 100644 --- a/drivers/infiniband/hw/mana/main.c +++ b/drivers/infiniband/hw/mana/main.c @@ -261,35 +261,26 @@ int mana_ib_create_kernel_queue(struct mana_ib_dev *m= dev, u32 size, enum gdma_qu return 0; } =20 -int mana_ib_create_queue(struct mana_ib_dev *mdev, u64 addr, u32 size, +int mana_ib_create_queue(struct mana_ib_dev *mdev, struct mana_ib_queue *queue) { - struct ib_umem *umem; int err; =20 - queue->umem =3D NULL; queue->id =3D INVALID_QUEUE_ID; queue->gdma_region =3D GDMA_INVALID_DMA_REGION; =20 - umem =3D ib_umem_get(&mdev->ib_dev, addr, size, IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(umem)) { - ibdev_dbg(&mdev->ib_dev, "Failed to get umem, %pe\n", umem); - return PTR_ERR(umem); - } - - err =3D mana_ib_create_zero_offset_dma_region(mdev, umem, &queue->gdma_re= gion); + err =3D mana_ib_create_zero_offset_dma_region(mdev, queue->umem, + &queue->gdma_region); if (err) { - ibdev_dbg(&mdev->ib_dev, "Failed to create dma region, %d\n", err); - goto free_umem; + ibdev_dbg(&mdev->ib_dev, "Failed to create dma region, %d\n", + err); + return err; } - queue->umem =3D umem; =20 - ibdev_dbg(&mdev->ib_dev, "created dma region 0x%llx\n", queue->gdma_regio= n); + ibdev_dbg(&mdev->ib_dev, "created dma region 0x%llx\n", + queue->gdma_region); =20 return 0; -free_umem: - ib_umem_release(umem); - return err; } =20 void mana_ib_destroy_queue(struct mana_ib_dev *mdev, struct mana_ib_queue = *queue) diff --git a/drivers/infiniband/hw/mana/mana_ib.h b/drivers/infiniband/hw/m= ana/mana_ib.h index a7c8c0fd7019..3bc7c88dc136 100644 --- a/drivers/infiniband/hw/mana/mana_ib.h +++ b/drivers/infiniband/hw/mana/mana_ib.h @@ -624,7 +624,7 @@ int mana_ib_gd_destroy_dma_region(struct mana_ib_dev *d= ev, =20 int mana_ib_create_kernel_queue(struct mana_ib_dev *mdev, u32 size, enum g= dma_queue_type type, struct mana_ib_queue *queue); -int mana_ib_create_queue(struct mana_ib_dev *mdev, u64 addr, u32 size, +int mana_ib_create_queue(struct mana_ib_dev *mdev, struct mana_ib_queue *queue); void mana_ib_destroy_queue(struct mana_ib_dev *mdev, struct mana_ib_queue = *queue); =20 @@ -667,6 +667,8 @@ void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struc= t mana_ib_pd *pd, =20 int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, struct uverbs_attr_bundle *attrs); +int mana_ib_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_att= r *attr, + struct uverbs_attr_bundle *attrs); =20 int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); =20 diff --git a/drivers/infiniband/hw/mana/qp.c b/drivers/infiniband/hw/mana/q= p.c index 48c1f4977f21..b08dbc675741 100644 --- a/drivers/infiniband/hw/mana/qp.c +++ b/drivers/infiniband/hw/mana/qp.c @@ -326,11 +326,20 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, = struct ib_pd *ibpd, ibdev_dbg(&mdev->ib_dev, "ucmd sq_buf_addr 0x%llx port %u\n", ucmd.sq_buf_addr, ucmd.port); =20 - err =3D mana_ib_create_queue(mdev, ucmd.sq_buf_addr, ucmd.sq_buf_size, &q= p->raw_sq); + qp->raw_sq.umem =3D ib_umem_get(&mdev->ib_dev, ucmd.sq_buf_addr, + ucmd.sq_buf_size, IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(qp->raw_sq.umem)) { + err =3D PTR_ERR(qp->raw_sq.umem); + ibdev_dbg(&mdev->ib_dev, + "Failed to get umem for qp-raw, err %d\n", err); + goto err_free_vport; + } + + err =3D mana_ib_create_queue(mdev, &qp->raw_sq); if (err) { ibdev_dbg(&mdev->ib_dev, "Failed to create queue for create qp-raw, err %d\n", err); - goto err_free_vport; + goto err_release_umem; } =20 /* Create a WQ on the same port handle used by the Ethernet */ @@ -391,6 +400,10 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, s= truct ib_pd *ibpd, =20 err_destroy_queue: mana_ib_destroy_queue(mdev, &qp->raw_sq); + return err; + +err_release_umem: + ib_umem_release(qp->raw_sq.umem); =20 err_free_vport: mana_ib_uncfg_vport(mdev, pd, port); @@ -553,13 +566,25 @@ static int mana_ib_create_rc_qp(struct ib_qp *ibqp, s= truct ib_pd *ibpd, if (i =3D=3D MANA_RC_SEND_QUEUE_FMR) { qp->rc_qp.queues[i].id =3D INVALID_QUEUE_ID; qp->rc_qp.queues[i].gdma_region =3D GDMA_INVALID_DMA_REGION; + qp->rc_qp.queues[i].umem =3D NULL; continue; } - err =3D mana_ib_create_queue(mdev, ucmd.queue_buf[j], ucmd.queue_size[j], - &qp->rc_qp.queues[i]); + qp->rc_qp.queues[i].umem =3D ib_umem_get(&mdev->ib_dev, + ucmd.queue_buf[j], + ucmd.queue_size[j], + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(qp->rc_qp.queues[i].umem)) { + err =3D PTR_ERR(qp->rc_qp.queues[i].umem); + ibdev_err(&mdev->ib_dev, "Failed to get umem for queue %d, err %d\n", + i, err); + goto release_umems; + } + + err =3D mana_ib_create_queue(mdev, &qp->rc_qp.queues[i]); if (err) { ibdev_err(&mdev->ib_dev, "Failed to create queue %d, err %d\n", i, err); - goto destroy_queues; + ib_umem_release(qp->rc_qp.queues[i].umem); + goto release_umems; } j++; } @@ -598,6 +623,13 @@ static int mana_ib_create_rc_qp(struct ib_qp *ibqp, st= ruct ib_pd *ibpd, while (i-- > 0) mana_ib_destroy_queue(mdev, &qp->rc_qp.queues[i]); return err; + +release_umems: + while (i-- > 0) { + if (i !=3D MANA_RC_SEND_QUEUE_FMR) + ib_umem_release(qp->rc_qp.queues[i].umem); + } + return err; } =20 static void mana_add_qp_to_cqs(struct mana_ib_qp *qp) diff --git a/drivers/infiniband/hw/mana/wq.c b/drivers/infiniband/hw/mana/w= q.c index f959f4b9244f..be474aa8bdfc 100644 --- a/drivers/infiniband/hw/mana/wq.c +++ b/drivers/infiniband/hw/mana/wq.c @@ -31,11 +31,19 @@ struct ib_wq *mana_ib_create_wq(struct ib_pd *pd, =20 ibdev_dbg(&mdev->ib_dev, "ucmd wq_buf_addr 0x%llx\n", ucmd.wq_buf_addr); =20 - err =3D mana_ib_create_queue(mdev, ucmd.wq_buf_addr, ucmd.wq_buf_size, &w= q->queue); + wq->queue.umem =3D ib_umem_get(&mdev->ib_dev, ucmd.wq_buf_addr, + ucmd.wq_buf_size, IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(wq->queue.umem)) { + err =3D PTR_ERR(wq->queue.umem); + ibdev_dbg(&mdev->ib_dev, "Failed to get umem for create wq, %d\n", err); + goto err_free_wq; + } + + err =3D mana_ib_create_queue(mdev, &wq->queue); if (err) { ibdev_dbg(&mdev->ib_dev, "Failed to create queue for create wq, %d\n", err); - goto err_free_wq; + goto err_release_umem; } =20 wq->wqe =3D init_attr->max_wr; @@ -43,6 +51,8 @@ struct ib_wq *mana_ib_create_wq(struct ib_pd *pd, wq->rx_object =3D INVALID_MANA_HANDLE; return &wq->ibwq; =20 +err_release_umem: + ib_umem_release(wq->queue.umem); err_free_wq: kfree(wq); =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99434357A48; Fri, 13 Feb 2026 11:00:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980441; cv=none; b=e+zlhk46/PTqPwmtzpBSfDAhxzsrcCsEooc3OF92KfGpdu0r91/OUddBOnGv7W5raib5L/VidR4jeHGhPpblHzsZ4qWTbbYjXWPrSK5ygO4V871EOgtWxHufpu1r/QkWMw6gsWwYfYufiubg35A0H4WBZW8pejBETAwIRfxzGE0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980441; c=relaxed/simple; bh=1CctY2HBwLpkfQae2Bhsg6mecp9K8sByxfsXB098nls=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kiGO4/y5fImZe93obSkHfjb3HH7PWx3B06v/tH12TXswjSayOd8w/dR8aBAr71U0PSbL34SqUfnxdREMkxioiKDrN3PKbRgxxX2oyuHV37LytTphUKhT0ybXvDNBgQEYwWW/7uqEjnD1bVPOlD8xkpXcjtK0t0pXluSrPHgDasI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=h3MRYdf+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="h3MRYdf+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B04FAC116C6; Fri, 13 Feb 2026 11:00:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980441; bh=1CctY2HBwLpkfQae2Bhsg6mecp9K8sByxfsXB098nls=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h3MRYdf+fowSfICWWtLhL3Q+lVcefmx8y2DMYlv/emZejELGChqql3aGEuj6C9tWa lsLJ+junZEvuyxb74+DeR4AEPcDVuzrJsEZ5XKvMMoSWFv+egAjyJbNU246Z1H2hAW yYmTE1kG2TomNj63JnhHtsqtkgXxezQhy4b+lLzPc++pQfdUW/kyzMx6jZ9ni8C/uI hIuJ1ndut42HkNIiHBPHXFiUeUzjleC/1Yi/2rSjG7PLKXCkWSquRj/4s+q5F3yyNT 6djUi+sRbKFbfbOZptvxBk+M3cw8WY7KdZMA5Xa5tupL0P7gUVtcAeI+SyAKV1jP5d gjIOu8PIm2yig== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 26/50] RDMA/erdma: Separate user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:58:02 +0200 Message-ID: <20260213-refactor-umem-v1-26-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Split CQ creation into distinct kernel and user flows. The hns driver, inherited from mlx4, uses a problematic pattern that shares and caches umem in hns_roce_db_map_user(). This design blocks the driver from supporting generic umem sources (VMA, dmabuf, memfd, and others). In addition, let's delete counter that counts CQ creation errors. There are multiple ways to debug kernel in modern kernel without need to rely on that debugfs counter. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/hns/hns_roce_cq.c | 103 ++++++++++++++++++++---= ---- drivers/infiniband/hw/hns/hns_roce_debugfs.c | 1 - drivers/infiniband/hw/hns/hns_roce_device.h | 3 +- drivers/infiniband/hw/hns/hns_roce_main.c | 1 + 4 files changed, 82 insertions(+), 26 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_cq.c b/drivers/infiniband/h= w/hns/hns_roce_cq.c index 857a913326cd..0f24a916466b 100644 --- a/drivers/infiniband/hw/hns/hns_roce_cq.c +++ b/drivers/infiniband/hw/hns/hns_roce_cq.c @@ -335,7 +335,10 @@ static int verify_cq_create_attr(struct hns_roce_dev *= hr_dev, { struct ib_device *ibdev =3D &hr_dev->ib_dev; =20 - if (!attr->cqe || attr->cqe > hr_dev->caps.max_cqes) { + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > hr_dev->caps.max_cqes) { ibdev_err(ibdev, "failed to check CQ count %u, max =3D %u.\n", attr->cqe, hr_dev->caps.max_cqes); return -EINVAL; @@ -407,8 +410,8 @@ static int set_cqe_size(struct hns_roce_cq *hr_cq, stru= ct ib_udata *udata, return 0; } =20 -int hns_roce_create_cq(struct ib_cq *ib_cq, const struct ib_cq_init_attr *= attr, - struct uverbs_attr_bundle *attrs) +int hns_roce_create_user_cq(struct ib_cq *ib_cq, const struct ib_cq_init_a= ttr *attr, + struct uverbs_attr_bundle *attrs) { struct hns_roce_dev *hr_dev =3D to_hr_dev(ib_cq->device); struct ib_udata *udata =3D &attrs->driver_udata; @@ -418,31 +421,27 @@ int hns_roce_create_cq(struct ib_cq *ib_cq, const str= uct ib_cq_init_attr *attr, struct hns_roce_ib_create_cq ucmd =3D {}; int ret; =20 - if (attr->flags) { - ret =3D -EOPNOTSUPP; - goto err_out; - } + if (ib_cq->umem) + return -EOPNOTSUPP; =20 ret =3D verify_cq_create_attr(hr_dev, attr); if (ret) - goto err_out; + return ret; =20 - if (udata) { - ret =3D get_cq_ucmd(hr_cq, udata, &ucmd); - if (ret) - goto err_out; - } + ret =3D get_cq_ucmd(hr_cq, udata, &ucmd); + if (ret) + return ret; =20 set_cq_param(hr_cq, attr->cqe, attr->comp_vector, &ucmd); =20 ret =3D set_cqe_size(hr_cq, udata, &ucmd); if (ret) - goto err_out; + return ret; =20 ret =3D alloc_cq_buf(hr_dev, hr_cq, udata, ucmd.buf_addr); if (ret) { ibdev_err(ibdev, "failed to alloc CQ buf, ret =3D %d.\n", ret); - goto err_out; + return ret; } =20 ret =3D alloc_cq_db(hr_dev, hr_cq, udata, ucmd.db_addr, &resp); @@ -464,13 +463,11 @@ int hns_roce_create_cq(struct ib_cq *ib_cq, const str= uct ib_cq_init_attr *attr, goto err_cqn; } =20 - if (udata) { - resp.cqn =3D hr_cq->cqn; - ret =3D ib_copy_to_udata(udata, &resp, - min(udata->outlen, sizeof(resp))); - if (ret) - goto err_cqc; - } + resp.cqn =3D hr_cq->cqn; + ret =3D ib_copy_to_udata(udata, &resp, + min(udata->outlen, sizeof(resp))); + if (ret) + goto err_cqc; =20 hr_cq->cons_index =3D 0; hr_cq->arm_sn =3D 1; @@ -487,9 +484,67 @@ int hns_roce_create_cq(struct ib_cq *ib_cq, const stru= ct ib_cq_init_attr *attr, free_cq_db(hr_dev, hr_cq, udata); err_cq_buf: free_cq_buf(hr_dev, hr_cq); -err_out: - atomic64_inc(&hr_dev->dfx_cnt[HNS_ROCE_DFX_CQ_CREATE_ERR_CNT]); + return ret; +} + +int hns_roce_create_cq(struct ib_cq *ib_cq, const struct ib_cq_init_attr *= attr, + struct uverbs_attr_bundle *attrs) +{ + struct hns_roce_dev *hr_dev =3D to_hr_dev(ib_cq->device); + struct hns_roce_ib_create_cq_resp resp =3D {}; + struct hns_roce_cq *hr_cq =3D to_hr_cq(ib_cq); + struct ib_device *ibdev =3D &hr_dev->ib_dev; + struct hns_roce_ib_create_cq ucmd =3D {}; + int ret; + + ret =3D verify_cq_create_attr(hr_dev, attr); + if (ret) + return ret; + + set_cq_param(hr_cq, attr->cqe, attr->comp_vector, &ucmd); + + ret =3D set_cqe_size(hr_cq, NULL, &ucmd); + if (ret) + return ret; =20 + ret =3D alloc_cq_buf(hr_dev, hr_cq, NULL, 0); + if (ret) { + ibdev_err(ibdev, "failed to alloc CQ buf, ret =3D %d.\n", ret); + return ret; + } + + ret =3D alloc_cq_db(hr_dev, hr_cq, NULL, 0, &resp); + if (ret) { + ibdev_err(ibdev, "failed to alloc CQ db, ret =3D %d.\n", ret); + goto err_cq_buf; + } + + ret =3D alloc_cqn(hr_dev, hr_cq, NULL); + if (ret) { + ibdev_err(ibdev, "failed to alloc CQN, ret =3D %d.\n", ret); + goto err_cq_db; + } + + ret =3D alloc_cqc(hr_dev, hr_cq); + if (ret) { + ibdev_err(ibdev, + "failed to alloc CQ context, ret =3D %d.\n", ret); + goto err_cqn; + } + + hr_cq->cons_index =3D 0; + hr_cq->arm_sn =3D 1; + refcount_set(&hr_cq->refcount, 1); + init_completion(&hr_cq->free); + + return 0; + +err_cqn: + free_cqn(hr_dev, hr_cq->cqn); +err_cq_db: + free_cq_db(hr_dev, hr_cq, NULL); +err_cq_buf: + free_cq_buf(hr_dev, hr_cq); return ret; } =20 diff --git a/drivers/infiniband/hw/hns/hns_roce_debugfs.c b/drivers/infinib= and/hw/hns/hns_roce_debugfs.c index b869cdc54118..481b30f2f5b5 100644 --- a/drivers/infiniband/hw/hns/hns_roce_debugfs.c +++ b/drivers/infiniband/hw/hns/hns_roce_debugfs.c @@ -47,7 +47,6 @@ static const char * const sw_stat_info[] =3D { [HNS_ROCE_DFX_MBX_EVENT_CNT] =3D "mbx_event", [HNS_ROCE_DFX_QP_CREATE_ERR_CNT] =3D "qp_create_err", [HNS_ROCE_DFX_QP_MODIFY_ERR_CNT] =3D "qp_modify_err", - [HNS_ROCE_DFX_CQ_CREATE_ERR_CNT] =3D "cq_create_err", [HNS_ROCE_DFX_CQ_MODIFY_ERR_CNT] =3D "cq_modify_err", [HNS_ROCE_DFX_SRQ_CREATE_ERR_CNT] =3D "srq_create_err", [HNS_ROCE_DFX_SRQ_MODIFY_ERR_CNT] =3D "srq_modify_err", diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniba= nd/hw/hns/hns_roce_device.h index 3f032b8038af..fdc5f487d7a3 100644 --- a/drivers/infiniband/hw/hns/hns_roce_device.h +++ b/drivers/infiniband/hw/hns/hns_roce_device.h @@ -902,7 +902,6 @@ enum hns_roce_sw_dfx_stat_index { HNS_ROCE_DFX_MBX_EVENT_CNT, HNS_ROCE_DFX_QP_CREATE_ERR_CNT, HNS_ROCE_DFX_QP_MODIFY_ERR_CNT, - HNS_ROCE_DFX_CQ_CREATE_ERR_CNT, HNS_ROCE_DFX_CQ_MODIFY_ERR_CNT, HNS_ROCE_DFX_SRQ_CREATE_ERR_CNT, HNS_ROCE_DFX_SRQ_MODIFY_ERR_CNT, @@ -1295,6 +1294,8 @@ int to_hr_qp_type(int qp_type); =20 int hns_roce_create_cq(struct ib_cq *ib_cq, const struct ib_cq_init_attr *= attr, struct uverbs_attr_bundle *attrs); +int hns_roce_create_user_cq(struct ib_cq *ib_cq, const struct ib_cq_init_a= ttr *attr, + struct uverbs_attr_bundle *attrs); =20 int hns_roce_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata); int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long = virt, diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband= /hw/hns/hns_roce_main.c index a3490bab297a..64de49bf8df7 100644 --- a/drivers/infiniband/hw/hns/hns_roce_main.c +++ b/drivers/infiniband/hw/hns/hns_roce_main.c @@ -727,6 +727,7 @@ static const struct ib_device_ops hns_roce_dev_ops =3D { .create_ah =3D hns_roce_create_ah, .create_user_ah =3D hns_roce_create_ah, .create_cq =3D hns_roce_create_cq, + .create_user_cq =3D hns_roce_create_user_cq, .create_qp =3D hns_roce_create_qp, .dealloc_pd =3D hns_roce_dealloc_pd, .dealloc_ucontext =3D hns_roce_dealloc_ucontext, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60952357A20; Fri, 13 Feb 2026 11:00:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980434; cv=none; b=blrjHMre50gQSBYEGiPTIKPbbeVPJx9Ez1R2VHrYTfP9i2z/anfgcW6n4Yl1r8IMaUeIXp+Zq+9mHIRYEoKmf2u17XGmgRLirylHJ9eCGPiwYai+U6qXFp2C7M/uLfDPoIu5FYvhUGCg6YnapIfCZpFwScP6FSAvMsnsgdgU5rQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980434; c=relaxed/simple; bh=CfrMYU/15f4o2XvVTfBv9vkCjczWWAriZsLMaye5SOY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=iQEL6gWArUfaYMs7Eug0Q4PTkkbseupKtoSdXD4IBQRt6QI3ewuCA4dWVR0mwTWU5AVQmBCs/oEWkhjLgScesoVFlcPmxdw6RiLkqYSj6sy6mORW/Ez/bT3mVzSRqe5IVx2OymNkZNhbUDQ8SCYta/WZGnkZbectbrHNtPhSG7s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uMJrFKtV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uMJrFKtV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70135C19424; Fri, 13 Feb 2026 11:00:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980434; bh=CfrMYU/15f4o2XvVTfBv9vkCjczWWAriZsLMaye5SOY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uMJrFKtVI2JIyTWDjhNcZlNAmVSEOfnL0xM5gvfDvOgi5aZuD8TKA/I46F8goWd0u d7OSscH5aIrjU4dDy8WIFxb8KD3VENziaf0//CuZZKIcxV88+Sawjtsh4TSy1oTSPM kBVbGQjeFqhoKPal2m03tfaK+7OGBvqtOUzjkATQK5x7s6ng6sBmA8xWgcTByGE5m2 McG1JsFno7R6KMYgdqEkqC80t378P4YtxUx5hzE/Hgmz+xky+obZYHzcM3ypROc18s cFhzkXyLrRs+Shm6AbdlvG8WPq7j297fRqOReegAcxNFnmcTliqe9XuMqEqVXiQ5ha yyARplxu5mhAQ== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 27/50] RDMA/rdmavt: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:58:03 +0200 Message-ID: <20260213-refactor-umem-v1-27-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the CQ creation logic into distinct kernel and user flows. Signed-off-by: Leon Romanovsky --- drivers/infiniband/sw/rdmavt/cq.c | 144 +++++++++++++++++++++++++++-------= ---- drivers/infiniband/sw/rdmavt/cq.h | 2 + drivers/infiniband/sw/rdmavt/vt.c | 1 + 3 files changed, 106 insertions(+), 41 deletions(-) diff --git a/drivers/infiniband/sw/rdmavt/cq.c b/drivers/infiniband/sw/rdma= vt/cq.c index e7835ca70e2b..db86eb026bb3 100644 --- a/drivers/infiniband/sw/rdmavt/cq.c +++ b/drivers/infiniband/sw/rdmavt/cq.c @@ -147,33 +147,32 @@ static void send_complete(struct work_struct *work) } =20 /** - * rvt_create_cq - create a completion queue + * rvt_create_user_cq - create a completion queue for userspace * @ibcq: Allocated CQ * @attr: creation attributes * @attrs: uverbs bundle * - * Called by ib_create_cq() in the generic verbs code. + * Called by ib_create_cq() in the generic verbs code for userspace CQs. * * Return: 0 on success */ -int rvt_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, - struct uverbs_attr_bundle *attrs) +int rvt_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *ibdev =3D ibcq->device; struct rvt_dev_info *rdi =3D ib_to_rvt(ibdev); struct rvt_cq *cq =3D ibcq_to_rvtcq(ibcq); - struct rvt_cq_wc *u_wc =3D NULL; - struct rvt_k_cq_wc *k_wc =3D NULL; + struct rvt_cq_wc *u_wc; u32 sz; unsigned int entries =3D attr->cqe; int comp_vector =3D attr->comp_vector; int err; =20 - if (attr->flags) + if (attr->flags || ibcq->umem) return -EOPNOTSUPP; =20 - if (entries < 1 || entries > rdi->dparms.props.max_cqe) + if (entries > rdi->dparms.props.max_cqe) return -EINVAL; =20 if (comp_vector < 0) @@ -188,37 +187,27 @@ int rvt_create_cq(struct ib_cq *ibcq, const struct ib= _cq_init_attr *attr, * We need to use vmalloc() in order to support mmap and large * numbers of entries. */ - if (udata && udata->outlen >=3D sizeof(__u64)) { - sz =3D sizeof(struct ib_uverbs_wc) * (entries + 1); - sz +=3D sizeof(*u_wc); - u_wc =3D vmalloc_user(sz); - if (!u_wc) - return -ENOMEM; - } else { - sz =3D sizeof(struct ib_wc) * (entries + 1); - sz +=3D sizeof(*k_wc); - k_wc =3D vzalloc_node(sz, rdi->dparms.node); - if (!k_wc) - return -ENOMEM; - } + sz =3D sizeof(struct ib_uverbs_wc) * (entries + 1); + sz +=3D sizeof(*u_wc); + u_wc =3D vmalloc_user(sz); + if (!u_wc) + return -ENOMEM; =20 /* * Return the address of the WC as the offset to mmap. * See rvt_mmap() for details. */ - if (udata && udata->outlen >=3D sizeof(__u64)) { - cq->ip =3D rvt_create_mmap_info(rdi, sz, udata, u_wc); - if (IS_ERR(cq->ip)) { - err =3D PTR_ERR(cq->ip); - goto bail_wc; - } - - err =3D ib_copy_to_udata(udata, &cq->ip->offset, - sizeof(cq->ip->offset)); - if (err) - goto bail_ip; + cq->ip =3D rvt_create_mmap_info(rdi, sz, udata, u_wc); + if (IS_ERR(cq->ip)) { + err =3D PTR_ERR(cq->ip); + goto bail_wc; } =20 + err =3D ib_copy_to_udata(udata, &cq->ip->offset, + sizeof(cq->ip->offset)); + if (err) + goto bail_ip; + spin_lock_irq(&rdi->n_cqs_lock); if (rdi->n_cqs_allocated =3D=3D rdi->dparms.props.max_cq) { spin_unlock_irq(&rdi->n_cqs_lock); @@ -229,11 +218,9 @@ int rvt_create_cq(struct ib_cq *ibcq, const struct ib_= cq_init_attr *attr, rdi->n_cqs_allocated++; spin_unlock_irq(&rdi->n_cqs_lock); =20 - if (cq->ip) { - spin_lock_irq(&rdi->pending_lock); - list_add(&cq->ip->pending_mmaps, &rdi->pending_mmaps); - spin_unlock_irq(&rdi->pending_lock); - } + spin_lock_irq(&rdi->pending_lock); + list_add(&cq->ip->pending_mmaps, &rdi->pending_mmaps); + spin_unlock_irq(&rdi->pending_lock); =20 /* * ib_create_cq() will initialize cq->ibcq except for cq->ibcq.cqe. @@ -252,10 +239,7 @@ int rvt_create_cq(struct ib_cq *ibcq, const struct ib_= cq_init_attr *attr, cq->notify =3D RVT_CQ_NONE; spin_lock_init(&cq->lock); INIT_WORK(&cq->comptask, send_complete); - if (u_wc) - cq->queue =3D u_wc; - else - cq->kqueue =3D k_wc; + cq->queue =3D u_wc; =20 trace_rvt_create_cq(cq, attr); return 0; @@ -264,6 +248,84 @@ int rvt_create_cq(struct ib_cq *ibcq, const struct ib_= cq_init_attr *attr, kfree(cq->ip); bail_wc: vfree(u_wc); + return err; +} + +/** + * rvt_create_cq - create a completion queue for kernel + * @ibcq: Allocated CQ + * @attr: creation attributes + * @attrs: uverbs bundle + * + * Called by ib_create_cq() in the generic verbs code for kernel CQs. + * + * Return: 0 on success + */ +int rvt_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *ibdev =3D ibcq->device; + struct rvt_dev_info *rdi =3D ib_to_rvt(ibdev); + struct rvt_cq *cq =3D ibcq_to_rvtcq(ibcq); + struct rvt_k_cq_wc *k_wc; + u32 sz; + unsigned int entries =3D attr->cqe; + int comp_vector =3D attr->comp_vector; + int err; + + if (attr->flags) + return -EOPNOTSUPP; + + if (entries > rdi->dparms.props.max_cqe) + return -EINVAL; + + if (comp_vector < 0) + comp_vector =3D 0; + + comp_vector =3D comp_vector % rdi->ibdev.num_comp_vectors; + + /* + * Allocate the completion queue entries and head/tail pointers. + */ + sz =3D sizeof(struct ib_wc) * (entries + 1); + sz +=3D sizeof(*k_wc); + k_wc =3D vzalloc_node(sz, rdi->dparms.node); + if (!k_wc) + return -ENOMEM; + + spin_lock_irq(&rdi->n_cqs_lock); + if (rdi->n_cqs_allocated =3D=3D rdi->dparms.props.max_cq) { + spin_unlock_irq(&rdi->n_cqs_lock); + err =3D -ENOMEM; + goto bail_wc; + } + + rdi->n_cqs_allocated++; + spin_unlock_irq(&rdi->n_cqs_lock); + + /* + * ib_create_cq() will initialize cq->ibcq except for cq->ibcq.cqe. + * The number of entries should be >=3D the number requested or return + * an error. + */ + cq->rdi =3D rdi; + if (rdi->driver_f.comp_vect_cpu_lookup) + cq->comp_vector_cpu =3D + rdi->driver_f.comp_vect_cpu_lookup(rdi, comp_vector); + else + cq->comp_vector_cpu =3D + cpumask_first(cpumask_of_node(rdi->dparms.node)); + + cq->ibcq.cqe =3D entries; + cq->notify =3D RVT_CQ_NONE; + spin_lock_init(&cq->lock); + INIT_WORK(&cq->comptask, send_complete); + cq->kqueue =3D k_wc; + + trace_rvt_create_cq(cq, attr); + return 0; + +bail_wc: vfree(k_wc); return err; } diff --git a/drivers/infiniband/sw/rdmavt/cq.h b/drivers/infiniband/sw/rdma= vt/cq.h index 4028702a7b2f..14ee2705c443 100644 --- a/drivers/infiniband/sw/rdmavt/cq.h +++ b/drivers/infiniband/sw/rdmavt/cq.h @@ -11,6 +11,8 @@ =20 int rvt_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); +int rvt_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *a= ttr, + struct uverbs_attr_bundle *attrs); int rvt_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); int rvt_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags notify_f= lags); int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata); diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdma= vt/vt.c index d22d610c2696..15964400b8d3 100644 --- a/drivers/infiniband/sw/rdmavt/vt.c +++ b/drivers/infiniband/sw/rdmavt/vt.c @@ -333,6 +333,7 @@ static const struct ib_device_ops rvt_dev_ops =3D { .attach_mcast =3D rvt_attach_mcast, .create_ah =3D rvt_create_ah, .create_cq =3D rvt_create_cq, + .create_user_cq =3D rvt_create_user_cq, .create_qp =3D rvt_create_qp, .create_srq =3D rvt_create_srq, .create_user_ah =3D rvt_create_ah, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5ED351F03EF; Fri, 13 Feb 2026 11:00:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980438; cv=none; b=E3fw5D71xqxQUvgaYZZ1Oe/Q5KuzilqmnkETH/rqZpvVonc0v8BvV2Frgk5m2zjn4pliE7jmJJvYMdRggxS4+3Gde6ZdGedn7b+UXzTbTmNtaWTdu6fQee5SuI+ZwWpbnlqC5Jrtgw25f6d9elNMO6jjPuIYTpH7qNx+ra8yA9E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980438; c=relaxed/simple; bh=lO34ijZAFdv5MXws8lPiMPsCemhr7GqNyljZmJLSdMo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=T/E6rAORBFZqInz0aw7HzJ3HfVc6/O2eTLEU/4ALK+nzERQtaVfzp9MmpPMTmEj9GdFzJHckdrY4SBtEMdMk8I41Z+NVdoZIxUoS4/VozRWuJ5EMq0o3OdicOaIkWzq8SCdS2JhJOBleA3Owjm61719xe4BqxH7WeCMNyMEjAXA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OQsyLbX0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OQsyLbX0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 363B2C16AAE; Fri, 13 Feb 2026 11:00:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980437; bh=lO34ijZAFdv5MXws8lPiMPsCemhr7GqNyljZmJLSdMo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OQsyLbX07Wd4X+KOi9GPiRxqhZqgk47Pm1cOoHdR7jbavG0svkRZu7FCg+cIYcmGK /2ATr4WULSKbyztLNbV5MdldX1QQltX6LTnQcp6VIja2goeY1gduWa1NUQiQ5w9saf 4efkmrJX9uNDXSxBmDzjXVTAOor/plFlRURBv35cJBAK8l97uuRBh/52WWRbXd2OK7 2c6N11HDk0xAo0ije+0M5ppYh6M41Qhk1V6ludoxSTwiwmTw5xJ3+Gi7cQxcPjs+tI TK7PCyrxDXU19bYClVh/5b4sYcJ+qxinnU9ZjGeXjFmB+DK6z1VoEzhGKCWWyrA7AO ycanOFk9Lwr0g== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 28/50] RDMA/siw: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:58:04 +0200 Message-ID: <20260213-refactor-umem-v1-28-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the CQ creation logic into distinct kernel and user flows. Signed-off-by: Leon Romanovsky --- drivers/infiniband/sw/siw/siw_main.c | 1 + drivers/infiniband/sw/siw/siw_verbs.c | 111 +++++++++++++++++++++++-------= ---- drivers/infiniband/sw/siw/siw_verbs.h | 2 + 3 files changed, 80 insertions(+), 34 deletions(-) diff --git a/drivers/infiniband/sw/siw/siw_main.c b/drivers/infiniband/sw/s= iw/siw_main.c index 5168307229a9..75dcf3578eac 100644 --- a/drivers/infiniband/sw/siw/siw_main.c +++ b/drivers/infiniband/sw/siw/siw_main.c @@ -232,6 +232,7 @@ static const struct ib_device_ops siw_device_ops =3D { .alloc_pd =3D siw_alloc_pd, .alloc_ucontext =3D siw_alloc_ucontext, .create_cq =3D siw_create_cq, + .create_user_cq =3D siw_create_user_cq, .create_qp =3D siw_create_qp, .create_srq =3D siw_create_srq, .dealloc_driver =3D siw_device_cleanup, diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/= siw/siw_verbs.c index efa2f097b582..92b25b389b69 100644 --- a/drivers/infiniband/sw/siw/siw_verbs.c +++ b/drivers/infiniband/sw/siw/siw_verbs.c @@ -1139,15 +1139,15 @@ int siw_destroy_cq(struct ib_cq *base_cq, struct ib= _udata *udata) * @attrs: uverbs bundle */ =20 -int siw_create_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr *att= r, - struct uverbs_attr_bundle *attrs) +int siw_create_user_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr= *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct siw_device *sdev =3D to_siw_dev(base_cq->device); struct siw_cq *cq =3D to_siw_cq(base_cq); int rv, size =3D attr->cqe; =20 - if (attr->flags) + if (attr->flags || base_cq->umem) return -EOPNOTSUPP; =20 if (atomic_inc_return(&sdev->num_cq) > SIW_MAX_CQ) { @@ -1155,7 +1155,7 @@ int siw_create_cq(struct ib_cq *base_cq, const struct= ib_cq_init_attr *attr, rv =3D -ENOMEM; goto err_out; } - if (size < 1 || size > sdev->attrs.max_cqe) { + if (attr->cqe > sdev->attrs.max_cqe) { siw_dbg(base_cq->device, "CQ size error: %d\n", size); rv =3D -EINVAL; goto err_out; @@ -1164,13 +1164,8 @@ int siw_create_cq(struct ib_cq *base_cq, const struc= t ib_cq_init_attr *attr, cq->base_cq.cqe =3D size; cq->num_cqe =3D size; =20 - if (udata) - cq->queue =3D vmalloc_user(size * sizeof(struct siw_cqe) + - sizeof(struct siw_cq_ctrl)); - else - cq->queue =3D vzalloc(size * sizeof(struct siw_cqe) + - sizeof(struct siw_cq_ctrl)); - + cq->queue =3D vmalloc_user(size * sizeof(struct siw_cqe) + + sizeof(struct siw_cq_ctrl)); if (cq->queue =3D=3D NULL) { rv =3D -ENOMEM; goto err_out; @@ -1182,33 +1177,32 @@ int siw_create_cq(struct ib_cq *base_cq, const stru= ct ib_cq_init_attr *attr, =20 cq->notify =3D (struct siw_cq_ctrl *)&cq->queue[size]; =20 - if (udata) { - struct siw_uresp_create_cq uresp =3D {}; - struct siw_ucontext *ctx =3D - rdma_udata_to_drv_context(udata, struct siw_ucontext, - base_ucontext); - size_t length =3D size * sizeof(struct siw_cqe) + - sizeof(struct siw_cq_ctrl); + struct siw_uresp_create_cq uresp =3D {}; + struct siw_ucontext *ctx =3D + rdma_udata_to_drv_context(udata, struct siw_ucontext, + base_ucontext); + size_t length =3D size * sizeof(struct siw_cqe) + + sizeof(struct siw_cq_ctrl); =20 - cq->cq_entry =3D - siw_mmap_entry_insert(ctx, cq->queue, - length, &uresp.cq_key); - if (!cq->cq_entry) { - rv =3D -ENOMEM; - goto err_out; - } + cq->cq_entry =3D + siw_mmap_entry_insert(ctx, cq->queue, + length, &uresp.cq_key); + if (!cq->cq_entry) { + rv =3D -ENOMEM; + goto err_out; + } =20 - uresp.cq_id =3D cq->id; - uresp.num_cqe =3D size; + uresp.cq_id =3D cq->id; + uresp.num_cqe =3D size; =20 - if (udata->outlen < sizeof(uresp)) { - rv =3D -EINVAL; - goto err_out; - } - rv =3D ib_copy_to_udata(udata, &uresp, sizeof(uresp)); - if (rv) - goto err_out; + if (udata->outlen < sizeof(uresp)) { + rv =3D -EINVAL; + goto err_out; } + rv =3D ib_copy_to_udata(udata, &uresp, sizeof(uresp)); + if (rv) + goto err_out; + return 0; =20 err_out: @@ -1227,6 +1221,55 @@ int siw_create_cq(struct ib_cq *base_cq, const struc= t ib_cq_init_attr *attr, return rv; } =20 +int siw_create_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr *att= r, + struct uverbs_attr_bundle *attrs) +{ + struct siw_device *sdev =3D to_siw_dev(base_cq->device); + struct siw_cq *cq =3D to_siw_cq(base_cq); + int rv, size =3D attr->cqe; + + if (attr->flags) + return -EOPNOTSUPP; + + if (atomic_inc_return(&sdev->num_cq) > SIW_MAX_CQ) { + siw_dbg(base_cq->device, "too many CQ's\n"); + rv =3D -ENOMEM; + goto err_out; + } + if (size < 1 || size > sdev->attrs.max_cqe) { + siw_dbg(base_cq->device, "CQ size error: %d\n", size); + rv =3D -EINVAL; + goto err_out; + } + size =3D roundup_pow_of_two(size); + cq->base_cq.cqe =3D size; + cq->num_cqe =3D size; + + cq->queue =3D vzalloc(size * sizeof(struct siw_cqe) + + sizeof(struct siw_cq_ctrl)); + if (cq->queue =3D=3D NULL) { + rv =3D -ENOMEM; + goto err_out; + } + get_random_bytes(&cq->id, 4); + siw_dbg(base_cq->device, "new CQ [%u]\n", cq->id); + + spin_lock_init(&cq->lock); + + cq->notify =3D (struct siw_cq_ctrl *)&cq->queue[size]; + + return 0; + +err_out: + siw_dbg(base_cq->device, "CQ creation failed: %d", rv); + + if (cq->queue) + vfree(cq->queue); + atomic_dec(&sdev->num_cq); + + return rv; +} + /* * siw_poll_cq() * diff --git a/drivers/infiniband/sw/siw/siw_verbs.h b/drivers/infiniband/sw/= siw/siw_verbs.h index e9f4463aecdc..527c356b55af 100644 --- a/drivers/infiniband/sw/siw/siw_verbs.h +++ b/drivers/infiniband/sw/siw/siw_verbs.h @@ -44,6 +44,8 @@ int siw_query_device(struct ib_device *base_dev, struct i= b_device_attr *attr, struct ib_udata *udata); int siw_create_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr *att= r, struct uverbs_attr_bundle *attrs); +int siw_create_user_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr= *attr, + struct uverbs_attr_bundle *attrs); int siw_query_port(struct ib_device *base_dev, u32 port, struct ib_port_attr *attr); int siw_query_gid(struct ib_device *base_dev, u32 port, int idx, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AF07335F8D1; Fri, 13 Feb 2026 11:00:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980452; cv=none; b=GrJfdly1WKm0mhhHs8bpNk7bsdCepYBOxqgSFh3vWMzf3vah54pVYfIXfdMiU9rTBknwrxk7ketbRyCz8Kha5EhhaCcRRIl7tOMRnB4jddArl3zEtaivtWfyyhHQf0exVzPY+5DxOqPWWJuqP+c/KCINQaqBjpCg3Ra/8K730ZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980452; c=relaxed/simple; bh=50qG2y5fbQy5Qu3vQ5GMSNOhKd9VjZpb7hrkivZKUF0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pL36tesiLriiu98TO6+WopIjgGMCPEIP9Cm0wOivPlrTwjRGXNchdLqciV4UuzaetBnl94LDFS+0/EIR3MbKB5qBE8kf8688xAGvapBtuz/Yjsf27EtOsUyM2OdkbcdiJRZ0a5naPlWxlBEiA0HSzdBFCKwcDgZSqvYL05xpe1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iNQ8039N; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iNQ8039N" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AF500C116C6; Fri, 13 Feb 2026 11:00:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980452; bh=50qG2y5fbQy5Qu3vQ5GMSNOhKd9VjZpb7hrkivZKUF0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iNQ8039NrIVSCwVGb42NPQhWrtdZI6BEGf3kdgt10LNUfPlVvdrvC9aFbqux2814v Q6Hx/eGuJUbiciVHJJTVC0PE7/HnQEptVYgGRlZRozvPdNglmd7EU3vi1uVioqsWXY u72yd/ptaS/utW9GMMHForver2HIdD7Azzx7eq5emHS1mR9Q3UoTNoYOIzIVkIqm75 Ub3aELkOYY+EGfjiEjW523Dk6j8Q0Lc3Qid95/I3HGiy+lTPr2bZvnhvbfqyf/JLaT uSk6JOLCyjIb3MnMZqo5CN0l3CcESnxh4cHPVMYgXLyWxlKAEdIdf2A8SvKh6ASM6T cRCoNHtzUtMqg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 29/50] RDMA/rxe: Split user and kernel CQ creation paths Date: Fri, 13 Feb 2026 12:58:05 +0200 Message-ID: <20260213-refactor-umem-v1-29-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Separate the CQ creation logic into distinct kernel and user flows. Signed-off-by: Leon Romanovsky --- drivers/infiniband/sw/rxe/rxe_verbs.c | 81 ++++++++++++++++++++-----------= ---- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/= rxe/rxe_verbs.c index 38d8c408320f..1e651bdd8622 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.c +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c @@ -1072,58 +1072,70 @@ static int rxe_post_recv(struct ib_qp *ibqp, const = struct ib_recv_wr *wr, } =20 /* cq */ -static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr = *attr, - struct uverbs_attr_bundle *attrs) +static int rxe_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_= attr *attr, + struct uverbs_attr_bundle *attrs) { struct ib_udata *udata =3D &attrs->driver_udata; struct ib_device *dev =3D ibcq->device; struct rxe_dev *rxe =3D to_rdev(dev); struct rxe_cq *cq =3D to_rcq(ibcq); - struct rxe_create_cq_resp __user *uresp =3D NULL; - int err, cleanup_err; + struct rxe_create_cq_resp __user *uresp; + int err; =20 - if (udata) { - if (udata->outlen < sizeof(*uresp)) { - err =3D -EINVAL; - rxe_dbg_dev(rxe, "malformed udata, err =3D %d\n", err); - goto err_out; - } - uresp =3D udata->outbuf; - } + if (udata->outlen < sizeof(*uresp)) + return -EINVAL; =20 - if (attr->flags) { - err =3D -EOPNOTSUPP; - rxe_dbg_dev(rxe, "bad attr->flags, err =3D %d\n", err); - goto err_out; - } + uresp =3D udata->outbuf; =20 - err =3D rxe_cq_chk_attr(rxe, NULL, attr->cqe, attr->comp_vector); - if (err) { - rxe_dbg_dev(rxe, "bad init attributes, err =3D %d\n", err); - goto err_out; - } + if (attr->flags || ibcq->umem) + return -EOPNOTSUPP; + + if (attr->cqe > rxe->attr.max_cqe) + return -EINVAL; =20 err =3D rxe_add_to_pool(&rxe->cq_pool, cq); - if (err) { - rxe_dbg_dev(rxe, "unable to create cq, err =3D %d\n", err); - goto err_out; - } + if (err) + return err; =20 err =3D rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, udata, uresp); - if (err) { - rxe_dbg_cq(cq, "create cq failed, err =3D %d\n", err); + if (err) goto err_cleanup; - } =20 return 0; =20 err_cleanup: - cleanup_err =3D rxe_cleanup(cq); - if (cleanup_err) - rxe_err_cq(cq, "cleanup failed, err =3D %d\n", cleanup_err); -err_out: - rxe_err_dev(rxe, "returned err =3D %d\n", err); + rxe_cleanup(cq); + return err; +} + +static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr = *attr, + struct uverbs_attr_bundle *attrs) +{ + struct ib_device *dev =3D ibcq->device; + struct rxe_dev *rxe =3D to_rdev(dev); + struct rxe_cq *cq =3D to_rcq(ibcq); + int err; + + if (attr->flags) + return -EOPNOTSUPP; + + if (attr->cqe > rxe->attr.max_cqe) + return -EINVAL; + + err =3D rxe_add_to_pool(&rxe->cq_pool, cq); + if (err) + return err; + + err =3D rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, NULL, + NULL); + if (err) + goto err_cleanup; + + return 0; + +err_cleanup: + rxe_cleanup(cq); return err; } =20 @@ -1478,6 +1490,7 @@ static const struct ib_device_ops rxe_dev_ops =3D { .attach_mcast =3D rxe_attach_mcast, .create_ah =3D rxe_create_ah, .create_cq =3D rxe_create_cq, + .create_user_cq =3D rxe_create_user_cq, .create_qp =3D rxe_create_qp, .create_srq =3D rxe_create_srq, .create_user_ah =3D rxe_create_ah, --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2FD1635E558; Fri, 13 Feb 2026 11:00:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980445; cv=none; b=thqpN1kT8+DFlHUQ1h+Op9MxFWoQ1g03+vzXbkraKnwOGZsXmYcWobnyBo/wYTLSKZKgBm3dTEZrfFZlJtjY6nWPXPtjbtn7Ncc/WPVyR+/ONmLRiTK7vKbwcaYdc3RrR0iUL2IZBZwO3aIsse3SJe+uNc9RhMyVwjHkmhSCDLI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980445; c=relaxed/simple; bh=2nVLE73sT2uaUudlFaxYimETRxX/g6qBtDOZjvSQO0I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=N0djZfXcNcHbHwr+0KOzQbyJuOIGWPvWAUReVIcUtB7vAGa5oAfvd90wlNV6O9UoarazuLOSQfCwxh1nDKigk20lJopPj7YBhVD6Wn1MTo/Kszi+h1xfuf31vDCU8ZAlYR5IHatci0mZ3qWB2jb+BEoxbEOOSCaOUmVgkLJFnmM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cDYe/qQb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cDYe/qQb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6D06EC116C6; Fri, 13 Feb 2026 11:00:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980445; bh=2nVLE73sT2uaUudlFaxYimETRxX/g6qBtDOZjvSQO0I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cDYe/qQbdAS++XO3ZDdALH5QDW1EbZV+dBVWefvD5H7nNwAPz8tcSUOyl/i1VaQ6w xiDySHBCW7fLfIy4Rx09MdsCZR/mb7kaC+bZ7NxHGcR5+bWDHgX+g+gu71zDHMfTrJ /SCNJyoA5Z6Bw+qS+tgz50JQiD9teIlqslUq8gA4CSe1aSnQ/8ITIDBleT8RjA2z/k SUiTFXuxXMnzTpZ0Mi0UzvC3jJ5LgJHSbxjhjSmjN8Hk+JGpKDo925odrLy6mbIXju C39xhF4URUo95wlwgdgHdLUeuDu4VrlUe0kyW2v21THFUUiKhvwxzpXiMtmPo8ZjaF sP4bzB1EyaSdA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 30/50] RDMA/core: Remove legacy CQ creation fallback path Date: Fri, 13 Feb 2026 12:58:06 +0200 Message-ID: <20260213-refactor-umem-v1-30-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky All drivers now support the modern CQ creation interface via the create_user_cq callback. Remove the legacy fallback to create_cq for userspace CQ creation. This simplifies the core code by eliminating conditional logic and ensures all userspace CQ creation goes through the modern interface that properly supports user-supplied umem. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/uverbs_cmd.c | 9 +++------ drivers/infiniband/core/uverbs_std_types_cq.c | 8 ++------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index 041bed7a43b4..cdfee86fb800 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1071,10 +1071,7 @@ static int create_cq(struct uverbs_attr_bundle *attr= s, rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); rdma_restrack_set_name(&cq->res, NULL); =20 - if (ib_dev->ops.create_user_cq) - ret =3D ib_dev->ops.create_user_cq(cq, &attr, attrs); - else - ret =3D ib_dev->ops.create_cq(cq, &attr, attrs); + ret =3D ib_dev->ops.create_user_cq(cq, &attr, attrs); if (ret) goto err_free; rdma_restrack_add(&cq->res); @@ -3791,7 +3788,7 @@ const struct uapi_definition uverbs_def_write_intf[] = =3D { UAPI_DEF_WRITE_UDATA_IO( struct ib_uverbs_create_cq, struct ib_uverbs_create_cq_resp), - UAPI_DEF_METHOD_NEEDS_FN(create_cq)), + UAPI_DEF_METHOD_NEEDS_FN(create_user_cq)), DECLARE_UVERBS_WRITE( IB_USER_VERBS_CMD_DESTROY_CQ, ib_uverbs_destroy_cq, @@ -3822,7 +3819,7 @@ const struct uapi_definition uverbs_def_write_intf[] = =3D { reserved, struct ib_uverbs_ex_create_cq_resp, response_length), - UAPI_DEF_METHOD_NEEDS_FN(create_cq)), + UAPI_DEF_METHOD_NEEDS_FN(create_user_cq)), DECLARE_UVERBS_WRITE_EX( IB_USER_VERBS_EX_CMD_MODIFY_CQ, ib_uverbs_ex_modify_cq, diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infini= band/core/uverbs_std_types_cq.c index d2c8f71f934c..a12e3184dd5c 100644 --- a/drivers/infiniband/core/uverbs_std_types_cq.c +++ b/drivers/infiniband/core/uverbs_std_types_cq.c @@ -78,8 +78,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( int buffer_fd; int ret; =20 - if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_user_cq) || - !ib_dev->ops.destroy_cq) + if (!ib_dev->ops.create_user_cq || !ib_dev->ops.destroy_cq) return -EOPNOTSUPP; =20 ret =3D uverbs_copy_from(&attr.comp_vector, attrs, @@ -200,10 +199,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); rdma_restrack_set_name(&cq->res, NULL); =20 - if (ib_dev->ops.create_user_cq) - ret =3D ib_dev->ops.create_user_cq(cq, &attr, attrs); - else - ret =3D ib_dev->ops.create_cq(cq, &attr, attrs); + ret =3D ib_dev->ops.create_user_cq(cq, &attr, attrs); if (ret) goto err_free; =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D45EF357A48; Fri, 13 Feb 2026 11:00:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980448; cv=none; b=VTFfYIyxCBx1i4gMyThZ7hms7emqwWbzD7IDk2q/tflzK9F0hpoPDFOLKbDgq2QZrpfpNneWC1wSBwTkpzv1haA4pC6oPy0wuf4vSBxLbtOlPt080NdUGk8NacZ4FPzygg/UYSX6cDnlw62hMqo07aQe7ACSOClKXEyy7rBFzUE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980448; c=relaxed/simple; bh=Sp8gis0/mbQbLEUwfhSepvWCD6rochTkCa5B+TgVyAg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=H+sJ9U22pS3eTT3WWZkqq+9npp4SI+Iwry6nLLhZhSbF5Ey7xZ1bQIKp80AGYL7NUhMVN4G3bJ4Fp46uF9QQBa9bbEBHJvScylIoamq+AbIqf3wWhr1j5xMgKJ+UAhSOPNwCAsOxtnJq3u2934Vui6URvsV3cgE4G9yCXrtw040= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BdW0sEya; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BdW0sEya" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1CD9BC116C6; Fri, 13 Feb 2026 11:00:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980448; bh=Sp8gis0/mbQbLEUwfhSepvWCD6rochTkCa5B+TgVyAg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BdW0sEyaIVu2bI013scid28x1csrnTeT2oq31WiCGYjKbHIKl/paLEHKm9SZH1mBb LqSCC748iINh81+g9yLhfNJ5sYaXdQFqftda6D7lQIZpCFnS7/BpFu1TZLGhPLHNgt fVgLNwByc7ZwGOhG2gYCRqUrTBBhEWsteDiN+8CfC+BlrL7wJBICIOodsY9fLkxoAF CLVgyRRTr0EiP+3tazgI3fP7j5OExxkf5ooqRnjwS+IiO1LeYIBfUJ0scs7ib+A7hd 4HQ9HDwqMZtpGyZSl93RgtVeDPKcD9+1BY/1kSXhKXiVCGUPBdLuhleH+nX9X0URSa i1Rk3dfrGxViQ== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 31/50] RDMA/core: Remove unused ib_resize_cq() implementation Date: Fri, 13 Feb 2026 12:58:07 +0200 Message-ID: <20260213-refactor-umem-v1-31-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There are no in-kernel users of the CQ resize functionality, so drop it. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/verbs.c | 10 ---------- include/rdma/ib_verbs.h | 9 --------- 2 files changed, 19 deletions(-) diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verb= s.c index 9d075eeda463..5f59487fc9d4 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -2264,16 +2264,6 @@ int ib_destroy_cq_user(struct ib_cq *cq, struct ib_u= data *udata) } EXPORT_SYMBOL(ib_destroy_cq_user); =20 -int ib_resize_cq(struct ib_cq *cq, int cqe) -{ - if (cq->shared) - return -EOPNOTSUPP; - - return cq->device->ops.resize_cq ? - cq->device->ops.resize_cq(cq, cqe, NULL) : -EOPNOTSUPP; -} -EXPORT_SYMBOL(ib_resize_cq); - /* Memory regions */ =20 struct ib_mr *ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 67aa5fc2c0b7..b8adc2f17e73 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -4001,15 +4001,6 @@ struct ib_cq *__ib_create_cq(struct ib_device *devic= e, #define ib_create_cq(device, cmp_hndlr, evt_hndlr, cq_ctxt, cq_attr) \ __ib_create_cq((device), (cmp_hndlr), (evt_hndlr), (cq_ctxt), (cq_attr), = KBUILD_MODNAME) =20 -/** - * ib_resize_cq - Modifies the capacity of the CQ. - * @cq: The CQ to resize. - * @cqe: The minimum size of the CQ. - * - * Users can examine the cq structure to determine the actual CQ size. - */ -int ib_resize_cq(struct ib_cq *cq, int cqe); - /** * rdma_set_cq_moderation - Modifies moderation params of the CQ * @cq: The CQ to modify. --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D7E963563EE; Fri, 13 Feb 2026 11:01:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980467; cv=none; b=ATf1oR2RP3PnmitovcNs5XcyOK02HquaxlYidVNselqEacFDTuaHoDZaxnISrUnf8RhRAbNQy7RGBLZmmuUVqbJW7v23w3yfWaLJ6u7DbeMAMGSjbdVS5LunkrmpEwNkQ3Ua9w84sDeIjJotbppap3AUves0ZG3u/n8mRouz59c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980467; c=relaxed/simple; bh=lJd7pNWwbz/yljv7iIoOKoXZ5xZZRifiDg+GM9LSUKc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lT6kEsNHF7070iael3i3yvQp0L7jq3qdVcq/6IJdnDPkokuzICZO2OCHV7RkpNTqo5qsh4XRL83MaQAEm3LWYsmiUiSL3WXfuFCUK+WN60F/IpMtjNf7I412t6z9YxkM5yZmNO78Bg9nmvxmrautqBkqkDu5Y2Sgh1uVKeqf9ug= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZABIR7H7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZABIR7H7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D639DC116C6; Fri, 13 Feb 2026 11:01:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980467; bh=lJd7pNWwbz/yljv7iIoOKoXZ5xZZRifiDg+GM9LSUKc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZABIR7H7gBh77uE7071tByAHH2fokXvkebI9I4yiCoJvKAAiGEohi0JcZWwCSMtFC jpAAVgxgoVqKYTAzPTLjUw7pWtyeoUX/ZbWRoJh8eBW007RxAySrx+sX2fGOJw3X1y /Uop7F9+RZ66lf/HEx7L70yv36Cn0BwFK93ZulgudG/Kjfaj5Ovbr4Ocd2Xa5RAbSw 3e7irxkZa7UhGoSxkf5PmoUAEFzg6kg22NgzvqoL2g4045in60Ykf3Nm24k0xd0B0N IARiyOpxzpe7OUOYF05IDN7Z0JSAMcODfwnVlek78w/8TJFK1gqkaufnb/mEja5js1 OJJfi014geqNA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: =?utf-8?q?=5BPATCH_rdma-next_32/50=5D_RDMA=3A_Clarify_that_CQ_re?= =?utf-8?q?size_is_a_user=E2=80=91space_verb?= Date: Fri, 13 Feb 2026 12:58:08 +0200 Message-ID: <20260213-refactor-umem-v1-32-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The CQ resize operation is used only by uverbs. Make this explicit. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/device.c | 2 +- drivers/infiniband/core/uverbs_cmd.c | 4 ++-- drivers/infiniband/hw/bnxt_re/main.c | 2 +- drivers/infiniband/hw/irdma/verbs.c | 2 +- drivers/infiniband/hw/mlx4/main.c | 2 +- drivers/infiniband/hw/mlx5/main.c | 2 +- drivers/infiniband/hw/mthca/mthca_provider.c | 2 +- drivers/infiniband/hw/ocrdma/ocrdma_main.c | 2 +- drivers/infiniband/sw/rdmavt/vt.c | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 2 +- include/rdma/ib_verbs.h | 3 ++- 11 files changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/dev= ice.c index 9209b8c664ef..9411f7805eed 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -2799,7 +2799,7 @@ void ib_set_device_ops(struct ib_device *dev, const s= truct ib_device_ops *ops) SET_DEVICE_OP(dev_ops, reg_user_mr_dmabuf); SET_DEVICE_OP(dev_ops, req_notify_cq); SET_DEVICE_OP(dev_ops, rereg_user_mr); - SET_DEVICE_OP(dev_ops, resize_cq); + SET_DEVICE_OP(dev_ops, resize_user_cq); SET_DEVICE_OP(dev_ops, set_vf_guid); SET_DEVICE_OP(dev_ops, set_vf_link_state); SET_DEVICE_OP(dev_ops, ufile_hw_cleanup); diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index cdfee86fb800..57697738fd25 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1151,7 +1151,7 @@ static int ib_uverbs_resize_cq(struct uverbs_attr_bun= dle *attrs) if (IS_ERR(cq)) return PTR_ERR(cq); =20 - ret =3D cq->device->ops.resize_cq(cq, cmd.cqe, &attrs->driver_udata); + ret =3D cq->device->ops.resize_user_cq(cq, cmd.cqe, &attrs->driver_udata); if (ret) goto out; =20 @@ -3811,7 +3811,7 @@ const struct uapi_definition uverbs_def_write_intf[] = =3D { UAPI_DEF_WRITE_UDATA_IO( struct ib_uverbs_resize_cq, struct ib_uverbs_resize_cq_resp), - UAPI_DEF_METHOD_NEEDS_FN(resize_cq)), + UAPI_DEF_METHOD_NEEDS_FN(resize_user_cq)), DECLARE_UVERBS_WRITE_EX( IB_USER_VERBS_EX_CMD_CREATE_CQ, ib_uverbs_ex_create_cq, diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/b= nxt_re/main.c index 368c1fd8172e..ccc01fc222ca 100644 --- a/drivers/infiniband/hw/bnxt_re/main.c +++ b/drivers/infiniband/hw/bnxt_re/main.c @@ -1373,7 +1373,7 @@ static const struct ib_device_ops bnxt_re_dev_ops =3D= { .reg_user_mr =3D bnxt_re_reg_user_mr, .reg_user_mr_dmabuf =3D bnxt_re_reg_user_mr_dmabuf, .req_notify_cq =3D bnxt_re_req_notify_cq, - .resize_cq =3D bnxt_re_resize_cq, + .resize_user_cq =3D bnxt_re_resize_cq, .create_flow =3D bnxt_re_create_flow, .destroy_flow =3D bnxt_re_destroy_flow, INIT_RDMA_OBJ_SIZE(ib_ah, bnxt_re_ah, ib_ah), diff --git a/drivers/infiniband/hw/irdma/verbs.c b/drivers/infiniband/hw/ir= dma/verbs.c index f2b3cfe125af..f727d1922a84 100644 --- a/drivers/infiniband/hw/irdma/verbs.c +++ b/drivers/infiniband/hw/irdma/verbs.c @@ -5460,7 +5460,7 @@ static const struct ib_device_ops irdma_dev_ops =3D { .reg_user_mr_dmabuf =3D irdma_reg_user_mr_dmabuf, .rereg_user_mr =3D irdma_rereg_user_mr, .req_notify_cq =3D irdma_req_notify_cq, - .resize_cq =3D irdma_resize_cq, + .resize_user_cq =3D irdma_resize_cq, INIT_RDMA_OBJ_SIZE(ib_pd, irdma_pd, ibpd), INIT_RDMA_OBJ_SIZE(ib_ucontext, irdma_ucontext, ibucontext), INIT_RDMA_OBJ_SIZE(ib_ah, irdma_ah, ibah), diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4= /main.c index fc05e7a1a870..daf95f94ec6f 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -2570,7 +2570,7 @@ static const struct ib_device_ops mlx4_ib_dev_ops =3D= { .reg_user_mr =3D mlx4_ib_reg_user_mr, .req_notify_cq =3D mlx4_ib_arm_cq, .rereg_user_mr =3D mlx4_ib_rereg_user_mr, - .resize_cq =3D mlx4_ib_resize_cq, + .resize_user_cq =3D mlx4_ib_resize_cq, .report_port_event =3D mlx4_ib_port_event, =20 INIT_RDMA_OBJ_SIZE(ib_ah, mlx4_ib_ah, ibah), diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5= /main.c index 4f49f65e2c16..0471155eb739 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -4496,7 +4496,7 @@ static const struct ib_device_ops mlx5_ib_dev_ops =3D= { .reg_user_mr_dmabuf =3D mlx5_ib_reg_user_mr_dmabuf, .req_notify_cq =3D mlx5_ib_arm_cq, .rereg_user_mr =3D mlx5_ib_rereg_user_mr, - .resize_cq =3D mlx5_ib_resize_cq, + .resize_user_cq =3D mlx5_ib_resize_cq, .ufile_hw_cleanup =3D mlx5_ib_ufile_hw_cleanup, =20 INIT_RDMA_OBJ_SIZE(ib_ah, mlx5_ib_ah, ibah), diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infinib= and/hw/mthca/mthca_provider.c index 6bf825978846..8920deceea73 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -1119,7 +1119,7 @@ static const struct ib_device_ops mthca_dev_ops =3D { .query_port =3D mthca_query_port, .query_qp =3D mthca_query_qp, .reg_user_mr =3D mthca_reg_user_mr, - .resize_cq =3D mthca_resize_cq, + .resize_user_cq =3D mthca_resize_cq, =20 INIT_RDMA_OBJ_SIZE(ib_ah, mthca_ah, ibah), INIT_RDMA_OBJ_SIZE(ib_cq, mthca_cq, ibcq), diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniban= d/hw/ocrdma/ocrdma_main.c index 0d89c5ec9a7a..7dafebc7f57e 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c @@ -167,7 +167,7 @@ static const struct ib_device_ops ocrdma_dev_ops =3D { .query_qp =3D ocrdma_query_qp, .reg_user_mr =3D ocrdma_reg_user_mr, .req_notify_cq =3D ocrdma_arm_cq, - .resize_cq =3D ocrdma_resize_cq, + .resize_user_cq =3D ocrdma_resize_cq, =20 INIT_RDMA_OBJ_SIZE(ib_ah, ocrdma_ah, ibah), INIT_RDMA_OBJ_SIZE(ib_cq, ocrdma_cq, ibcq), diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdma= vt/vt.c index 15964400b8d3..5aff65b3916b 100644 --- a/drivers/infiniband/sw/rdmavt/vt.c +++ b/drivers/infiniband/sw/rdmavt/vt.c @@ -368,7 +368,7 @@ static const struct ib_device_ops rvt_dev_ops =3D { .query_srq =3D rvt_query_srq, .reg_user_mr =3D rvt_reg_user_mr, .req_notify_cq =3D rvt_req_notify_cq, - .resize_cq =3D rvt_resize_cq, + .resize_user_cq =3D rvt_resize_cq, =20 INIT_RDMA_OBJ_SIZE(ib_ah, rvt_ah, ibah), INIT_RDMA_OBJ_SIZE(ib_cq, rvt_cq, ibcq), diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/= rxe/rxe_verbs.c index 1e651bdd8622..72e3019ed1cb 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.c +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c @@ -1532,7 +1532,7 @@ static const struct ib_device_ops rxe_dev_ops =3D { .reg_user_mr =3D rxe_reg_user_mr, .req_notify_cq =3D rxe_req_notify_cq, .rereg_user_mr =3D rxe_rereg_user_mr, - .resize_cq =3D rxe_resize_cq, + .resize_user_cq =3D rxe_resize_cq, =20 INIT_RDMA_OBJ_SIZE(ib_ah, rxe_ah, ibah), INIT_RDMA_OBJ_SIZE(ib_cq, rxe_cq, ibcq), diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index b8adc2f17e73..94bb3cc4c67a 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -2534,7 +2534,8 @@ struct ib_device_ops { struct uverbs_attr_bundle *attrs); int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period); int (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata); - int (*resize_cq)(struct ib_cq *cq, int cqe, struct ib_udata *udata); + int (*resize_user_cq)(struct ib_cq *cq, int cqe, + struct ib_udata *udata); /* * pre_destroy_cq - Prevent a cq from generating any new work * completions, but not free any kernel resources --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 130E635A92B; Fri, 13 Feb 2026 11:00:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980457; cv=none; b=WMlLNdWstPmtq7vKa9RsA2WVIDosrjRXmnNKtulgVggxanUccC3Tr3xGOyo/2QcW6YwCDRZcYXqfYimMN8LHNzKfG9h6MUX4x9mfrAtcRIYbM9sCvpM4AwmYedL4xjrpiNeeKnfhaQJKo+63Wqlb/JflLv+TTYkXE6V/9gQf9ZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980457; c=relaxed/simple; bh=BLfJ8z/WpaD4K6sejQn96Wb7dREUsgFWZySiBeQGF9s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Qpa5zaxzACKHYxkb1kmWHtcS6jen3hm1ajtqNgcc3dC5mZPerQFIrCFv5SdEBzvKoiw14UkKhUu+TVtrwwzeqGaktNLwkxcjOoyqD7GV3YTR0rmGr/nEyz4ewxaPzQ8fquNFnQVRtwmj+HQqIZKkSAbNwbJ578m1W9yaK11xu/o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EPYdIPJB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EPYdIPJB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E58A7C116C6; Fri, 13 Feb 2026 11:00:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980456; bh=BLfJ8z/WpaD4K6sejQn96Wb7dREUsgFWZySiBeQGF9s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EPYdIPJBMbg5urgKDzfQeMyEA2s+G6InhG9YxUmme1Z1gXjttYwTpANTnGCF81Rvb kQqFo4Zp6YYsbhlY9LpC4/e/bML7aH4u25piPRXi5+y/IJLgnuRnqu50l5MTo2vsue FZg+m3AtEe3I5kqFSEpqr0LG2Ao0vRJ0oVca427aSsyLQj//08Oj/SgQbNhAv0ssDK Ye4fjm1ts5N1dfq1tnFSc+Biz1ZO9F9CTu1nb1wiEiIR3KZgjU/qhJfIngnSF1okww VdNW9Ib7zFUpQ5C0ptbPDGjWo1htRv0utxrKnqqI8TIaGaSbZyJWwdom4GFkH2J0oR oNFagAdf3tmRw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 33/50] RDMA/bnxt_re: Drop support for resizing kernel CQs Date: Fri, 13 Feb 2026 12:58:09 +0200 Message-ID: <20260213-refactor-umem-v1-33-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There are no ULP callers that use the CQ resize functionality, so remove it. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/= hw/bnxt_re/ib_verbs.c index b8516d8b8426..16bb586d68c7 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -3338,10 +3338,6 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, s= truct ib_udata *udata) cq =3D container_of(ibcq, struct bnxt_re_cq, ib_cq); rdev =3D cq->rdev; dev_attr =3D rdev->dev_attr; - if (!ibcq->uobject) { - ibdev_err(&rdev->ibdev, "Kernel CQ Resize not supported"); - return -EOPNOTSUPP; - } =20 if (cq->resize_umem) { ibdev_err(&rdev->ibdev, "Resize CQ %#x failed - Busy", @@ -3375,7 +3371,7 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, st= ruct ib_udata *udata) ibdev_err(&rdev->ibdev, "%s: ib_umem_get failed! rc =3D %pe\n", __func__, cq->resize_umem); cq->resize_umem =3D NULL; - goto fail; + return rc; } cq->resize_cqe =3D entries; memcpy(&sg_info, &cq->qplib_cq.sg_info, sizeof(sg_info)); @@ -3399,13 +3395,11 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, = struct ib_udata *udata) return 0; =20 fail: - if (cq->resize_umem) { - ib_umem_release(cq->resize_umem); - cq->resize_umem =3D NULL; - cq->resize_cqe =3D 0; - memcpy(&cq->qplib_cq.sg_info, &sg_info, sizeof(sg_info)); - cq->qplib_cq.dpi =3D orig_dpi; - } + ib_umem_release(cq->resize_umem); + cq->resize_umem =3D NULL; + cq->resize_cqe =3D 0; + memcpy(&cq->qplib_cq.sg_info, &sg_info, sizeof(sg_info)); + cq->qplib_cq.dpi =3D orig_dpi; return rc; } =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DB7235A938; Fri, 13 Feb 2026 11:01:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980460; cv=none; b=ucbXDgj9G0Z3Mb4wyyFroO+YXC0CmLFBlEh0RIuMNhwfxoqNL6mdXDWg8qnY1LpZ8g1TECaKg23Mnc586ni2lj+sxQ0GmnTxA/YibuVl5SXE9rDUIzcrTdXojF+dC+UPkD6EBU0tAtSEueOHIgRPozbmii9hutvnu0OdiRZi8mw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980460; c=relaxed/simple; bh=TXN66+61USoueF/YJO1qmTespgeOREpM5eWqChYgcOM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WuxjklvmUJ6a1Ipj4lSkoHF5KCd2GsmrGOeBHseBA7gxdVzkLsHiDC01M6FGiRA4xZVjkEsAN58vfcb7knFJNDReCBacPvDcrALMm695akyzV4gpC3qW6maASfD4PB+IMC4QhQWUpZWcCZXrnWcPmHmDSLJfoTCYIao4xy5w3EE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uRNBf6WU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uRNBf6WU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8B152C116C6; Fri, 13 Feb 2026 11:00:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980460; bh=TXN66+61USoueF/YJO1qmTespgeOREpM5eWqChYgcOM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uRNBf6WULIHJ9gua3TQfmU5Qf9S6KLJq2/4trstsDBUtXYD3gCkMb0iHAFzWF9XLH 7bSh+ozvuVcSj5Sum5daGYPH1oyVEGTwkX/fpTZKOFqRFOeYBTSxTWHpXyGwH68/Ke jZIEyQ44KSK/4bLFxCtlb45tG/ot0Qt5Nv398NohopTM97sbD0VrllEztC/Ytb/x/x QV2jbBGNZTLb5ql2NfvWFicoeVRATeSKBLi2RhbXJhkHpumLwDrSF9Ok3Mw8COTVex 0BFkgAH4tqg/cEgGsy2WARRAO8A5PdRd5FI3WUMJ1+0bn4t5LlipwGjVYi3JATY0/G pr3cRMxpLMLJg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 34/50] RDMA/irdma: Remove resize support for kernel CQs Date: Fri, 13 Feb 2026 12:58:10 +0200 Message-ID: <20260213-refactor-umem-v1-34-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The CQ resize operation is a uverbs-only interface and is not required for kernel-created CQs. Drop this unused functionality. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/irdma/verbs.c | 88 +++++++++------------------------= ---- 1 file changed, 21 insertions(+), 67 deletions(-) diff --git a/drivers/infiniband/hw/irdma/verbs.c b/drivers/infiniband/hw/ir= dma/verbs.c index f727d1922a84..d5442aebf1ac 100644 --- a/drivers/infiniband/hw/irdma/verbs.c +++ b/drivers/infiniband/hw/irdma/verbs.c @@ -2015,6 +2015,9 @@ static int irdma_destroy_cq(struct ib_cq *ib_cq, stru= ct ib_udata *udata) static int irdma_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) { + struct irdma_resize_cq_req req =3D {}; + struct irdma_ucontext *ucontext =3D rdma_udata_to_drv_context( + udata, struct irdma_ucontext, ibucontext); #define IRDMA_RESIZE_CQ_MIN_REQ_LEN offsetofend(struct irdma_resize_cq_req= , user_cq_buffer) struct irdma_cq *iwcq =3D to_iwcq(ibcq); struct irdma_sc_dev *dev =3D iwcq->sc_cq.dev; @@ -2029,7 +2032,6 @@ static int irdma_resize_cq(struct ib_cq *ibcq, int en= tries, struct irdma_pci_f *rf; struct irdma_cq_buf *cq_buf =3D NULL; unsigned long flags; - u8 cqe_size; int ret; =20 iwdev =3D to_iwdev(ibcq->device); @@ -2039,81 +2041,39 @@ static int irdma_resize_cq(struct ib_cq *ibcq, int = entries, IRDMA_FEATURE_CQ_RESIZE)) return -EOPNOTSUPP; =20 - if (udata && udata->inlen < IRDMA_RESIZE_CQ_MIN_REQ_LEN) + if (udata->inlen < IRDMA_RESIZE_CQ_MIN_REQ_LEN) return -EINVAL; =20 if (entries > rf->max_cqe) return -EINVAL; =20 - if (!iwcq->user_mode) { - entries +=3D 2; - - if (!iwcq->sc_cq.cq_uk.avoid_mem_cflct && - dev->hw_attrs.uk_attrs.hw_rev >=3D IRDMA_GEN_2) - entries *=3D 2; - - if (entries & 1) - entries +=3D 1; /* cq size must be an even number */ - - cqe_size =3D iwcq->sc_cq.cq_uk.avoid_mem_cflct ? 64 : 32; - if (entries * cqe_size =3D=3D IRDMA_HW_PAGE_SIZE) - entries +=3D 2; - } - info.cq_size =3D max(entries, 4); =20 if (info.cq_size =3D=3D iwcq->sc_cq.cq_uk.cq_size - 1) return 0; =20 - if (udata) { - struct irdma_resize_cq_req req =3D {}; - struct irdma_ucontext *ucontext =3D - rdma_udata_to_drv_context(udata, struct irdma_ucontext, - ibucontext); - - /* CQ resize not supported with legacy GEN_1 libi40iw */ - if (ucontext->legacy_mode) - return -EOPNOTSUPP; + /* CQ resize not supported with legacy GEN_1 libi40iw */ + if (ucontext->legacy_mode) + return -EOPNOTSUPP; =20 - if (ib_copy_from_udata(&req, udata, - min(sizeof(req), udata->inlen))) - return -EINVAL; + if (ib_copy_from_udata(&req, udata, min(sizeof(req), udata->inlen))) + return -EINVAL; =20 - spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags); - iwpbl_buf =3D irdma_get_pbl((unsigned long)req.user_cq_buffer, - &ucontext->cq_reg_mem_list); - spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); + spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags); + iwpbl_buf =3D irdma_get_pbl((unsigned long)req.user_cq_buffer, + &ucontext->cq_reg_mem_list); + spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); =20 - if (!iwpbl_buf) - return -ENOMEM; + if (!iwpbl_buf) + return -ENOMEM; =20 - cqmr_buf =3D &iwpbl_buf->cq_mr; - if (iwpbl_buf->pbl_allocated) { - info.virtual_map =3D true; - info.pbl_chunk_size =3D 1; - info.first_pm_pbl_idx =3D cqmr_buf->cq_pbl.idx; - } else { - info.cq_pa =3D cqmr_buf->cq_pbl.addr; - } + cqmr_buf =3D &iwpbl_buf->cq_mr; + if (iwpbl_buf->pbl_allocated) { + info.virtual_map =3D true; + info.pbl_chunk_size =3D 1; + info.first_pm_pbl_idx =3D cqmr_buf->cq_pbl.idx; } else { - /* Kmode CQ resize */ - int rsize; - - rsize =3D info.cq_size * sizeof(struct irdma_cqe); - kmem_buf.size =3D ALIGN(round_up(rsize, 256), 256); - kmem_buf.va =3D dma_alloc_coherent(dev->hw->device, - kmem_buf.size, &kmem_buf.pa, - GFP_KERNEL); - if (!kmem_buf.va) - return -ENOMEM; - - info.cq_base =3D kmem_buf.va; - info.cq_pa =3D kmem_buf.pa; - cq_buf =3D kzalloc(sizeof(*cq_buf), GFP_KERNEL); - if (!cq_buf) { - ret =3D -ENOMEM; - goto error; - } + info.cq_pa =3D cqmr_buf->cq_pbl.addr; } =20 cqp_request =3D irdma_alloc_and_get_cqp_request(&rf->cqp, true); @@ -2154,13 +2114,7 @@ static int irdma_resize_cq(struct ib_cq *ibcq, int e= ntries, =20 return 0; error: - if (!udata) { - dma_free_coherent(dev->hw->device, kmem_buf.size, kmem_buf.va, - kmem_buf.pa); - kmem_buf.va =3D NULL; - } kfree(cq_buf); - return ret; } =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B2213563EE; Fri, 13 Feb 2026 11:01:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980464; cv=none; b=epMzOApNAAX/QFHypIsST+pRmAFktFZOE4fmm2MZvgwoTvOqc24rXiTQKYQHj/FZXksy8Wn+JqWyWqbTv3wSJCJhqnsLM0tHypvBVk2v01UTvAGh3+dRt04wfo7A2FRZKRLYWrMXXYXYpfFmuqMf8eTcBYOwP2oz6i7oA1EBke4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980464; c=relaxed/simple; bh=cXVPMCACaL/gKFCQ/f3NUv6u2y9sogOUml+fOjhCVfE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=el4pgY49LFuAf8+8tdv9Mc/NmjUTQBEH1zzZU4+zyN5WCI7P7dqIW8k8FndB5rAPwhXVjcKigYo2GGP1l+Tlpbuoc0GvHYojl+oN9PUWdbxh0MaWKYudORzFJlcDkGBrLfutWnuP9y9GjjlwIpBUdLE6Eaw7m+9KgVGoUWdCdJc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=suCrbUt5; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="suCrbUt5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 313DAC116C6; Fri, 13 Feb 2026 11:01:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980464; bh=cXVPMCACaL/gKFCQ/f3NUv6u2y9sogOUml+fOjhCVfE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=suCrbUt5uobz+J8Zy+H2OulDR2mfdrJR0brxW3fwatLE/yC+GHU1zAwiEII9nGIlH dwB7IM0le2zD/3l7+CsDSeQXhaZ30wsUn9AePU+13uEMQqCGmvv80yDQysD1LNPXMy BsN0wxScW7nm5ncAEhNBPrkkgWqKhYGXU/uoPkXPsOlrG2PTwIN1/qDK2+KAyBDuJe wUU8gBfSj9opmPAciR81jKqlqJ6jtSK4/YFNPU3q9CIXTNDJ/75rMJbFiZcG9IFDHd tTh4Wr8bl2lkx2F3s0iyqxv0ayEPgZqjz/nbflxUmcqzWsIgZBnNq/LZiV60TSLkBZ mP1U5Y6AXvWjw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 35/50] RDMA/mlx4: Remove support for kernel CQ resize Date: Fri, 13 Feb 2026 12:58:11 +0200 Message-ID: <20260213-refactor-umem-v1-35-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky No upper=E2=80=91layer protocol currently uses CQ resize, and the feature h= as no active callers. Drop the unused functionality. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx4/cq.c | 167 +++++-------------------------------= ---- 1 file changed, 21 insertions(+), 146 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index 83169060d120..05fad06b89c2 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -296,30 +296,6 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct= ib_cq_init_attr *attr, return err; } =20 -static int mlx4_alloc_resize_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_c= q *cq, - int entries) -{ - int err; - - if (cq->resize_buf) - return -EBUSY; - - cq->resize_buf =3D kmalloc(sizeof *cq->resize_buf, GFP_KERNEL); - if (!cq->resize_buf) - return -ENOMEM; - - err =3D mlx4_ib_alloc_cq_buf(dev, &cq->resize_buf->buf, entries); - if (err) { - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - return err; - } - - cq->resize_buf->cqe =3D entries - 1; - - return 0; -} - static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *dev, struct mlx4_ib_= cq *cq, int entries, struct ib_udata *udata) { @@ -329,9 +305,6 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *d= ev, struct mlx4_ib_cq *cq int n; int err; =20 - if (cq->resize_umem) - return -EBUSY; - if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) return -EFAULT; =20 @@ -371,91 +344,36 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev = *dev, struct mlx4_ib_cq *cq =20 err_umem: ib_umem_release(cq->resize_umem); - + cq->resize_umem =3D NULL; err_buf: kfree(cq->resize_buf); cq->resize_buf =3D NULL; return err; } =20 -static int mlx4_ib_get_outstanding_cqes(struct mlx4_ib_cq *cq) -{ - u32 i; - - i =3D cq->mcq.cons_index; - while (get_sw_cqe(cq, i)) - ++i; - - return i - cq->mcq.cons_index; -} - -static void mlx4_ib_cq_resize_copy_cqes(struct mlx4_ib_cq *cq) -{ - struct mlx4_cqe *cqe, *new_cqe; - int i; - int cqe_size =3D cq->buf.entry_size; - int cqe_inc =3D cqe_size =3D=3D 64 ? 1 : 0; - - i =3D cq->mcq.cons_index; - cqe =3D get_cqe(cq, i & cq->ibcq.cqe); - cqe +=3D cqe_inc; - - while ((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) !=3D MLX4_CQE_OPCODE= _RESIZE) { - new_cqe =3D get_cqe_from_buf(&cq->resize_buf->buf, - (i + 1) & cq->resize_buf->cqe); - memcpy(new_cqe, get_cqe(cq, i & cq->ibcq.cqe), cqe_size); - new_cqe +=3D cqe_inc; - - new_cqe->owner_sr_opcode =3D (cqe->owner_sr_opcode & ~MLX4_CQE_OWNER_MAS= K) | - (((i + 1) & (cq->resize_buf->cqe + 1)) ? MLX4_CQE_OWNER_MASK : 0); - cqe =3D get_cqe(cq, ++i & cq->ibcq.cqe); - cqe +=3D cqe_inc; - } - ++cq->mcq.cons_index; -} - int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata) { struct mlx4_ib_dev *dev =3D to_mdev(ibcq->device); struct mlx4_ib_cq *cq =3D to_mcq(ibcq); struct mlx4_mtt mtt; - int outst_cqe; int err; =20 - mutex_lock(&cq->resize_mutex); - if (entries < 1 || entries > dev->dev->caps.max_cqes) { - err =3D -EINVAL; - goto out; - } + if (entries < 1 || entries > dev->dev->caps.max_cqes) + return -EINVAL; =20 entries =3D roundup_pow_of_two(entries + 1); - if (entries =3D=3D ibcq->cqe + 1) { - err =3D 0; - goto out; - } - - if (entries > dev->dev->caps.max_cqes + 1) { - err =3D -EINVAL; - goto out; - } + if (entries =3D=3D ibcq->cqe + 1) + return 0; =20 - if (ibcq->uobject) { - err =3D mlx4_alloc_resize_umem(dev, cq, entries, udata); - if (err) - goto out; - } else { - /* Can't be smaller than the number of outstanding CQEs */ - outst_cqe =3D mlx4_ib_get_outstanding_cqes(cq); - if (entries < outst_cqe + 1) { - err =3D -EINVAL; - goto out; - } + if (entries > dev->dev->caps.max_cqes + 1) + return -EINVAL; =20 - err =3D mlx4_alloc_resize_buf(dev, cq, entries); - if (err) - goto out; + mutex_lock(&cq->resize_mutex); + err =3D mlx4_alloc_resize_umem(dev, cq, entries, udata); + if (err) { + mutex_unlock(&cq->resize_mutex); + return err; } - mtt =3D cq->buf.mtt; =20 err =3D mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.= mtt); @@ -463,52 +381,26 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries= , struct ib_udata *udata) goto err_buf; =20 mlx4_mtt_cleanup(dev->dev, &mtt); - if (ibcq->uobject) { - cq->buf =3D cq->resize_buf->buf; - cq->ibcq.cqe =3D cq->resize_buf->cqe; - ib_umem_release(cq->ibcq.umem); - cq->ibcq.umem =3D cq->resize_umem; - - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - cq->resize_umem =3D NULL; - } else { - struct mlx4_ib_cq_buf tmp_buf; - int tmp_cqe =3D 0; - - spin_lock_irq(&cq->lock); - if (cq->resize_buf) { - mlx4_ib_cq_resize_copy_cqes(cq); - tmp_buf =3D cq->buf; - tmp_cqe =3D cq->ibcq.cqe; - cq->buf =3D cq->resize_buf->buf; - cq->ibcq.cqe =3D cq->resize_buf->cqe; - - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - } - spin_unlock_irq(&cq->lock); + cq->buf =3D cq->resize_buf->buf; + cq->ibcq.cqe =3D cq->resize_buf->cqe; + ib_umem_release(cq->ibcq.umem); + cq->ibcq.umem =3D cq->resize_umem; =20 - if (tmp_cqe) - mlx4_ib_free_cq_buf(dev, &tmp_buf, tmp_cqe); - } + kfree(cq->resize_buf); + cq->resize_buf =3D NULL; + cq->resize_umem =3D NULL; + mutex_unlock(&cq->resize_mutex); + return 0; =20 - goto out; =20 err_buf: mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); - if (!ibcq->uobject) - mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf, - cq->resize_buf->cqe); - kfree(cq->resize_buf); cq->resize_buf =3D NULL; =20 ib_umem_release(cq->resize_umem); cq->resize_umem =3D NULL; -out: mutex_unlock(&cq->resize_mutex); - return err; } =20 @@ -707,7 +599,6 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, u16 wqe_ctr; unsigned tail =3D 0; =20 -repoll: cqe =3D next_cqe_sw(cq); if (!cqe) return -EAGAIN; @@ -727,22 +618,6 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, is_error =3D (cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) =3D=3D MLX4_CQE_OPCODE_ERROR; =20 - /* Resize CQ in progress */ - if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) =3D=3D MLX4_CQ= E_OPCODE_RESIZE)) { - if (cq->resize_buf) { - struct mlx4_ib_dev *dev =3D to_mdev(cq->ibcq.device); - - mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); - cq->buf =3D cq->resize_buf->buf; - cq->ibcq.cqe =3D cq->resize_buf->cqe; - - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - } - - goto repoll; - } - if (!*cur_qp || (be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK) !=3D (*cur_qp)->m= qp.qpn) { /* --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BBA1B35B65A; Fri, 13 Feb 2026 11:01:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980482; cv=none; b=Db4OrPHL04MYLtA5T53tsosuW2BDHgxEX6BpoEHB0qbg9mHper9mhbztWMhbcwd+47v4NjWdbyN10beS8B+LpgANf58x2WapDJ4Og9hiadBfdaxv6oHvC4rPmU1SMrwo5zhY1gOhgX9gXeJ6hNyWP+W+5cgIAkUsWQp+2plImGE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980482; c=relaxed/simple; bh=tXRqtUNviOmDa3CJM4kPPztr+SgPVsUWwArMbQICjMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=O3GzPlR8UwIWLedCdWsK9EM7Y95x/P0pOYHSz7lgT9S87pg5bjr8NM4IDFDyDWe4B670nhZZIC2mL6T6EwO6ukWE+dXV1e9Nrc001P74kzr8K4je96MsPe7IMxjbTP2QmJjcO3iqiNS5QVXhgnR4/lORBKQhKumcL0HeQqa5Atc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=o0g4HcHl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="o0g4HcHl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EC2D5C116C6; Fri, 13 Feb 2026 11:01:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980482; bh=tXRqtUNviOmDa3CJM4kPPztr+SgPVsUWwArMbQICjMA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=o0g4HcHli8BNvHZMz3n5MdlxoKr3vz20VnV3/QIOrpBVtL/LeqkEjPOJvDkyAXZ7a 50hvMeVlKkercF2pJhC7K4M/O9Nf6Wl0NVgM+IUdRjvQ1tbpfGeWzRxY3FEyZxXr69 7v2P9rIuA4eF1J0SdrjexwI1uyvBOdogaBm8wUKBkp9qihhheYXY0m/sXga7/KVjEf HwzWJR7phxi8gWzQ7uZ/ZSYBKUb0y4zrjvYIGpb3kWo53ktePyEMIovX7eYH0gSB66 VF7kyA5z4yNKpKeuYdNZ0Z3dsE5I2A54xdzpT2sOR56I+IPcA4X5BPvE8XM61U6cKR hh8RgpGlNvRvQ== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 36/50] RDMA/mlx5: Remove support for resizing kernel CQs Date: Fri, 13 Feb 2026 12:58:12 +0200 Message-ID: <20260213-refactor-umem-v1-36-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky No ULP users rely on CQ resize support, so drop the unused code. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 161 +++++-------------------------------= ---- 1 file changed, 18 insertions(+), 143 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index 52a435efd0de..ce20af01cde0 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -74,11 +74,6 @@ static void *get_cqe(struct mlx5_ib_cq *cq, int n) return mlx5_frag_buf_get_wqe(&cq->buf.fbc, n); } =20 -static u8 sw_ownership_bit(int n, int nent) -{ - return (n & nent) ? 1 : 0; -} - static void *get_sw_cqe(struct mlx5_ib_cq *cq, int n) { void *cqe =3D get_cqe(cq, n & cq->ibcq.cqe); @@ -1258,87 +1253,11 @@ static int resize_user(struct mlx5_ib_dev *dev, str= uct mlx5_ib_cq *cq, return 0; } =20 -static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, - int entries, int cqe_size) -{ - int err; - - cq->resize_buf =3D kzalloc(sizeof(*cq->resize_buf), GFP_KERNEL); - if (!cq->resize_buf) - return -ENOMEM; - - err =3D alloc_cq_frag_buf(dev, cq->resize_buf, entries, cqe_size); - if (err) - goto ex; - - init_cq_frag_buf(cq->resize_buf); - - return 0; - -ex: - kfree(cq->resize_buf); - return err; -} - -static int copy_resize_cqes(struct mlx5_ib_cq *cq) -{ - struct mlx5_ib_dev *dev =3D to_mdev(cq->ibcq.device); - struct mlx5_cqe64 *scqe64; - struct mlx5_cqe64 *dcqe64; - void *start_cqe; - void *scqe; - void *dcqe; - int ssize; - int dsize; - int i; - u8 sw_own; - - ssize =3D cq->buf.cqe_size; - dsize =3D cq->resize_buf->cqe_size; - if (ssize !=3D dsize) { - mlx5_ib_warn(dev, "resize from different cqe size is not supported\n"); - return -EINVAL; - } - - i =3D cq->mcq.cons_index; - scqe =3D get_sw_cqe(cq, i); - scqe64 =3D ssize =3D=3D 64 ? scqe : scqe + 64; - start_cqe =3D scqe; - if (!scqe) { - mlx5_ib_warn(dev, "expected cqe in sw ownership\n"); - return -EINVAL; - } - - while (get_cqe_opcode(scqe64) !=3D MLX5_CQE_RESIZE_CQ) { - dcqe =3D mlx5_frag_buf_get_wqe(&cq->resize_buf->fbc, - (i + 1) & cq->resize_buf->nent); - dcqe64 =3D dsize =3D=3D 64 ? dcqe : dcqe + 64; - sw_own =3D sw_ownership_bit(i + 1, cq->resize_buf->nent); - memcpy(dcqe, scqe, dsize); - dcqe64->op_own =3D (dcqe64->op_own & ~MLX5_CQE_OWNER_MASK) | sw_own; - - ++i; - scqe =3D get_sw_cqe(cq, i); - scqe64 =3D ssize =3D=3D 64 ? scqe : scqe + 64; - if (!scqe) { - mlx5_ib_warn(dev, "expected cqe in sw ownership\n"); - return -EINVAL; - } - - if (scqe =3D=3D start_cqe) { - pr_warn("resize CQ failed to get resize CQE, CQN 0x%x\n", - cq->mcq.cqn); - return -ENOMEM; - } - } - ++cq->mcq.cons_index; - return 0; -} - int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata) { struct mlx5_ib_dev *dev =3D to_mdev(ibcq->device); struct mlx5_ib_cq *cq =3D to_mcq(ibcq); + unsigned long page_size; void *cqc; u32 *in; int err; @@ -1348,7 +1267,6 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries= , struct ib_udata *udata) unsigned int page_shift; int inlen; int cqe_size; - unsigned long flags; =20 if (!MLX5_CAP_GEN(dev->mdev, cq_resize)) { pr_info("Firmware does not support resize CQ\n"); @@ -1371,34 +1289,19 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entri= es, struct ib_udata *udata) return 0; =20 mutex_lock(&cq->resize_mutex); - if (udata) { - unsigned long page_size; - - err =3D resize_user(dev, cq, entries, udata, &cqe_size); - if (err) - goto ex; - - page_size =3D mlx5_umem_find_best_cq_quantized_pgoff( - cq->resize_umem, cqc, log_page_size, - MLX5_ADAPTER_PAGE_SHIFT, page_offset, 64, - &page_offset_quantized); - if (!page_size) { - err =3D -EINVAL; - goto ex_resize; - } - npas =3D ib_umem_num_dma_blocks(cq->resize_umem, page_size); - page_shift =3D order_base_2(page_size); - } else { - struct mlx5_frag_buf *frag_buf; + err =3D resize_user(dev, cq, entries, udata, &cqe_size); + if (err) + goto ex; =20 - cqe_size =3D 64; - err =3D resize_kernel(dev, cq, entries, cqe_size); - if (err) - goto ex; - frag_buf =3D &cq->resize_buf->frag_buf; - npas =3D frag_buf->npages; - page_shift =3D frag_buf->page_shift; + page_size =3D mlx5_umem_find_best_cq_quantized_pgoff( + cq->resize_umem, cqc, log_page_size, MLX5_ADAPTER_PAGE_SHIFT, + page_offset, 64, &page_offset_quantized); + if (!page_size) { + err =3D -EINVAL; + goto ex_resize; } + npas =3D ib_umem_num_dma_blocks(cq->resize_umem, page_size); + page_shift =3D order_base_2(page_size); =20 inlen =3D MLX5_ST_SZ_BYTES(modify_cq_in) + MLX5_FLD_SZ_BYTES(modify_cq_in, pas[0]) * npas; @@ -1410,11 +1313,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entrie= s, struct ib_udata *udata) } =20 pas =3D (__be64 *)MLX5_ADDR_OF(modify_cq_in, in, pas); - if (udata) - mlx5_ib_populate_pas(cq->resize_umem, 1UL << page_shift, pas, - 0); - else - mlx5_fill_page_frag_array(&cq->resize_buf->frag_buf, pas); + mlx5_ib_populate_pas(cq->resize_umem, 1UL << page_shift, pas, 0); =20 MLX5_SET(modify_cq_in, in, modify_field_select_resize_field_select.resize_field_select.resize_fiel= d_select, @@ -1440,31 +1339,10 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entri= es, struct ib_udata *udata) if (err) goto ex_alloc; =20 - if (udata) { - cq->ibcq.cqe =3D entries - 1; - ib_umem_release(cq->ibcq.umem); - cq->ibcq.umem =3D cq->resize_umem; - cq->resize_umem =3D NULL; - } else { - struct mlx5_ib_cq_buf tbuf; - int resized =3D 0; - - spin_lock_irqsave(&cq->lock, flags); - if (cq->resize_buf) { - err =3D copy_resize_cqes(cq); - if (!err) { - tbuf =3D cq->buf; - cq->buf =3D *cq->resize_buf; - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - resized =3D 1; - } - } - cq->ibcq.cqe =3D entries - 1; - spin_unlock_irqrestore(&cq->lock, flags); - if (resized) - free_cq_buf(dev, &tbuf); - } + cq->ibcq.cqe =3D entries - 1; + ib_umem_release(cq->ibcq.umem); + cq->ibcq.umem =3D cq->resize_umem; + cq->resize_umem =3D NULL; mutex_unlock(&cq->resize_mutex); =20 kvfree(in); @@ -1475,10 +1353,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entrie= s, struct ib_udata *udata) =20 ex_resize: ib_umem_release(cq->resize_umem); - if (!udata) { - free_cq_buf(dev, cq->resize_buf); - cq->resize_buf =3D NULL; - } + cq->resize_umem =3D NULL; ex: mutex_unlock(&cq->resize_mutex); return err; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CBC413563EE; Fri, 13 Feb 2026 11:01:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980471; cv=none; b=trbyO/4fP4ezVHI6KhWh7zc15Drew7LwE5L7+btInB/UhDWsLE8hoQn3vx+AdwAz1UqTpyOS4yF1+S0x69Gj4qdCZl2KY3KhXNloOovuri15VBRdqrpCfpWjIFscg+4wZ+EC1a5Tm5TeguBDmYkQnaUNViKo2NlXnllsv8H5Su0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980471; c=relaxed/simple; bh=k0n1uflccrs3HflvsAbkbwYqRMc/45QTYy53WMc4NF8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hdlaDmUc4tnWQ9SbnfVRY2ieFcwK+wf+oEa+XsdDKFDaqZZYHwIhTcADyESqhRTmY1jp3aSQH8lglfq5+VCA8tBjTn2veDTOrtte9HgwQfrXfoi8uWuWkAzJspbze5KkvC1VU/9m1JsluMPVMXey0Xg/wZGJG6V9C9SLN4sahkc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=b3PiFvH4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="b3PiFvH4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C21C0C116C6; Fri, 13 Feb 2026 11:01:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980471; bh=k0n1uflccrs3HflvsAbkbwYqRMc/45QTYy53WMc4NF8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b3PiFvH464fFpDVnF/dzdyH5OfdqjzADJGlsSgqY2KuWy/EwzZ38H3K8UH+Ub7YyE fuThn87+zUgESmWBFieEWLAzYg2uMYV1hgGQDbSj09/dXqwlzq2TLKg/u95Cb1TL80 eCrSbO9h2OH60fIK6FDPDNx8Ds1E2ZEWBwOlC6jfn3G39kBADTCQ+sZrFEwD92ikk9 9HFLR/EFPMB3KthM3g3jhho5SyQ/6DGbvSZae9VvVOl2RcBrFhh3RloFa2jljRYbxZ V2P14r+tlCN7+dOev8wXy7mImFT/ehPwu+nCzH7MsQwH1nrYYdOJA2OuFZgBwj+IuK /0OxR3Rk/SasA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 37/50] RDMA/mthca: Remove resize support for kernel CQs Date: Fri, 13 Feb 2026 12:58:13 +0200 Message-ID: <20260213-refactor-umem-v1-37-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The CQ resize operation is a uverbs-only interface and is not required for kernel-created CQs. Drop this unused functionality. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mthca/mthca_provider.c | 102 ++---------------------= ---- 1 file changed, 6 insertions(+), 96 deletions(-) diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infinib= and/hw/mthca/mthca_provider.c index 8920deceea73..fd306a229318 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -626,8 +626,6 @@ static int mthca_create_user_cq(struct ib_cq *ibcq, goto err_unmap_arm; } =20 - cq->resize_buf =3D NULL; - return 0; =20 err_unmap_arm: @@ -667,53 +665,6 @@ static int mthca_create_cq(struct ib_cq *ibcq, if (err) return err; =20 - cq->resize_buf =3D NULL; - - return 0; -} - -static int mthca_alloc_resize_buf(struct mthca_dev *dev, struct mthca_cq *= cq, - int entries) -{ - int ret; - - spin_lock_irq(&cq->lock); - if (cq->resize_buf) { - ret =3D -EBUSY; - goto unlock; - } - - cq->resize_buf =3D kmalloc(sizeof *cq->resize_buf, GFP_ATOMIC); - if (!cq->resize_buf) { - ret =3D -ENOMEM; - goto unlock; - } - - cq->resize_buf->state =3D CQ_RESIZE_ALLOC; - - ret =3D 0; - -unlock: - spin_unlock_irq(&cq->lock); - - if (ret) - return ret; - - ret =3D mthca_alloc_cq_buf(dev, &cq->resize_buf->buf, entries); - if (ret) { - spin_lock_irq(&cq->lock); - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - spin_unlock_irq(&cq->lock); - return ret; - } - - cq->resize_buf->cqe =3D entries - 1; - - spin_lock_irq(&cq->lock); - cq->resize_buf->state =3D CQ_RESIZE_READY; - spin_unlock_irq(&cq->lock); - return 0; } =20 @@ -736,60 +687,19 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int en= tries, struct ib_udata *uda goto out; } =20 - if (cq->is_kernel) { - ret =3D mthca_alloc_resize_buf(dev, cq, entries); - if (ret) - goto out; - lkey =3D cq->resize_buf->buf.mr.ibmr.lkey; - } else { - if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) { - ret =3D -EFAULT; - goto out; - } - lkey =3D ucmd.lkey; + if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) { + ret =3D -EFAULT; + goto out; } + lkey =3D ucmd.lkey; =20 ret =3D mthca_RESIZE_CQ(dev, cq->cqn, lkey, ilog2(entries)); - - if (ret) { - if (cq->resize_buf) { - mthca_free_cq_buf(dev, &cq->resize_buf->buf, - cq->resize_buf->cqe); - kfree(cq->resize_buf); - spin_lock_irq(&cq->lock); - cq->resize_buf =3D NULL; - spin_unlock_irq(&cq->lock); - } + if (ret) goto out; - } - - if (cq->is_kernel) { - struct mthca_cq_buf tbuf; - int tcqe; - - spin_lock_irq(&cq->lock); - if (cq->resize_buf->state =3D=3D CQ_RESIZE_READY) { - mthca_cq_resize_copy_cqes(cq); - tbuf =3D cq->buf; - tcqe =3D cq->ibcq.cqe; - cq->buf =3D cq->resize_buf->buf; - cq->ibcq.cqe =3D cq->resize_buf->cqe; - } else { - tbuf =3D cq->resize_buf->buf; - tcqe =3D cq->resize_buf->cqe; - } - - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - spin_unlock_irq(&cq->lock); - - mthca_free_cq_buf(dev, &tbuf, tcqe); - } else - ibcq->cqe =3D entries - 1; =20 + ibcq->cqe =3D entries - 1; out: mutex_unlock(&cq->mutex); - return ret; } =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C22E3563EE; Fri, 13 Feb 2026 11:01:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980475; cv=none; b=Vb5v2OmpToSIgObGSLLXdqnNQuZPmMVjQekVmXlFr/VRoPn8Lbhy9oQ/fko9Fz7AG/2SV1ZwUPcTLh6fjyKFm30P6X1K1P9lswWCT4CPMO0fDbxJqjEGIFfcjfODP7+ZVLlTzlGcmti1M2igCVljFR/rXbbhgGsCFlhE6ll2iUw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980475; c=relaxed/simple; bh=1jkqZSV1Ct4otOnik6vCHukKvebi7PZqsIOIbFxFtZ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ARpqklF24Wkp1/PEPlH7+PnhCXZlbHTBOuAcqOjHYs60a8xiPxgGDxlZoP5ek3RPB2tpB/crXt7aItB66AkmktoSg31l+jUgNXBnI05vS4K+hqD8iBTTwJssyLvczbePtUYLxTr431bSr4ZCN4fSQuH3W10UxQOkWEokHSfriIs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jUwtD9ga; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jUwtD9ga" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 590CBC116C6; Fri, 13 Feb 2026 11:01:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980475; bh=1jkqZSV1Ct4otOnik6vCHukKvebi7PZqsIOIbFxFtZ8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jUwtD9gaMvmuW/6fCeOcSBJhAkC0CtNqkpaqjnBx7ar3ZSrSKyuuwmyVCZSGJbasR DedKmDUPSy47gEJJS2aF4FHwimmTIYBBrkr5s69iLU1L70sAnuo2Hibfd0PM77pnsU mUHnhGJyI0G+cfCWI1sT47PZ96Dm+wWF+9JcemfAzEA3tdwpnsWjjMHw6N/5CTyAD3 7ueokcm7gA2L479cFZkCoR8hM2fxy10d70MSU4JAzqpk3YB8SLe31BYA2lcBG+Qi5J rfpI1QGxtz8gm3uftukn53uTG0k1zAHEHk70TimVENKxO98vd2/t8rnJERI2oId3dR zrQW8Wy0YRTyg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 38/50] RDMA/rdmavt: Remove resize support for kernel CQs Date: Fri, 13 Feb 2026 12:58:14 +0200 Message-ID: <20260213-refactor-umem-v1-38-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The CQ resize operation is a uverbs-only interface and is not needed for CQs created by the kernel. Remove this unused functionality. Signed-off-by: Leon Romanovsky --- drivers/infiniband/sw/rdmavt/cq.c | 70 ++++++++++++-----------------------= ---- 1 file changed, 21 insertions(+), 49 deletions(-) diff --git a/drivers/infiniband/sw/rdmavt/cq.c b/drivers/infiniband/sw/rdma= vt/cq.c index db86eb026bb3..1ae5d8c86acb 100644 --- a/drivers/infiniband/sw/rdmavt/cq.c +++ b/drivers/infiniband/sw/rdmavt/cq.c @@ -408,51 +408,36 @@ int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct= ib_udata *udata) struct rvt_dev_info *rdi =3D cq->rdi; struct rvt_cq_wc *u_wc =3D NULL; struct rvt_cq_wc *old_u_wc =3D NULL; - struct rvt_k_cq_wc *k_wc =3D NULL; - struct rvt_k_cq_wc *old_k_wc =3D NULL; + __u64 offset =3D 0; =20 if (cqe < 1 || cqe > rdi->dparms.props.max_cqe) return -EINVAL; =20 + if (udata->outlen < sizeof(__u64)) + return -EINVAL; + /* * Need to use vmalloc() if we want to support large #s of entries. */ - if (udata && udata->outlen >=3D sizeof(__u64)) { - sz =3D sizeof(struct ib_uverbs_wc) * (cqe + 1); - sz +=3D sizeof(*u_wc); - u_wc =3D vmalloc_user(sz); - if (!u_wc) - return -ENOMEM; - } else { - sz =3D sizeof(struct ib_wc) * (cqe + 1); - sz +=3D sizeof(*k_wc); - k_wc =3D vzalloc_node(sz, rdi->dparms.node); - if (!k_wc) - return -ENOMEM; - } - /* Check that we can write the offset to mmap. */ - if (udata && udata->outlen >=3D sizeof(__u64)) { - __u64 offset =3D 0; + sz =3D sizeof(struct ib_uverbs_wc) * (cqe + 1); + sz +=3D sizeof(*u_wc); + u_wc =3D vmalloc_user(sz); + if (!u_wc) + return -ENOMEM; =20 - ret =3D ib_copy_to_udata(udata, &offset, sizeof(offset)); - if (ret) - goto bail_free; - } + /* Check that we can write the offset to mmap. */ + ret =3D ib_copy_to_udata(udata, &offset, sizeof(offset)); + if (ret) + goto bail_free; =20 spin_lock_irq(&cq->lock); /* * Make sure head and tail are sane since they * might be user writable. */ - if (u_wc) { - old_u_wc =3D cq->queue; - head =3D RDMA_READ_UAPI_ATOMIC(old_u_wc->head); - tail =3D RDMA_READ_UAPI_ATOMIC(old_u_wc->tail); - } else { - old_k_wc =3D cq->kqueue; - head =3D old_k_wc->head; - tail =3D old_k_wc->tail; - } + old_u_wc =3D cq->queue; + head =3D RDMA_READ_UAPI_ATOMIC(old_u_wc->head); + tail =3D RDMA_READ_UAPI_ATOMIC(old_u_wc->tail); =20 if (head > (u32)cq->ibcq.cqe) head =3D (u32)cq->ibcq.cqe; @@ -467,31 +452,19 @@ int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct= ib_udata *udata) goto bail_unlock; } for (n =3D 0; tail !=3D head; n++) { - if (u_wc) - u_wc->uqueue[n] =3D old_u_wc->uqueue[tail]; - else - k_wc->kqueue[n] =3D old_k_wc->kqueue[tail]; + u_wc->uqueue[n] =3D old_u_wc->uqueue[tail]; if (tail =3D=3D (u32)cq->ibcq.cqe) tail =3D 0; else tail++; } cq->ibcq.cqe =3D cqe; - if (u_wc) { - RDMA_WRITE_UAPI_ATOMIC(u_wc->head, n); - RDMA_WRITE_UAPI_ATOMIC(u_wc->tail, 0); - cq->queue =3D u_wc; - } else { - k_wc->head =3D n; - k_wc->tail =3D 0; - cq->kqueue =3D k_wc; - } + RDMA_WRITE_UAPI_ATOMIC(u_wc->head, n); + RDMA_WRITE_UAPI_ATOMIC(u_wc->tail, 0); + cq->queue =3D u_wc; spin_unlock_irq(&cq->lock); =20 - if (u_wc) - vfree(old_u_wc); - else - vfree(old_k_wc); + vfree(old_u_wc); =20 if (cq->ip) { struct rvt_mmap_info *ip =3D cq->ip; @@ -521,7 +494,6 @@ int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct i= b_udata *udata) spin_unlock_irq(&cq->lock); bail_free: vfree(u_wc); - vfree(k_wc); =20 return ret; } --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DFE843563EE; Fri, 13 Feb 2026 11:01:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980478; cv=none; b=pubf+QqGLsrl6EI8IddqIkFB7hFBGg7bqdZ6MRNoGkgdHjFufWZg/Q7pBTVUOWo+vFaQdHDuYgVoyZYRNC2tCIcW41Ao3i4km1TCWt9hFrl7fxMlbqM8UjKpDyez8ufRopTX+/5OyC+rwgQxS+Th9Cs2PxzLlYu+wCUGeeWHcoQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980478; c=relaxed/simple; bh=otPh1I/moTb9nYti+CCiEiHRtjR31X2ZuYeuBozpQr8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HWixkQl+IXAQVur3v33pY5oKJh1emzYamVwgVptxidj96L4/i4OYwo5lPfO/NKtbA6u6yN09O1vPngHJ1l1Bsq4umcnOdqX3hXT5KW+2k50+UswEZK6pLP2m79ImznbFw2Agx0kpuaY+AXAZ8Cnv05Tw9HcrooCPAkjrLplxQG0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RCv3PXeU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RCv3PXeU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E292CC16AAE; Fri, 13 Feb 2026 11:01:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980478; bh=otPh1I/moTb9nYti+CCiEiHRtjR31X2ZuYeuBozpQr8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RCv3PXeUjsvB/W0lgk2GT75S3jP2cqDXxgyQuXD9KtyVdMXL4cq55Eqn/aRbfmKgz nKHhVE4uMcUk42KrBI9FzBdIs0/c4f9ZKuppi9bMvrI1ZrygD09Nl+137278SoHYvD 56AQEviOEzGwDjmPOrHKAaHLvv2HTkO78d/KEr/RlUydfZieLPn9M/VD3ppALIOGte i7fdym+PHX+VK8TdjGyyw0mlfAnL0+sKsqK/g6ub8cN5HzfNCcM0Jz5N9vVmbqNeZx Op1bZvjNnUhEAMu3LXI+YmI2P9YpltgW4hECBbhxKTFuXG8vesesi0JWu3EJnVL1z+ dAsf7bzNjqrOw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: =?utf-8?q?=5BPATCH_rdma-next_39/50=5D_RDMA/rxe=3A_Remove_unused_?= =?utf-8?q?kernel=E2=80=91side_CQ_resize_support?= Date: Fri, 13 Feb 2026 12:58:15 +0200 Message-ID: <20260213-refactor-umem-v1-39-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky CQ resizing is only used by uverbs; the kernel=E2=80=91side CQ resize path = has no users and can be removed. Signed-off-by: Leon Romanovsky --- drivers/infiniband/sw/rxe/rxe_verbs.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/= rxe/rxe_verbs.c index 72e3019ed1cb..bc7c77ff3d90 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.c +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c @@ -1146,32 +1146,19 @@ static int rxe_resize_cq(struct ib_cq *ibcq, int cq= e, struct ib_udata *udata) struct rxe_resize_cq_resp __user *uresp =3D NULL; int err; =20 - if (udata) { - if (udata->outlen < sizeof(*uresp)) { - err =3D -EINVAL; - rxe_dbg_cq(cq, "malformed udata\n"); - goto err_out; - } - uresp =3D udata->outbuf; - } + if (udata->outlen < sizeof(*uresp)) + return -EINVAL; + uresp =3D udata->outbuf; =20 err =3D rxe_cq_chk_attr(rxe, cq, cqe, 0); - if (err) { - rxe_dbg_cq(cq, "bad attr, err =3D %d\n", err); - goto err_out; - } + if (err) + return err; =20 err =3D rxe_cq_resize_queue(cq, cqe, uresp, udata); - if (err) { - rxe_dbg_cq(cq, "resize cq failed, err =3D %d\n", err); - goto err_out; - } + if (err) + return err; =20 return 0; - -err_out: - rxe_err_cq(cq, "returned err =3D %d\n", err); - return err; } =20 static int rxe_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *= wc) --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0281A35CB8F; Fri, 13 Feb 2026 11:01:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980498; cv=none; b=Nd75e5zxKZzP5AJMKIiepCs7yQL7TOl2OhmXL8m7UvpsI7xXOj9QA2jnqgCTUnsTBO6XbSZsD9NxuUYyyFKIFFYtTY3Z0apMU6Pcm47KF7i5yzKk5tfiT0NkBq58TXmlkBTcT8Leax+VKLB1srGldF/EbMhJp2bzqQF5UrzXGC8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980498; c=relaxed/simple; bh=nO84O8+Swl46SlnmJk6vunGfz6wVTx+9J08tVJ2Gd6E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Qwko73rVCC46TyX9/kQe4QD+AZ6v9cE+E5pPXsEWpacSlBa2mHqpde2VItreI9nr6yMiRrgm2XLzUSnX4VJ1ASbzy/mQEsWjR4+/btpa4c4uoHOqbQ65kWO29/0DyZkQsCaGOAf4PzCYb2MOlJ1z8JPMiVg49mXp3gHcCJAG+Po= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FZ8DtDI2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FZ8DtDI2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1314FC116C6; Fri, 13 Feb 2026 11:01:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980497; bh=nO84O8+Swl46SlnmJk6vunGfz6wVTx+9J08tVJ2Gd6E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FZ8DtDI20irrSCHqb65clf8FZhIq94vlLost8Z22pPDPyQRmrKPeF4RAKPSr51Nk9 zMirU7Y/7d/eD3JFDjewZbsG+K8JBKxOjSu00hhwUT+HEAlEngFVjABOWZOPD0Shwj 8jQ6JxjBIPR/PzhPoVaz0KnVUkRLGGN0STcQ1WcFje5vwWoZnTMdjkLNGWvRoUW+rm u+XHe0i+RXIljs2HsfsKk3jkS2ZRjZjsb16Qtu/0PuxCyyHHVdQ6TxKLFuCfWSD2ib Q1PFHdJPHjpWqi5YPEqYb5GU6weJFDKvL02Oe6+ESQqdBkisb214NFoS1ctuXN2ssQ 2JEnHvXxmuFbg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 40/50] RDMA: Properly propagate the number of CQEs as unsigned int Date: Fri, 13 Feb 2026 12:58:16 +0200 Message-ID: <20260213-refactor-umem-v1-40-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Instead of checking whether the number of CQEs is negative or zero, fix the .resize_user_cq() declaration to use unsigned int. This better reflects the expected value range. The sanity check is then handled correctly in ib_uvbers. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/uverbs_cmd.c | 3 +++ drivers/infiniband/hw/bnxt_re/ib_verbs.c | 8 +++---- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 3 ++- drivers/infiniband/hw/irdma/verbs.c | 2 +- drivers/infiniband/hw/mlx4/cq.c | 5 +++-- drivers/infiniband/hw/mlx4/mlx4_ib.h | 3 ++- drivers/infiniband/hw/mlx5/cq.c | 10 +++------ drivers/infiniband/hw/mlx5/mlx5_ib.h | 3 ++- drivers/infiniband/hw/mthca/mthca_provider.c | 5 +++-- drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 12 +++++------ drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 3 ++- drivers/infiniband/sw/rdmavt/cq.c | 10 ++------- drivers/infiniband/sw/rdmavt/cq.h | 2 +- drivers/infiniband/sw/rxe/rxe_cq.c | 31 ------------------------= ---- drivers/infiniband/sw/rxe/rxe_loc.h | 3 --- drivers/infiniband/sw/rxe/rxe_verbs.c | 9 ++++---- include/rdma/ib_verbs.h | 2 +- 17 files changed, 38 insertions(+), 76 deletions(-) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index 57697738fd25..b4b0c7c92fb1 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1147,6 +1147,9 @@ static int ib_uverbs_resize_cq(struct uverbs_attr_bun= dle *attrs) if (ret) return ret; =20 + if (!cmd.cqe) + return -EINVAL; + cq =3D uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs); if (IS_ERR(cq)) return PTR_ERR(cq); diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/= hw/bnxt_re/ib_verbs.c index 16bb586d68c7..d652018c19b3 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -3324,7 +3324,8 @@ static void bnxt_re_resize_cq_complete(struct bnxt_re= _cq *cq) } } =20 -int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata) +int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned int cqe, + struct ib_udata *udata) { struct bnxt_qplib_sg_info sg_info =3D {}; struct bnxt_qplib_dpi *orig_dpi =3D NULL; @@ -3346,11 +3347,8 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, s= truct ib_udata *udata) } =20 /* Check the requested cq depth out of supported depth */ - if (cqe < 1 || cqe > dev_attr->max_cq_wqes) { - ibdev_err(&rdev->ibdev, "Resize CQ %#x failed - out of range cqe %d", - cq->qplib_cq.id, cqe); + if (cqe > dev_attr->max_cq_wqes) return -EINVAL; - } =20 uctx =3D rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext, ib_uct= x); entries =3D bnxt_re_init_depth(cqe + 1, uctx); diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/= hw/bnxt_re/ib_verbs.h index cac3e10b73f6..7890d6ebad90 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h @@ -249,7 +249,8 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, int bnxt_re_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); -int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata); +int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned int cqe, + struct ib_udata *udata); int bnxt_re_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc); int bnxt_re_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags); diff --git a/drivers/infiniband/hw/irdma/verbs.c b/drivers/infiniband/hw/ir= dma/verbs.c index d5442aebf1ac..f20f53ecd869 100644 --- a/drivers/infiniband/hw/irdma/verbs.c +++ b/drivers/infiniband/hw/irdma/verbs.c @@ -2012,7 +2012,7 @@ static int irdma_destroy_cq(struct ib_cq *ib_cq, stru= ct ib_udata *udata) * @entries: desired cq size * @udata: user data */ -static int irdma_resize_cq(struct ib_cq *ibcq, int entries, +static int irdma_resize_cq(struct ib_cq *ibcq, unsigned int entries, struct ib_udata *udata) { struct irdma_resize_cq_req req =3D {}; diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index 05fad06b89c2..f4595afced45 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -351,14 +351,15 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev = *dev, struct mlx4_ib_cq *cq return err; } =20 -int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata) +int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, + struct ib_udata *udata) { struct mlx4_ib_dev *dev =3D to_mdev(ibcq->device); struct mlx4_ib_cq *cq =3D to_mcq(ibcq); struct mlx4_mtt mtt; int err; =20 - if (entries < 1 || entries > dev->dev->caps.max_cqes) + if (entries > dev->dev->caps.max_cqes) return -EINVAL; =20 entries =3D roundup_pow_of_two(entries + 1); diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/m= lx4/mlx4_ib.h index 6a7ed5225c7d..5a799d6df93e 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -767,7 +767,8 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd, enum i= b_mr_type mr_type, int mlx4_ib_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_n= ents, unsigned int *sg_offset); int mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period); -int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata); +int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, + struct ib_udata *udata); int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *at= tr, struct uverbs_attr_bundle *attrs); int mlx4_ib_create_user_cq(struct ib_cq *ibcq, diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index ce20af01cde0..78c3494517d7 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -1253,7 +1253,8 @@ static int resize_user(struct mlx5_ib_dev *dev, struc= t mlx5_ib_cq *cq, return 0; } =20 -int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata) +int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, + struct ib_udata *udata) { struct mlx5_ib_dev *dev =3D to_mdev(ibcq->device); struct mlx5_ib_cq *cq =3D to_mcq(ibcq); @@ -1273,13 +1274,8 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entrie= s, struct ib_udata *udata) return -ENOSYS; } =20 - if (entries < 1 || - entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) { - mlx5_ib_warn(dev, "wrong entries number %d, max %d\n", - entries, - 1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)); + if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) return -EINVAL; - } =20 entries =3D roundup_pow_of_two(entries + 1); if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)) + 1) diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/m= lx5/mlx5_ib.h index 2556e326afde..e99a647ed62d 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -1380,7 +1380,8 @@ int mlx5_ib_pre_destroy_cq(struct ib_cq *cq); void mlx5_ib_post_destroy_cq(struct ib_cq *cq); int mlx5_ib_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); int mlx5_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period); -int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *ud= ata); +int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, + struct ib_udata *udata); struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc); struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, u64 virt_addr, int access_flags, diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infinib= and/hw/mthca/mthca_provider.c index fd306a229318..85de004547ab 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -668,7 +668,8 @@ static int mthca_create_cq(struct ib_cq *ibcq, return 0; } =20 -static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udat= a *udata) +static int mthca_resize_cq(struct ib_cq *ibcq, unsigned int entries, + struct ib_udata *udata) { struct mthca_dev *dev =3D to_mdev(ibcq->device); struct mthca_cq *cq =3D to_mcq(ibcq); @@ -676,7 +677,7 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entr= ies, struct ib_udata *uda u32 lkey; int ret; =20 - if (entries < 1 || entries > dev->limits.max_cqes) + if (entries > dev->limits.max_cqes) return -EINVAL; =20 mutex_lock(&cq->mutex); diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniba= nd/hw/ocrdma/ocrdma_verbs.c index 034d8b937a77..8445780c398f 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c @@ -1035,18 +1035,16 @@ int ocrdma_create_cq(struct ib_cq *ibcq, const stru= ct ib_cq_init_attr *attr, return 0; } =20 -int ocrdma_resize_cq(struct ib_cq *ibcq, int new_cnt, +int ocrdma_resize_cq(struct ib_cq *ibcq, unsigned int new_cnt, struct ib_udata *udata) { - int status =3D 0; struct ocrdma_cq *cq =3D get_ocrdma_cq(ibcq); =20 - if (new_cnt < 1 || new_cnt > cq->max_hw_cqe) { - status =3D -EINVAL; - return status; - } + if (new_cnt > cq->max_hw_cqe) + return -EINVAL; + ibcq->cqe =3D new_cnt; - return status; + return 0; } =20 static void ocrdma_flush_cq(struct ocrdma_cq *cq) diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h b/drivers/infiniba= nd/hw/ocrdma/ocrdma_verbs.h index 4a572608fd9f..bbc08f88c046 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h @@ -74,7 +74,8 @@ int ocrdma_create_cq(struct ib_cq *ibcq, const struct ib_= cq_init_attr *attr, int ocrdma_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); -int ocrdma_resize_cq(struct ib_cq *, int cqe, struct ib_udata *); +int ocrdma_resize_cq(struct ib_cq *ibcq, unsigned int cqe, + struct ib_udata *udata); int ocrdma_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); =20 int ocrdma_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *attrs, diff --git a/drivers/infiniband/sw/rdmavt/cq.c b/drivers/infiniband/sw/rdma= vt/cq.c index 1ae5d8c86acb..7be79274bafb 100644 --- a/drivers/infiniband/sw/rdmavt/cq.c +++ b/drivers/infiniband/sw/rdmavt/cq.c @@ -393,13 +393,7 @@ int rvt_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_n= otify_flags notify_flags) return ret; } =20 -/* - * rvt_resize_cq - change the size of the CQ - * @ibcq: the completion queue - * - * Return: 0 for success. - */ -int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata) +int rvt_resize_cq(struct ib_cq *ibcq, unsigned int cqe, struct ib_udata *u= data) { struct rvt_cq *cq =3D ibcq_to_rvtcq(ibcq); u32 head, tail, n; @@ -410,7 +404,7 @@ int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct i= b_udata *udata) struct rvt_cq_wc *old_u_wc =3D NULL; __u64 offset =3D 0; =20 - if (cqe < 1 || cqe > rdi->dparms.props.max_cqe) + if (cqe > rdi->dparms.props.max_cqe) return -EINVAL; =20 if (udata->outlen < sizeof(__u64)) diff --git a/drivers/infiniband/sw/rdmavt/cq.h b/drivers/infiniband/sw/rdma= vt/cq.h index 14ee2705c443..3827c0e6a0fb 100644 --- a/drivers/infiniband/sw/rdmavt/cq.h +++ b/drivers/infiniband/sw/rdmavt/cq.h @@ -15,7 +15,7 @@ int rvt_create_user_cq(struct ib_cq *ibcq, const struct i= b_cq_init_attr *attr, struct uverbs_attr_bundle *attrs); int rvt_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); int rvt_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags notify_f= lags); -int rvt_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata); +int rvt_resize_cq(struct ib_cq *ibcq, unsigned int cqe, struct ib_udata *u= data); int rvt_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry); int rvt_driver_cq_init(void); void rvt_cq_exit(void); diff --git a/drivers/infiniband/sw/rxe/rxe_cq.c b/drivers/infiniband/sw/rxe= /rxe_cq.c index fffd144d509e..eaf7802a5cbe 100644 --- a/drivers/infiniband/sw/rxe/rxe_cq.c +++ b/drivers/infiniband/sw/rxe/rxe_cq.c @@ -8,37 +8,6 @@ #include "rxe_loc.h" #include "rxe_queue.h" =20 -int rxe_cq_chk_attr(struct rxe_dev *rxe, struct rxe_cq *cq, - int cqe, int comp_vector) -{ - int count; - - if (cqe <=3D 0) { - rxe_dbg_dev(rxe, "cqe(%d) <=3D 0\n", cqe); - goto err1; - } - - if (cqe > rxe->attr.max_cqe) { - rxe_dbg_dev(rxe, "cqe(%d) > max_cqe(%d)\n", - cqe, rxe->attr.max_cqe); - goto err1; - } - - if (cq) { - count =3D queue_count(cq->queue, QUEUE_TYPE_TO_CLIENT); - if (cqe < count) { - rxe_dbg_cq(cq, "cqe(%d) < current # elements in queue (%d)\n", - cqe, count); - goto err1; - } - } - - return 0; - -err1: - return -EINVAL; -} - int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe, int comp_vector, struct ib_udata *udata, struct rxe_create_cq_resp __user *uresp) diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rx= e/rxe_loc.h index 7992290886e1..e095c12699cb 100644 --- a/drivers/infiniband/sw/rxe/rxe_loc.h +++ b/drivers/infiniband/sw/rxe/rxe_loc.h @@ -18,9 +18,6 @@ void rxe_av_fill_ip_info(struct rxe_av *av, struct rdma_a= h_attr *attr); struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt, struct rxe_ah **ahp); =20 /* rxe_cq.c */ -int rxe_cq_chk_attr(struct rxe_dev *rxe, struct rxe_cq *cq, - int cqe, int comp_vector); - int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe, int comp_vector, struct ib_udata *udata, struct rxe_create_cq_resp __user *uresp); diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/= rxe/rxe_verbs.c index bc7c77ff3d90..f57b4ba22a4f 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.c +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c @@ -1139,7 +1139,8 @@ static int rxe_create_cq(struct ib_cq *ibcq, const st= ruct ib_cq_init_attr *attr, return err; } =20 -static int rxe_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *uda= ta) +static int rxe_resize_cq(struct ib_cq *ibcq, unsigned int cqe, + struct ib_udata *udata) { struct rxe_cq *cq =3D to_rcq(ibcq); struct rxe_dev *rxe =3D to_rdev(ibcq->device); @@ -1150,9 +1151,9 @@ static int rxe_resize_cq(struct ib_cq *ibcq, int cqe,= struct ib_udata *udata) return -EINVAL; uresp =3D udata->outbuf; =20 - err =3D rxe_cq_chk_attr(rxe, cq, cqe, 0); - if (err) - return err; + if (cqe > rxe->attr.max_cqe || + cqe < queue_count(cq->queue, QUEUE_TYPE_TO_CLIENT)) + return -EINVAL; =20 err =3D rxe_cq_resize_queue(cq, cqe, uresp, udata); if (err) diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 94bb3cc4c67a..7d32d02c35e3 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -2534,7 +2534,7 @@ struct ib_device_ops { struct uverbs_attr_bundle *attrs); int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period); int (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata); - int (*resize_user_cq)(struct ib_cq *cq, int cqe, + int (*resize_user_cq)(struct ib_cq *cq, unsigned int cqe, struct ib_udata *udata); /* * pre_destroy_cq - Prevent a cq from generating any new work --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9373435B642; Fri, 13 Feb 2026 11:01:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980486; cv=none; b=ZprDFk4XvFDAo5oer/c36d80aqyRt8OIqzl71B8JVy+4nqePRvQw/TIEUROYHaMM27fZE4LTi2OBtJF9I3dj3bmNMEFWAudHGoRIb8/iMocFeeH7J3TRTtwtz05LhTdbRLzxUcFTRkR5TFxQwU3Zn/uWNBeGzaRpWIay6thUDRY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980486; c=relaxed/simple; bh=+71nHH7AfbBe/SSFkmhT9gZYJit0sB3BkF4FgCoqo0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=An+sOipW3NP/bcfdZaiiActiekOc8dezeAxsFi2E9w2lYc8PQAIcKBGis88pdsLEeH3Bmq5GA3ngotuFytOTbSz5GZOTTXDhuG24sGuE1kjcDuj8TULw6XdR5iEmvA3bab/s2SpobIYJwQo7wmxQjc/kbJ9ztyeH3zkQHf0PKIM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XWQYaKeB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XWQYaKeB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8744FC116C6; Fri, 13 Feb 2026 11:01:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980486; bh=+71nHH7AfbBe/SSFkmhT9gZYJit0sB3BkF4FgCoqo0Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XWQYaKeBB8O493B0SrqYCfrIOArNxH8idmqWxTA/Xnk1OELZOB3BnKmP8JUohkr8Q KWseDRn2aS9NLDRidFFfbNnUkX46jk3L+817PIMRd2197frvjsRDkOAnMYNnW+dqdf akwPp8mYzTPjmA6+/4oVxC8sHwTXxFJeBRs9PrdLNE3B50RCFtwPWfyIrZoXV14Lr5 1kht5U/hvQ1ZGTVJJM2Ng+v42yPpwfJHSdrPm1gPKnQpSK8Z3+84hsO8f3th/W7S35 naSulqW7coB00dN7JV7g25L/z6B/VV9ZPIqozL2HiijCxDwFsAwYGvS57M14pRTjFr ODSNvEorXcaiA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 41/50] RDMA/core: Generalize CQ resize locking Date: Fri, 13 Feb 2026 12:58:17 +0200 Message-ID: <20260213-refactor-umem-v1-41-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The CQ resize path must be protected from concurrent execution because it updates in-kernel objects. Some drivers did not provide any locking, leading to inconsistent behavior. Rely on the core mutex for synchronization and drop the various ad=E2=80=91= hoc locking implementations in individual drivers. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/uverbs_cmd.c | 1 + drivers/infiniband/core/uverbs_std_types_cq.c | 1 + drivers/infiniband/core/verbs.c | 2 ++ include/rdma/ib_verbs.h | 3 +++ 4 files changed, 7 insertions(+) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core= /uverbs_cmd.c index b4b0c7c92fb1..1348ebd7a1c3 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1067,6 +1067,7 @@ static int create_cq(struct uverbs_attr_bundle *attrs, cq->event_handler =3D ib_uverbs_cq_event_handler; cq->cq_context =3D ev_file ? &ev_file->ev_queue : NULL; atomic_set(&cq->usecnt, 0); + mutex_init(&cq->resize_mutex); =20 rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); rdma_restrack_set_name(&cq->res, NULL); diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infini= band/core/uverbs_std_types_cq.c index a12e3184dd5c..c572f528579d 100644 --- a/drivers/infiniband/core/uverbs_std_types_cq.c +++ b/drivers/infiniband/core/uverbs_std_types_cq.c @@ -195,6 +195,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)( */ cq->umem =3D umem; atomic_set(&cq->usecnt, 0); + mutex_init(&cq->resize_mutex); =20 rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ); rdma_restrack_set_name(&cq->res, NULL); diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verb= s.c index 5f59487fc9d4..b308100ba964 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -2257,6 +2257,8 @@ int ib_destroy_cq_user(struct ib_cq *cq, struct ib_ud= ata *udata) if (ret) return ret; =20 + if (udata) + mutex_destroy(&cq->resize_mutex); ib_umem_release(cq->umem); rdma_restrack_del(&cq->res); kfree(cq); diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 7d32d02c35e3..48340b39ab26 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1638,8 +1638,11 @@ struct ib_cq { struct ib_wc *wc; struct list_head pool_entry; union { + /* Kernel CQs */ struct irq_poll iop; struct work_struct work; + /* Uverbs CQs */ + struct mutex resize_mutex; }; struct workqueue_struct *comp_wq; struct dim *dim; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE8DB21FF21; Fri, 13 Feb 2026 11:01:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980490; cv=none; b=OhI8LYzmZU94L+DQWIwKunlwFrTwVCkQoyxITv5tMtDc9jlxoECCehjdymlhC0rgDgc3vNso9Ghvd9ohpsaeqhjAv8kpfFesJL8hnQLiXn/q1zGNJPmOGeseqzhhBb1yMfaWyhmaRCO/SGEKx/v7Pmwt3vtE/w16BvJaSoEmkyU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980490; c=relaxed/simple; bh=RKz91Km/bw5jaUIlB06o1jODkQWcQw0bXu5KVJqakUA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Aps+waWs9THEU/VUn0rB7ccg4eces7h/8ACnJh8jX2v6eFQOIPmrHzcJycgbnuXOaZ2a1Vo8vDTRMsheirIf94JSRK1Zzlm0qjcyn+h4wJ0boHc+gMdFjmXaJscef+7WrtyFvIisOZOfhDboXIFt1sUYJni2w1UngI6M7a2H6OY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Cl/xECrF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Cl/xECrF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 50AD4C116C6; Fri, 13 Feb 2026 11:01:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980490; bh=RKz91Km/bw5jaUIlB06o1jODkQWcQw0bXu5KVJqakUA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Cl/xECrF4FnYkfZmeA+TMUMF+Zatw9ml8W0xI37eRz/EgRHIr+ZRzjlHDCfLlY+9i o/rNTWNDEkzczt5ktzRcv3xlhDW7hz2D/bnvuBkgkwscyQA97cdIurkjgkLJsd1PT0 6N3bkPO5Vxu/DH7ybxgeItrQbJLZMnAePoBAYxjU66Gq8Bcr5jyjUw51IOhYFNkMud QfMVTnQMcCrBnKTyWugjuBunqTVR3qk8d2aKIIY+zLGn3X7sI6iD0UmsSUALoGp5xC tzbhRNDkBEDY4CTM4Blt/mv0nEXJzfA0+WDPM538ycKgHc7KwjaWY86OEg2IG0OqkY hGGhgEg/R6lTw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 42/50] RDMA/bnxt_re: Complete CQ resize in a single step Date: Fri, 13 Feb 2026 12:58:18 +0200 Message-ID: <20260213-refactor-umem-v1-42-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There is no need to defer the CQ resize operation, as it is intended to be completed in one pass. The current bnxt_re_resize_cq() implementation does not handle concurrent CQ resize requests, and this will be addressed in the following patches. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 33 +++++++++-------------------= ---- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/= hw/bnxt_re/ib_verbs.c index d652018c19b3..2aecfbbb7eaf 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -3309,20 +3309,6 @@ int bnxt_re_create_cq(struct ib_cq *ibcq, const stru= ct ib_cq_init_attr *attr, return rc; } =20 -static void bnxt_re_resize_cq_complete(struct bnxt_re_cq *cq) -{ - struct bnxt_re_dev *rdev =3D cq->rdev; - - bnxt_qplib_resize_cq_complete(&rdev->qplib_res, &cq->qplib_cq); - - cq->qplib_cq.max_wqe =3D cq->resize_cqe; - if (cq->resize_umem) { - ib_umem_release(cq->ib_cq.umem); - cq->ib_cq.umem =3D cq->resize_umem; - cq->resize_umem =3D NULL; - cq->resize_cqe =3D 0; - } -} =20 int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned int cqe, struct ib_udata *udata) @@ -3387,7 +3373,15 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned i= nt cqe, goto fail; } =20 - cq->ib_cq.cqe =3D cq->resize_cqe; + bnxt_qplib_resize_cq_complete(&rdev->qplib_res, &cq->qplib_cq); + + cq->qplib_cq.max_wqe =3D cq->resize_cqe; + ib_umem_release(cq->ib_cq.umem); + cq->ib_cq.umem =3D cq->resize_umem; + cq->resize_umem =3D NULL; + cq->resize_cqe =3D 0; + + cq->ib_cq.cqe =3D entries; atomic_inc(&rdev->stats.res.resize_count); =20 return 0; @@ -3907,15 +3901,6 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_ent= ries, struct ib_wc *wc) struct bnxt_re_sqp_entries *sqp_entry =3D NULL; unsigned long flags; =20 - /* User CQ; the only processing we do is to - * complete any pending CQ resize operation. - */ - if (cq->ib_cq.umem) { - if (cq->resize_umem) - bnxt_re_resize_cq_complete(cq); - return 0; - } - spin_lock_irqsave(&cq->cq_lock, flags); budget =3D min_t(u32, num_entries, cq->max_cql); num_entries =3D budget; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1FBE35CB84; Fri, 13 Feb 2026 11:01:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980494; cv=none; b=PDRdjKutbF0ldBvVF/P22G2VXg0d9/LlaTIgppq9DQg8Vp4lAf5waHJpqUQ+K+9CunBWZ+gpIIXUIyYv3Zg+UhjlxDpidaGe1GW+u+Oe7mkckT570RoPj0OPN6I6BMJTsUoOrwJNcKCNQf79CZDjjUzwVbuO2S/aVFJMbSyZaXc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980494; c=relaxed/simple; bh=Vcw4qS4HcCegwVEjRz1foBtu5FJSEtW6cquOv2B9Bec=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mc6nTux0+W2GoukMFi2BKbjf2FBZQVUrd5ThVywK7azTmDytxZftqdJexGJgGOC0VTLqoiU0ixZQMjAdTmR4Jtz7pDJfhJTc/eWt7MvtFnGZmJBWEbO1ey5z6c/Mzjytw9LGKCrevV/5FmsQnZr6ErBKs1Tb9HoAr/LAyk3rFC4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EDUYAqSj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EDUYAqSj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AE510C116C6; Fri, 13 Feb 2026 11:01:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980494; bh=Vcw4qS4HcCegwVEjRz1foBtu5FJSEtW6cquOv2B9Bec=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EDUYAqSjl4myEueiU9arG5uvvxJ9UJppcb1V4yeXECSPL6tuigtIew/E0xfm+qv7l aHt4WBcw4JT1LApSVyg9pO2XcCgLtEEJd7You/7hFB2be7n6bkR4IP1/fK7tFI0vaC Zg3ENT8jeckeVOQB/0cS3hUGQx8g7D16lHRKr5tX4kigWLc8MuHx8/MFDwAfGrZP1U qazLntwiz0/fttKeiXhs3UZZ4PlzSy+LfC3pNRP0Bap20VeGV6R4kWdJFBeeddVik8 2G0A82glTpbHvAQIZXWkQQzVXptRsgll8Nhe2K8GmaseuS5LsEN0AvfwxLPjFIQuQR SkTNaKP3CXUTg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: =?utf-8?q?=5BPATCH_rdma-next_43/50=5D_RDMA/bnxt=5Fre=3A_Rely_on_?= =?utf-8?q?common_resize=E2=80=91CQ_locking?= Date: Fri, 13 Feb 2026 12:58:19 +0200 Message-ID: <20260213-refactor-umem-v1-43-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky After introducing a shared mutex to protect against concurrent resize=E2=80=91CQ operations, update the bnxt_re driver to use this mechani= sm. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/= hw/bnxt_re/ib_verbs.c index 2aecfbbb7eaf..d544a4fb1e96 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -3326,12 +3326,6 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned i= nt cqe, rdev =3D cq->rdev; dev_attr =3D rdev->dev_attr; =20 - if (cq->resize_umem) { - ibdev_err(&rdev->ibdev, "Resize CQ %#x failed - Busy", - cq->qplib_cq.id); - return -EBUSY; - } - /* Check the requested cq depth out of supported depth */ if (cqe > dev_attr->max_cq_wqes) return -EINVAL; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 93B7E35DCE3; Fri, 13 Feb 2026 11:01:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980513; cv=none; b=l94pLufKy7uIlNdnVOltGCzlP8RYXah9HHET1WpMIhXyYzr0enDJNC35ZTeK7WTgnJeLpcTLWgcABoVGVx/BtXbvKkXWp3P5vcLR3RltiG9A1vPMeRNvNYOHBunzf9qmLaLBa/c3gN0rFE708NmvR6fvTyHBdSV43Ybz3iniv/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980513; c=relaxed/simple; bh=1roDOuzFaVAi0uAanyZBBm5keeCeS16zySE/Gbe4n7M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AKzq31n4BXXGgsUCV3wxYwa+MxStEydYjv5a1VTzAnvRhpMNYSsBStPmOmZ9TsIsiFoRJkWsDd1fTxWrMwr4ETXizBABKmKR/LFsCtm0d1BpFoCB20J6eqzBYeilNg8HyulryEZ5Z0k5K760pCqPiPhC1ZIm8UcEDqHzMxWPIJg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nF7BXsVi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nF7BXsVi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 97558C116C6; Fri, 13 Feb 2026 11:01:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980513; bh=1roDOuzFaVAi0uAanyZBBm5keeCeS16zySE/Gbe4n7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nF7BXsVi9ZkQlLmjgJwjaAQ9hAKWIVnVuUu+Xg1CKWGVeQteyqV2VoCgXAusaEFEy 2142N5IxycG+Ywh57jwVYsNL/e6YRPcZd6tseyKDvHrduspXdNfxlazxglKR/DY2Uz w6rKub6ENw/Ka0v1/IjBSTP6Z4yoI4EJQJfA36IzodS4E6+d3QVL0jCuQwY1ZsYnqr 5TlHfZ7Acr0ovlXKOAlH3/m4capxkhuS8jVw/75f3g6QZuWOoSDIkFlCQrSaTdGGFi Twix9uVGpVMa/gf9O6KALMe1fOnax4KOw5YcTP7tM5zMVjiyl2z6yHd9t6mL9/AVbk SyP/yuWm+QNbw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 44/50] RDMA/bnxt_re: Reduce CQ memory footprint Date: Fri, 13 Feb 2026 12:58:20 +0200 Message-ID: <20260213-refactor-umem-v1-44-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There is no need to store resize_cqe and resize_umem in CQ object. Let's remove them. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 37 +++++++++++-----------------= ---- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 2 -- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/= hw/bnxt_re/ib_verbs.c index d544a4fb1e96..9a8bdb52097f 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -3320,6 +3320,8 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned in= t cqe, struct bnxt_re_resize_cq_req req; struct bnxt_re_dev *rdev; struct bnxt_re_cq *cq; + struct ib_umem *umem; + int rc, entries; =20 cq =3D container_of(ibcq, struct bnxt_re_cq, ib_cq); @@ -3336,26 +3338,18 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned = int cqe, entries =3D dev_attr->max_cq_wqes + 1; =20 /* uverbs consumer */ - if (ib_copy_from_udata(&req, udata, sizeof(req))) { - rc =3D -EFAULT; - goto fail; - } + if (ib_copy_from_udata(&req, udata, sizeof(req))) + return -EFAULT; =20 - cq->resize_umem =3D ib_umem_get(&rdev->ibdev, req.cq_va, - entries * sizeof(struct cq_base), - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(cq->resize_umem)) { - rc =3D PTR_ERR(cq->resize_umem); - ibdev_err(&rdev->ibdev, "%s: ib_umem_get failed! rc =3D %pe\n", - __func__, cq->resize_umem); - cq->resize_umem =3D NULL; - return rc; - } - cq->resize_cqe =3D entries; + umem =3D ib_umem_get(&rdev->ibdev, req.cq_va, + entries * sizeof(struct cq_base), + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(umem)) + return PTR_ERR(umem); memcpy(&sg_info, &cq->qplib_cq.sg_info, sizeof(sg_info)); orig_dpi =3D cq->qplib_cq.dpi; =20 - cq->qplib_cq.sg_info.umem =3D cq->resize_umem; + cq->qplib_cq.sg_info.umem =3D umem; cq->qplib_cq.sg_info.pgsize =3D PAGE_SIZE; cq->qplib_cq.sg_info.pgshft =3D PAGE_SHIFT; cq->qplib_cq.dpi =3D &uctx->dpi; @@ -3369,21 +3363,16 @@ int bnxt_re_resize_cq(struct ib_cq *ibcq, unsigned = int cqe, =20 bnxt_qplib_resize_cq_complete(&rdev->qplib_res, &cq->qplib_cq); =20 - cq->qplib_cq.max_wqe =3D cq->resize_cqe; + cq->qplib_cq.max_wqe =3D entries; ib_umem_release(cq->ib_cq.umem); - cq->ib_cq.umem =3D cq->resize_umem; - cq->resize_umem =3D NULL; - cq->resize_cqe =3D 0; - + cq->ib_cq.umem =3D umem; cq->ib_cq.cqe =3D entries; atomic_inc(&rdev->stats.res.resize_count); =20 return 0; =20 fail: - ib_umem_release(cq->resize_umem); - cq->resize_umem =3D NULL; - cq->resize_cqe =3D 0; + ib_umem_release(umem); memcpy(&cq->qplib_cq.sg_info, &sg_info, sizeof(sg_info)); cq->qplib_cq.dpi =3D orig_dpi; return rc; diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/= hw/bnxt_re/ib_verbs.h index 7890d6ebad90..ee7ccaa2ed4c 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h @@ -108,8 +108,6 @@ struct bnxt_re_cq { struct bnxt_qplib_cqe *cql; #define MAX_CQL_PER_POLL 1024 u32 max_cql; - struct ib_umem *resize_umem; - int resize_cqe; void *uctx_cq_page; struct hlist_node hash_entry; }; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B44D3363C45; Fri, 13 Feb 2026 11:01:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980502; cv=none; b=Fcust+4BAB+rLlqxSrk9hcLmsig1+5p1gZPiC9DWgJX3YcWpSAVyL2pVscft77qyqos8YgDXI1CCfEoawMHGdKnbbg3+gaL2fcA4pjrGtTpiAbDco9UUKWFcsbSJkM4Kpo7NYFrw/mKapW/APvbmwCnvFPC03L5Z4uTa2IpTwdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980502; c=relaxed/simple; bh=BcpgeLlLPsDR96BzelXgUw4MnjuLJVb15vuF2Iq2eN0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=d2TAZ9vDOew7dwdeMKFG6Hw2ZVOtqMfcEz/jzOGyZKmhNXAO6iEgjn3J1V3eJVcabRrllLFGE1chAl78ZOhkaet+vekeahLbt0xflMODjBWb9YH4wpGLvboIud4FfA8GBWnMvAGh2g1Y+JYtgbfzbnljNt9KG5QI3dZh71wzsg4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EX9UUHPu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EX9UUHPu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6CA50C116C6; Fri, 13 Feb 2026 11:01:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980502; bh=BcpgeLlLPsDR96BzelXgUw4MnjuLJVb15vuF2Iq2eN0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EX9UUHPulnToXrHs9CRIhEkoouooY6Zre6pjGUBCXusVCI1SmwcWaREEBv9I5MJIC gAyNBFMt5OYbNEWStP/Izpo9FZS317c1rLhnbifeIf+y6NugZfLkmKWDLzg6ZzEdKO Hs0vGuN0IMR52obMjHsA5U6U5Gt+J7UEsoxSuAE3oHq8Dpi6wX8RYx4Xmo9HwF+0Cx sLXp7nyaVeU6Ov/jMUNt4QXIIqnXOFHCqFifjoNZCW+lNYxQ/h3V0XtxQVBoAeqA9j qqSY8VESFdigcVGiPrrmHjXVZLMlfOd87vbPgVOdakhRlY/VL5SGbFDslM+e/NmCSp r+8QSxzU7qk6Q== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 45/50] RDMA/mlx4: Use generic resize-CQ lock Date: Fri, 13 Feb 2026 12:58:21 +0200 Message-ID: <20260213-refactor-umem-v1-45-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Replace the open=E2=80=91coded resize=E2=80=91CQ lock with the standard core implementation for better consistency and maintainability. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx4/cq.c | 9 +-------- drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 - 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index f4595afced45..ffc3902dc329 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -163,7 +163,6 @@ int mlx4_ib_create_user_cq(struct ib_cq *ibcq, =20 entries =3D roundup_pow_of_two(entries + 1); cq->ibcq.cqe =3D entries - 1; - mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); INIT_LIST_HEAD(&cq->send_qp_list); INIT_LIST_HEAD(&cq->recv_qp_list); @@ -253,7 +252,6 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct = ib_cq_init_attr *attr, =20 entries =3D roundup_pow_of_two(entries + 1); cq->ibcq.cqe =3D entries - 1; - mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); INIT_LIST_HEAD(&cq->send_qp_list); INIT_LIST_HEAD(&cq->recv_qp_list); @@ -369,12 +367,9 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int= entries, if (entries > dev->dev->caps.max_cqes + 1) return -EINVAL; =20 - mutex_lock(&cq->resize_mutex); err =3D mlx4_alloc_resize_umem(dev, cq, entries, udata); - if (err) { - mutex_unlock(&cq->resize_mutex); + if (err) return err; - } mtt =3D cq->buf.mtt; =20 err =3D mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.= mtt); @@ -390,7 +385,6 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int = entries, kfree(cq->resize_buf); cq->resize_buf =3D NULL; cq->resize_umem =3D NULL; - mutex_unlock(&cq->resize_mutex); return 0; =20 =20 @@ -401,7 +395,6 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int = entries, =20 ib_umem_release(cq->resize_umem); cq->resize_umem =3D NULL; - mutex_unlock(&cq->resize_mutex); return err; } =20 diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/m= lx4/mlx4_ib.h index 5a799d6df93e..2f1043690554 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -120,7 +120,6 @@ struct mlx4_ib_cq { struct mlx4_ib_cq_resize *resize_buf; struct mlx4_db db; spinlock_t lock; - struct mutex resize_mutex; struct ib_umem *resize_umem; /* List of qps that it serves.*/ struct list_head send_qp_list; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C5193590B9; Fri, 13 Feb 2026 11:01:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980506; cv=none; b=rnbyfHco1a9NAsxlBYZfgcyoO5gEo/iiEhTmmJ/OndglfqNTxCOvI0NIi609u7MSN/DlpGLnryflFwGvhzpYPmylmYtK30pvosXGFQuyiDWIu9aoTurVW/5RTZovmmJVsv8kDrE44a01DghTirKtvunMtY+zrXsNhLqveOh43OA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980506; c=relaxed/simple; bh=f6V1fjY9WirwAECtXhaEuYokIqrMGjYjGYMTtnDJg58=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qIEmJXP/QitmVUtm6gJDVzrXYWg2kJ4CSIgpCHWGqkCyZQGDrEHvSw6v/+ZXVdtRo3kPM84XnhsLKDX7pReP7vhm4PQmEtI/+Qila1duIa9+/RGQvK+wgM5OpnxD4TfpfnLMnEWbC0fuSTBDGvmQiLZ5f8Onr2K7xp6GIoqGjmw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sjUw6VIJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sjUw6VIJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 850A6C116C6; Fri, 13 Feb 2026 11:01:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980506; bh=f6V1fjY9WirwAECtXhaEuYokIqrMGjYjGYMTtnDJg58=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sjUw6VIJrOM7FaQeUGj5yRGevXgJSzJv+XxWkvFaaCJZh9KW8Wb048OyGGDrmQ56S 8ENf+YR2sD/FshaildMlvyeBf4KpZbZzBS48wScVLWixlPMZcL+E5jIIBhqdSmv+6Q 0EIUp7H4taOwXzx/Ijnpk1wFqUWo3rDHtylsVczJTVLc/ODBWmVNnkVxpok47sQVKz suBX7DxP2TKzi1ejyBkG5RxSaN6PJ/+aNHpgdek4BK03n7qnD7ObU9l49Gu5pqCkSp 6cAgA+yjjTClBpjuU7G/aEinwMWvIJgwyP4s4IM7KRLn9bJ62FsVZ8ypkVktg8QbuH yFIAFn5emSFDg== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: =?utf-8?q?=5BPATCH_rdma-next_46/50=5D_RDMA/mlx4=3A_Use_on=E2=80?= =?utf-8?q?=91stack_variables_instead_of_storing_them_in_the_CQ_object?= Date: Fri, 13 Feb 2026 12:58:22 +0200 Message-ID: <20260213-refactor-umem-v1-46-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky These variables do not need to persist for the lifetime of the CQ object. They can be safely allocated on the stack instead. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx4/cq.c | 81 +++++++++++++-------------------= ---- drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 - 2 files changed, 28 insertions(+), 54 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/c= q.c index ffc3902dc329..6e8017ecf137 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -294,15 +294,29 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, return err; } =20 -static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *dev, struct mlx4_ib_= cq *cq, - int entries, struct ib_udata *udata) +int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, + struct ib_udata *udata) { + struct mlx4_ib_dev *dev =3D to_mdev(ibcq->device); + struct mlx4_ib_cq *cq =3D to_mcq(ibcq); struct mlx4_ib_resize_cq ucmd; int cqe_size =3D dev->dev->caps.cqe_size; + struct ib_umem *umem; + struct mlx4_mtt mtt; int shift; int n; int err; =20 + if (entries > dev->dev->caps.max_cqes) + return -EINVAL; + + entries =3D roundup_pow_of_two(entries + 1); + if (entries =3D=3D ibcq->cqe + 1) + return 0; + + if (entries > dev->dev->caps.max_cqes + 1) + return -EINVAL; + if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) return -EFAULT; =20 @@ -310,15 +324,14 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev = *dev, struct mlx4_ib_cq *cq if (!cq->resize_buf) return -ENOMEM; =20 - cq->resize_umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, - entries * cqe_size, - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(cq->resize_umem)) { - err =3D PTR_ERR(cq->resize_umem); + umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, + entries * cqe_size, IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(umem)) { + err =3D PTR_ERR(umem); goto err_buf; } =20 - shift =3D mlx4_ib_umem_calc_optimal_mtt_size(cq->resize_umem, 0, &n); + shift =3D mlx4_ib_umem_calc_optimal_mtt_size(umem, 0, &n); if (shift < 0) { err =3D shift; goto err_umem; @@ -328,73 +341,35 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev = *dev, struct mlx4_ib_cq *cq if (err) goto err_umem; =20 - err =3D mlx4_ib_umem_write_mtt(dev, &cq->resize_buf->buf.mtt, - cq->resize_umem); + err =3D mlx4_ib_umem_write_mtt(dev, &cq->resize_buf->buf.mtt, umem); if (err) goto err_mtt; =20 cq->resize_buf->cqe =3D entries - 1; =20 - return 0; - -err_mtt: - mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); - -err_umem: - ib_umem_release(cq->resize_umem); - cq->resize_umem =3D NULL; -err_buf: - kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - return err; -} - -int mlx4_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, - struct ib_udata *udata) -{ - struct mlx4_ib_dev *dev =3D to_mdev(ibcq->device); - struct mlx4_ib_cq *cq =3D to_mcq(ibcq); - struct mlx4_mtt mtt; - int err; - - if (entries > dev->dev->caps.max_cqes) - return -EINVAL; - - entries =3D roundup_pow_of_two(entries + 1); - if (entries =3D=3D ibcq->cqe + 1) - return 0; - - if (entries > dev->dev->caps.max_cqes + 1) - return -EINVAL; - - err =3D mlx4_alloc_resize_umem(dev, cq, entries, udata); - if (err) - return err; mtt =3D cq->buf.mtt; =20 err =3D mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.= mtt); if (err) - goto err_buf; + goto err_mtt; =20 mlx4_mtt_cleanup(dev->dev, &mtt); cq->buf =3D cq->resize_buf->buf; cq->ibcq.cqe =3D cq->resize_buf->cqe; ib_umem_release(cq->ibcq.umem); - cq->ibcq.umem =3D cq->resize_umem; + cq->ibcq.umem =3D umem; =20 kfree(cq->resize_buf); cq->resize_buf =3D NULL; - cq->resize_umem =3D NULL; return 0; =20 +err_mtt: + mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); =20 +err_umem: + ib_umem_release(umem); err_buf: - mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); kfree(cq->resize_buf); - cq->resize_buf =3D NULL; - - ib_umem_release(cq->resize_umem); - cq->resize_umem =3D NULL; return err; } =20 diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/m= lx4/mlx4_ib.h index 2f1043690554..4163a6cb32d0 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -120,7 +120,6 @@ struct mlx4_ib_cq { struct mlx4_ib_cq_resize *resize_buf; struct mlx4_db db; spinlock_t lock; - struct ib_umem *resize_umem; /* List of qps that it serves.*/ struct list_head send_qp_list; struct list_head recv_qp_list; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DA625357A37; Fri, 13 Feb 2026 11:01:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980509; cv=none; b=XXA48fOctLEkyp/Bx/HESkSuRMLF60SA1RSjQW5j5ufY4r00D2YMwu3PxDVnbMGrnkhngBfidSEUMZOTC3V2Cu8Xg8P0aRthvus6+b1B+N1uW5ganq7DuVAZFrP8ARDRJ95TqOcGLfnIHjV5SFeX5vKo6wF2AR4DCznJieFekR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980509; c=relaxed/simple; bh=lLHCx9P2BGRiklcIEpDq8X8RZoaLfrXAcvZBoAlyAtI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=nDblARFQqLvlcgjANbQrOODAR+qCcasOYymevjXX+kBdqo7GmFat6rmZ/pLdo0QFDMysaM8Fd+7i8qR8Ja1l67h/WC5Ky4YLVYYdgUuAhqjSaWQpk1trcJGxVZNHUkb7f2cn5OcSxo47CjCatwfXkHCD+atMpMG0knwITXeSR70= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YHIyne8u; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YHIyne8u" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 21A2DC116C6; Fri, 13 Feb 2026 11:01:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980509; bh=lLHCx9P2BGRiklcIEpDq8X8RZoaLfrXAcvZBoAlyAtI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YHIyne8uJHWl2oQrXX9a8i0T+gEfSU4DbwT5MkL9tbvrlHnCpXaeWg1fWMW2DAy/O T4U383e/7A3coRlaSbJk8qDhyfY45qLdaiMDZwcmn7Tm7vMn7YMyWWtcbUtNF09HcA 4MsY663jgdfIpOnjgr9MWhATxlOJdTN4ZVxJ3gjmG1Y8WHsm/D/QchOT0c+DfeTfaD TPf1ZbthhZRqI1dR4TgzueYzhMYkVwX7bOJbMnHRsOJk8OXNBYzlJcuf1FRL+/jaiI IJ9m+o4gwrwdYhK6KYu5Br8GR7IDRX1foHsfwCQMWQs2ZluChz5vlgujeKMIrwrJ8K PNsrHPtO4CzDQ== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 47/50] RDMA/mlx5: Use generic resize-CQ lock Date: Fri, 13 Feb 2026 12:58:23 +0200 Message-ID: <20260213-refactor-umem-v1-47-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Replace the open=E2=80=91coded resize=E2=80=91CQ lock with the standard core implementation for better consistency and maintainability. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 8 +------- drivers/infiniband/hw/mlx5/mlx5_ib.h | 3 --- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index 78c3494517d7..f7fb6f4aef7d 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -972,7 +972,6 @@ int mlx5_ib_create_user_cq(struct ib_cq *ibcq, return -EINVAL; =20 cq->ibcq.cqe =3D entries - 1; - mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); if (attr->flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) cq->private_flags |=3D MLX5_IB_CQ_PR_TIMESTAMP_COMPLETION; @@ -1057,7 +1056,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struc= t ib_cq_init_attr *attr, return -EINVAL; =20 cq->ibcq.cqe =3D entries - 1; - mutex_init(&cq->resize_mutex); spin_lock_init(&cq->lock); INIT_LIST_HEAD(&cq->list_send_qp); INIT_LIST_HEAD(&cq->list_recv_qp); @@ -1284,10 +1282,9 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned i= nt entries, if (entries =3D=3D ibcq->cqe + 1) return 0; =20 - mutex_lock(&cq->resize_mutex); err =3D resize_user(dev, cq, entries, udata, &cqe_size); if (err) - goto ex; + return err; =20 page_size =3D mlx5_umem_find_best_cq_quantized_pgoff( cq->resize_umem, cqc, log_page_size, MLX5_ADAPTER_PAGE_SHIFT, @@ -1339,7 +1336,6 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, ib_umem_release(cq->ibcq.umem); cq->ibcq.umem =3D cq->resize_umem; cq->resize_umem =3D NULL; - mutex_unlock(&cq->resize_mutex); =20 kvfree(in); return 0; @@ -1350,8 +1346,6 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, ex_resize: ib_umem_release(cq->resize_umem); cq->resize_umem =3D NULL; -ex: - mutex_unlock(&cq->resize_mutex); return err; } =20 diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/m= lx5/mlx5_ib.h index e99a647ed62d..7b34f32b5ecb 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -574,9 +574,6 @@ struct mlx5_ib_cq { */ spinlock_t lock; =20 - /* protect resize cq - */ - struct mutex resize_mutex; struct mlx5_ib_cq_buf *resize_buf; struct ib_umem *resize_umem; int cqe_size; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EC3E35EDAD; Fri, 13 Feb 2026 11:02:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980525; cv=none; b=TxCzRagqMSVV6WRfej4duomPPYLvVjB5v5Dg/IhM2kD9BgIp0cRAwSsB2+FsefoXZ/C5ngrVtVRelfkJMzQRTNNOlHNdMY9WClliRr462FohZ4CwcUHpv8GHK+9yXIsoEJ2Gdzw5tmNpEGqJILekypA/02BhbBOcS/xRnKvQoFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980525; c=relaxed/simple; bh=5ZIbUGGs+YK+IU7xvhz8h2Eb5dryzLeGsmBwdIcmdSc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rWYWLM+Gh+YpR6tUq5v2NTpdcnJOtZLgEM6lsuL2GRr4j2h1fqLB7YrO3i/QCaaUyQBm25Sooi+pZIqET8Uz16EhigtENLJxnnTGThPKJP2N0kGBnEirdEMGFKTm/7lBTtMZ4NJhYLRJfehBoZcLO0xYIZVXVt+Q2KiaGXCkpqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EvlIOKhn; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EvlIOKhn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1E9D0C116C6; Fri, 13 Feb 2026 11:02:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980524; bh=5ZIbUGGs+YK+IU7xvhz8h2Eb5dryzLeGsmBwdIcmdSc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EvlIOKhnsQGkKppFt1lN/N6Z1fysGoXAX9xR5snDsQfYdnOtpp84Dh+lQ5kWRcwVp tLMY1Gt8NC/qUSk8J72rkaAVaKb9PaVdfUuKlhPfPfTbqP2gfyCXAWh9ZL9wLiYjZh /piW4K1lACWsruRpyKPTgm84t3ne6QoJE62N6YQwmMzCorByFKAV6h+Oh/UrldhNcO +7gLnMuxD/6mgiZr0yGhdeK/5JzbRbg+KkFRG/BlBVIbbTS6x/vqE+yN8Ga4zL8Xc8 xE4OZ/hY58bFtm5/eri2gVLGfUZqDgjnDmmxfPUXZSqw6jH5SvcyRKAk0pAJu96Xoj RZ0unm6gYI6Mw== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: =?utf-8?q?=5BPATCH_rdma-next_48/50=5D_RDMA/mlx5=3A_Select_resize?= =?utf-8?q?=E2=80=91CQ_callback_based_on_device_capabilities?= Date: Fri, 13 Feb 2026 12:58:24 +0200 Message-ID: <20260213-refactor-umem-v1-48-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Remove the legacy capability check when issuing the resize=E2=80=91CQ comma= nd. Instead, rely on choosing the correct ops during initialization. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 5 ----- drivers/infiniband/hw/mlx5/main.c | 8 +++++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index f7fb6f4aef7d..88f0f5e2944f 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -1267,11 +1267,6 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned i= nt entries, int inlen; int cqe_size; =20 - if (!MLX5_CAP_GEN(dev->mdev, cq_resize)) { - pr_info("Firmware does not support resize CQ\n"); - return -ENOSYS; - } - if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) return -EINVAL; =20 diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5= /main.c index 0471155eb739..f86721681f5b 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -4496,7 +4496,6 @@ static const struct ib_device_ops mlx5_ib_dev_ops =3D= { .reg_user_mr_dmabuf =3D mlx5_ib_reg_user_mr_dmabuf, .req_notify_cq =3D mlx5_ib_arm_cq, .rereg_user_mr =3D mlx5_ib_rereg_user_mr, - .resize_user_cq =3D mlx5_ib_resize_cq, .ufile_hw_cleanup =3D mlx5_ib_ufile_hw_cleanup, =20 INIT_RDMA_OBJ_SIZE(ib_ah, mlx5_ib_ah, ibah), @@ -4509,6 +4508,10 @@ static const struct ib_device_ops mlx5_ib_dev_ops = =3D { INIT_RDMA_OBJ_SIZE(ib_ucontext, mlx5_ib_ucontext, ibucontext), }; =20 +static const struct ib_device_ops mlx5_ib_dev_resize_cq_ops =3D { + .resize_user_cq =3D mlx5_ib_resize_cq, +}; + static const struct ib_device_ops mlx5_ib_dev_ipoib_enhanced_ops =3D { .rdma_netdev_get_params =3D mlx5_ib_rn_get_params, }; @@ -4635,6 +4638,9 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev= *dev) =20 ib_set_device_ops(&dev->ib_dev, &mlx5_ib_dev_ops); =20 + if (MLX5_CAP_GEN(mdev, cq_resize)) + ib_set_device_ops(&dev->ib_dev, &mlx5_ib_dev_resize_cq_ops); + if (IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)) dev->ib_dev.driver_def =3D mlx5_ib_defs; =20 --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 726841F03EF; Fri, 13 Feb 2026 11:01:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980517; cv=none; b=OabCeXlSs6HeadUhFaAoQfZ944OOGhFSoCt0Xzn5tkt3M63Y4NwOKFQjXxB8FfOX6oBwWN4rVUuXpRSunR2bC1Wscg7QNp9/rVhZf66XUhMVYkeTpPJytkOrz873t05UPd/TU7AzB6xpvu+bxxZKbfyB9bPBahl3a/WpdjmBp0U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980517; c=relaxed/simple; bh=fNGUs5AQ9nFbUrFwGoGxWr1OmLlcSEue3DXaKTPPRPk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=txlYzhtRPnIrezTOucUUE4BP1qeesmf+qUZ/6ul0TpwLhBOXkZ7dFm351aGTdws8Z/OJAElpjz4RgczqRXCPlyaXOHx8HW8pVlbLd7CcSyK1IsN2nOoGuqCOG50YLXWcgHe//a9v1AhT1OxMJTGZwQa0wCzklBBFQu70LsrZBQ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rsk1ivq2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rsk1ivq2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 128FAC116C6; Fri, 13 Feb 2026 11:01:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980517; bh=fNGUs5AQ9nFbUrFwGoGxWr1OmLlcSEue3DXaKTPPRPk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rsk1ivq24d8TYk4UHjpwCHlqD31mwB7ASM9n0clduY4Zji/wYQ9eFiS7t9WmezbPG FJ54S2ojCM/lw4qqX5Ep1QIKruMUTz9V9GRa+1rnqh2OqwVAKETBVvYsqEdWTtQzNf ahdkZany5kNDlNXkf+WT9aOE4AD/+QCsGHYn08icjUVfM/txKOUpFyO5cOLOKM9O6t FPp2oncY193CPGUA+4k1Gl8ZLFniOzPtKZPFSAVBWbKs8lQxBMxQSJygwOnchutPoy oUB78fzdDPWMPzqYtNYii+RNVqX054Hr0mXPskQxFuzxcf+AvsmU6PfquC2oUSXXow eQGHUGguxz9oA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 49/50] RDMA/mlx5: Reduce CQ memory footprint Date: Fri, 13 Feb 2026 12:58:25 +0200 Message-ID: <20260213-refactor-umem-v1-49-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There is no need to store a temporary umem pointer in the generic CQ object. Use an on=E2=80=91stack variable instead. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 64 ++++++++++++--------------------= ---- drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 - 2 files changed, 21 insertions(+), 44 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/c= q.c index 88f0f5e2944f..6d9b62742674 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -1218,44 +1218,13 @@ int mlx5_ib_modify_cq(struct ib_cq *cq, u16 cq_coun= t, u16 cq_period) return err; } =20 -static int resize_user(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, - int entries, struct ib_udata *udata, - int *cqe_size) -{ - struct mlx5_ib_resize_cq ucmd; - struct ib_umem *umem; - int err; - - err =3D ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)); - if (err) - return err; - - if (ucmd.reserved0 || ucmd.reserved1) - return -EINVAL; - - /* check multiplication overflow */ - if (ucmd.cqe_size && SIZE_MAX / ucmd.cqe_size <=3D entries - 1) - return -EINVAL; - - umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, - (size_t)ucmd.cqe_size * entries, - IB_ACCESS_LOCAL_WRITE); - if (IS_ERR(umem)) { - err =3D PTR_ERR(umem); - return err; - } - - cq->resize_umem =3D umem; - *cqe_size =3D ucmd.cqe_size; - - return 0; -} - int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned int entries, struct ib_udata *udata) { struct mlx5_ib_dev *dev =3D to_mdev(ibcq->device); struct mlx5_ib_cq *cq =3D to_mcq(ibcq); + struct mlx5_ib_resize_cq ucmd; + struct ib_umem *umem; unsigned long page_size; void *cqc; u32 *in; @@ -1264,8 +1233,8 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, __be64 *pas; unsigned int page_offset_quantized =3D 0; unsigned int page_shift; + size_t umem_size; int inlen; - int cqe_size; =20 if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) return -EINVAL; @@ -1277,18 +1246,29 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned = int entries, if (entries =3D=3D ibcq->cqe + 1) return 0; =20 - err =3D resize_user(dev, cq, entries, udata, &cqe_size); + err =3D ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)); if (err) return err; =20 + if (ucmd.reserved0 || ucmd.reserved1) + return -EINVAL; + + if (check_mul_overflow(ucmd.cqe_size, entries, &umem_size)) + return -EINVAL; + + umem =3D ib_umem_get(&dev->ib_dev, ucmd.buf_addr, umem_size, + IB_ACCESS_LOCAL_WRITE); + if (IS_ERR(umem)) + return PTR_ERR(umem); + page_size =3D mlx5_umem_find_best_cq_quantized_pgoff( - cq->resize_umem, cqc, log_page_size, MLX5_ADAPTER_PAGE_SHIFT, + umem, cqc, log_page_size, MLX5_ADAPTER_PAGE_SHIFT, page_offset, 64, &page_offset_quantized); if (!page_size) { err =3D -EINVAL; goto ex_resize; } - npas =3D ib_umem_num_dma_blocks(cq->resize_umem, page_size); + npas =3D ib_umem_num_dma_blocks(umem, page_size); page_shift =3D order_base_2(page_size); =20 inlen =3D MLX5_ST_SZ_BYTES(modify_cq_in) + @@ -1301,7 +1281,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, } =20 pas =3D (__be64 *)MLX5_ADDR_OF(modify_cq_in, in, pas); - mlx5_ib_populate_pas(cq->resize_umem, 1UL << page_shift, pas, 0); + mlx5_ib_populate_pas(umem, 1UL << page_shift, pas, 0); =20 MLX5_SET(modify_cq_in, in, modify_field_select_resize_field_select.resize_field_select.resize_fiel= d_select, @@ -1315,7 +1295,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, page_shift - MLX5_ADAPTER_PAGE_SHIFT); MLX5_SET(cqc, cqc, page_offset, page_offset_quantized); MLX5_SET(cqc, cqc, cqe_sz, - cqe_sz_to_mlx_sz(cqe_size, + cqe_sz_to_mlx_sz(ucmd.cqe_size, cq->private_flags & MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD)); MLX5_SET(cqc, cqc, log_cq_size, ilog2(entries)); @@ -1329,8 +1309,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, =20 cq->ibcq.cqe =3D entries - 1; ib_umem_release(cq->ibcq.umem); - cq->ibcq.umem =3D cq->resize_umem; - cq->resize_umem =3D NULL; + cq->ibcq.umem =3D umem; =20 kvfree(in); return 0; @@ -1339,8 +1318,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, unsigned in= t entries, kvfree(in); =20 ex_resize: - ib_umem_release(cq->resize_umem); - cq->resize_umem =3D NULL; + ib_umem_release(umem); return err; } =20 diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/m= lx5/mlx5_ib.h index 7b34f32b5ecb..11e4b2ae0469 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -575,7 +575,6 @@ struct mlx5_ib_cq { spinlock_t lock; =20 struct mlx5_ib_cq_buf *resize_buf; - struct ib_umem *resize_umem; int cqe_size; struct list_head list_send_qp; struct list_head list_recv_qp; --=20 2.52.0 From nobody Thu Apr 2 20:21:30 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6921E3596E4; Fri, 13 Feb 2026 11:02:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980521; cv=none; b=X2IWbTQWBeeER8Nq5rETZN3TG+skYoM+zP4etYcp+9hawUmPkiVw3grGmPS6XTbSYwLIaqq9cED1eLivnbUeTzq7zMQr4agU7j0QLBdmqtW8aoj6sDeWEq2r6teeAKeohC/KrZMRIYtrz9DqijAJ5k5dTu/MmUG4Dd4fZMwUG+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770980521; c=relaxed/simple; bh=46FOhXy82s7WTWz6+l85BPMRthsUy90zX4MlVpe3m6w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Cne7TwDsO/PcFPcTirSsxcYwZ8y+90dc4kBD5h5VLeS6FL6CAXb808B+HarxY3sh5neJvkLbsU3CYpbf4pisdwqROn/oiZsjHYLytvaX0mJYJIz7tzxf5t/Rgkt8VMeB32XUMOCSaDp1osc6X/K/JQ7tssapJiXiQLi+BEq6k+c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mFbKbfqu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mFbKbfqu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0FA60C116C6; Fri, 13 Feb 2026 11:02:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770980521; bh=46FOhXy82s7WTWz6+l85BPMRthsUy90zX4MlVpe3m6w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mFbKbfqudf4zer/t7PIEGz2aaHZV/Rfc7eXOFwMRdcf5T243TjgDF6GAKPJNx2DQx mbdU8jSd+n2nLYbqzOt1vi/+NuWS6MY2PI0vG0rm5fhM3mq7Q3uTvoRFX29OeFqI2e Dq7uOZRHqAwrC+7oaeCIqDF6wcbr8sMhfiwBzQF+rW5L/b4vNQY78iPvw2yFRHrBbw kVtuKgwFot52fCK8DF+k3q3iAbRz8bL0//Ucp6sCKVq06Ba/nX1lI6CNM8ChReYcNi LAxNRUOLuXadHun8HBVM0M2S3i+Ph3DTCs2ApGBKWZweeT1gdp4HqwXdPAP9RV99tB tjAiuscfqHbLA== From: Leon Romanovsky To: Jason Gunthorpe , Leon Romanovsky , Selvin Xavier , Kalesh AP , Potnuri Bharat Teja , Michael Margolin , Gal Pressman , Yossi Leybovich , Cheng Xu , Kai Shen , Chengchang Tang , Junxian Huang , Abhijit Gangurde , Allen Hubbe , Krzysztof Czurylo , Tatyana Nikolova , Long Li , Konstantin Taranov , Yishai Hadas , Michal Kalderon , Bryan Tan , Vishnu Dasa , Broadcom internal kernel review list , Christian Benvenuti , Nelson Escobar , Dennis Dalessandro , Bernard Metzler , Zhu Yanjun Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org Subject: [PATCH rdma-next 50/50] RDMA/mthca: Use generic resize-CQ lock Date: Fri, 13 Feb 2026 12:58:26 +0200 Message-ID: <20260213-refactor-umem-v1-50-f3be85847922@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> References: <20260213-refactor-umem-v1-0-f3be85847922@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-47773 Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky Replace the open=E2=80=91coded resize=E2=80=91CQ lock with the standard core implementation for better consistency and maintainability. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mthca/mthca_cq.c | 1 - drivers/infiniband/hw/mthca/mthca_provider.c | 20 ++++++-------------- drivers/infiniband/hw/mthca/mthca_provider.h | 1 - 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw= /mthca/mthca_cq.c index 26c3408dcaca..9c15e9b886d1 100644 --- a/drivers/infiniband/hw/mthca/mthca_cq.c +++ b/drivers/infiniband/hw/mthca/mthca_cq.c @@ -819,7 +819,6 @@ int mthca_init_cq(struct mthca_dev *dev, int nent, spin_lock_init(&cq->lock); cq->refcount =3D 1; init_waitqueue_head(&cq->wait); - mutex_init(&cq->mutex); =20 memset(cq_context, 0, sizeof *cq_context); cq_context->flags =3D cpu_to_be32(MTHCA_CQ_STATUS_OK | diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infinib= and/hw/mthca/mthca_provider.c index 85de004547ab..cb94d73e89d6 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -680,28 +680,20 @@ static int mthca_resize_cq(struct ib_cq *ibcq, unsign= ed int entries, if (entries > dev->limits.max_cqes) return -EINVAL; =20 - mutex_lock(&cq->mutex); - entries =3D roundup_pow_of_two(entries + 1); - if (entries =3D=3D ibcq->cqe + 1) { - ret =3D 0; - goto out; - } + if (entries =3D=3D ibcq->cqe + 1) + return 0; =20 - if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) { - ret =3D -EFAULT; - goto out; - } + if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) + return -EFAULT; lkey =3D ucmd.lkey; =20 ret =3D mthca_RESIZE_CQ(dev, cq->cqn, lkey, ilog2(entries)); if (ret) - goto out; + return ret; =20 ibcq->cqe =3D entries - 1; -out: - mutex_unlock(&cq->mutex); - return ret; + return 0; } =20 static int mthca_destroy_cq(struct ib_cq *cq, struct ib_udata *udata) diff --git a/drivers/infiniband/hw/mthca/mthca_provider.h b/drivers/infinib= and/hw/mthca/mthca_provider.h index 8a77483bb33c..7797d76fb93d 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.h +++ b/drivers/infiniband/hw/mthca/mthca_provider.h @@ -198,7 +198,6 @@ struct mthca_cq { int arm_sn; =20 wait_queue_head_t wait; - struct mutex mutex; }; =20 struct mthca_srq { --=20 2.52.0