From nobody Tue Sep 15 14:47:53 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hklHZ2j8yz6sKV8 for ; Tue, 15 Sep 2026 14:47:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hklHZ0TQyz4P7V for ; Tue, 15 Sep 2026 14:47:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789483674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Ong+ZPMGbN4FGlPYM6JZdPjjen406ldw9X1Jpx19Kps=; b=YvSSmTLwo6RDvW/eB/j0ZFHp8qg/FrWeH1rwgjBy2EuMBbufdiFpv8EhAigllPSca0wFNZ sttRLuw997qlUdzrZkrHCJ4LueGClkF5SwBKxrIrPYQnVlPo66DZB++rB7cmPYdgDba4GK yYFfscBsUqV8NfU7CBvYEkYXWhEC0C+ldeSF3c8KY73/aMu6QAxn046aLV8u78+pCsxfYJ 18VtzaF2jEmKppYzz+wykoqAyPNU6H62x7HlYFRr9/EcH7gTuavsV5rO6eSpPevKLKic/e sQwHvq7ZZ2jAj/xllcyzojBRRnIdbq1WCtiQAdSYQZ4RhREep3HlLeWJdNGhQA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789483674; b=BNAQla8mvdpwuL4g6vbrVaGnSIS4ADJgvDnlzMprYb+NGzxQzMyzfiq6Rr2m9+wTlLYCtW Y3C/ILvaeIONaCkQg6L0oXU7VHhecIUTojkefpwSXzKrEi2UAuK1aesnqrmETfdPu4jMnq n9b99K2k0CwVnvLccdWTwx4z7j9dT7h5D3JmhX/Jg+8BL/6de+21/HIU8YLEf8lmckiCAh kYhxNUfJmFt3OByh4qFaa8T0r4VeWABi5YC4hmJ7jtsPgaHnZiDvT9V83LfjCjL5qkCBzb ar7yAh2748Z/gRthjXb0NFnEV6sUR4Gs4PCGc55sMQCmlH1j08SjCn1slEi92Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789483674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Ong+ZPMGbN4FGlPYM6JZdPjjen406ldw9X1Jpx19Kps=; b=LWwP77jQ/lB7v8YWDEGSyAcjStMgYxOIEPIVPJjiieOIR1Gc/cB9YKClV0hZPcKZ7Ie/iO 2+iidoSC45hDt7HOEhA0xHR4O0ajgPAlidULCFL+2X0pggPQghjS3HUSRQXzKuCIFlJ8uq RpT8y8unoVnBAHsDB35TWy2uhBO572MkIvF8LVDAPXbjRwvV4ti9o908MOABw/0jGXMxF/ YJBlNgadpBkF4sclN2Ag/rnytKgiaKhjJmKUCIEvxdMVV1vuhQf59yIzKHUElJIaoFmtUw 5ycgULCNJDxuCM5iZm3zDcdVpIfHwy6qtB/A48QPHcDiEXwHB7mIA01guX76ag== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hklHY6glJz14Hf for ; Tue, 15 Sep 2026 14:47:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 37bbd by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 15 Sep 2026 14:47:53 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Matthew Wilcox From: John Baldwin Subject: git: f9076bdaa253 - main - iw_cxgbe: Use XArray instead of IDR List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f9076bdaa253c71e49caff9b8fc65bfcf52c5393 Auto-Submitted: auto-generated Date: Tue, 15 Sep 2026 14:47:53 +0000 Message-Id: <6aa95a99.37bbd.6185d98a@gitrepo.freebsd.org> The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=f9076bdaa253c71e49caff9b8fc65bfcf52c5393 commit f9076bdaa253c71e49caff9b8fc65bfcf52c5393 Author: Matthew Wilcox AuthorDate: 2019-02-21 00:20:52 +0000 Commit: John Baldwin CommitDate: 2026-09-15 14:22:39 +0000 iw_cxgbe: Use XArray instead of IDR Obtained from: Linux commit 52e124c27e7bfb78980189bdfec049594d7612be Obtained from: Linux commit 2f43129127e62b25f56ff82a37c40b42c0e6f883 Obtained from: Linux commit 7a268a93973c07f93e952d96c2faa88df8ed38d8 Sponsored by: Chelsio Communications Co-authored-by: Potnuri Bharat Teja --- sys/dev/cxgbe/iw_cxgbe/cq.c | 6 ++-- sys/dev/cxgbe/iw_cxgbe/device.c | 13 ++++---- sys/dev/cxgbe/iw_cxgbe/ev.c | 17 +++++----- sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h | 69 +++------------------------------------ sys/dev/cxgbe/iw_cxgbe/mem.c | 16 ++++----- sys/dev/cxgbe/iw_cxgbe/qp.c | 16 +++++---- 6 files changed, 40 insertions(+), 97 deletions(-) diff --git a/sys/dev/cxgbe/iw_cxgbe/cq.c b/sys/dev/cxgbe/iw_cxgbe/cq.c index 5c3caf9d28bc..3e5052d3a6cc 100644 --- a/sys/dev/cxgbe/iw_cxgbe/cq.c +++ b/sys/dev/cxgbe/iw_cxgbe/cq.c @@ -912,7 +912,7 @@ void c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata) CTR2(KTR_IW_CXGBE, "%s ib_cq %p", __func__, ib_cq); chp = to_c4iw_cq(ib_cq); - remove_handle(chp->rhp, &chp->rhp->cqidr, chp->cq.cqid); + xa_erase_irq(&chp->rhp->cqs, chp->cq.cqid); atomic_dec(&chp->refcnt); wait_event(chp->wait, !atomic_read(&chp->refcnt)); @@ -1000,7 +1000,7 @@ int c4iw_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, spin_lock_init(&chp->comp_handler_lock); atomic_set(&chp->refcnt, 1); init_waitqueue_head(&chp->wait); - ret = insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid); + ret = xa_insert_irq(&rhp->cqs, chp->cq.cqid, chp, GFP_KERNEL); if (ret) goto err_destroy_cq; @@ -1049,7 +1049,7 @@ err_free_mm2: err_free_mm: kfree(mm); err_remove_handle: - remove_handle(rhp, &rhp->cqidr, chp->cq.cqid); + xa_erase_irq(&rhp->cqs, chp->cq.cqid); err_destroy_cq: destroy_cq(&chp->rhp->rdev, &chp->cq, ucontext ? &ucontext->uctx : &rhp->rdev.uctx, chp->wr_waitp); diff --git a/sys/dev/cxgbe/iw_cxgbe/device.c b/sys/dev/cxgbe/iw_cxgbe/device.c index f28eeec9b5ff..c467eea7534d 100644 --- a/sys/dev/cxgbe/iw_cxgbe/device.c +++ b/sys/dev/cxgbe/iw_cxgbe/device.c @@ -40,7 +40,6 @@ #include #include -#include #ifdef TCP_OFFLOAD #include "iw_cxgbe.h" @@ -190,9 +189,9 @@ c4iw_dealloc(struct c4iw_dev *iwsc) { c4iw_rdev_close(&iwsc->rdev); - idr_destroy(&iwsc->cqidr); - idr_destroy(&iwsc->qpidr); - idr_destroy(&iwsc->mmidr); + WARN_ON(!xa_empty(&iwsc->cqs)); + WARN_ON(!xa_empty(&iwsc->qps)); + WARN_ON(!xa_empty(&iwsc->mrs)); ib_dealloc_device(&iwsc->ibdev); } @@ -239,9 +238,9 @@ c4iw_alloc(struct adapter *sc) return (ERR_PTR(rc)); } - idr_init(&iwsc->cqidr); - idr_init(&iwsc->qpidr); - idr_init(&iwsc->mmidr); + xa_init_flags(&iwsc->cqs, XA_FLAGS_LOCK_IRQ); + xa_init_flags(&iwsc->qps, XA_FLAGS_LOCK_IRQ); + xa_init_flags(&iwsc->mrs, XA_FLAGS_LOCK_IRQ); spin_lock_init(&iwsc->lock); mutex_init(&iwsc->rdev.stats.lock); iwsc->avail_ird = iwsc->rdev.adap->params.max_ird_adapter; diff --git a/sys/dev/cxgbe/iw_cxgbe/ev.c b/sys/dev/cxgbe/iw_cxgbe/ev.c index 7185bda1e2ed..b2bfd2ae3279 100644 --- a/sys/dev/cxgbe/iw_cxgbe/ev.c +++ b/sys/dev/cxgbe/iw_cxgbe/ev.c @@ -161,7 +161,8 @@ void c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe) u32 cqid; spin_lock_irq(&dev->lock); - qhp = get_qhp(dev, CQE_QPID(err_cqe)); + xa_lock_irq(&dev->qps); + qhp = xa_load(&dev->qps, CQE_QPID(err_cqe)); if (!qhp) { printf("BAD AE qpid 0x%x opcode %d " "status 0x%x type %d wrid.hi 0x%x wrid.lo 0x%x\n", @@ -169,7 +170,7 @@ void c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe) CQE_OPCODE(err_cqe), CQE_STATUS(err_cqe), CQE_TYPE(err_cqe), CQE_WRID_HI(err_cqe), CQE_WRID_LOW(err_cqe)); - spin_unlock_irq(&dev->lock); + xa_unlock_irq(&dev->qps); goto out; } @@ -185,13 +186,13 @@ void c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe) CQE_OPCODE(err_cqe), CQE_STATUS(err_cqe), CQE_TYPE(err_cqe), CQE_WRID_HI(err_cqe), CQE_WRID_LOW(err_cqe)); - spin_unlock_irq(&dev->lock); + xa_unlock_irq(&dev->qps); goto out; } c4iw_qp_add_ref(&qhp->ibqp); atomic_inc(&chp->refcnt); - spin_unlock_irq(&dev->lock); + xa_unlock_irq(&dev->qps); /* Bad incoming write */ if (RQ_TYPE(err_cqe) && @@ -266,11 +267,11 @@ int c4iw_ev_handler(struct sge_iq *iq, const struct rsp_ctrl *rc) struct c4iw_cq *chp; unsigned long flag; - spin_lock_irqsave(&dev->lock, flag); - chp = get_chp(dev, qid); + xa_lock_irqsave(&dev->cqs, flag); + chp = xa_load(&dev->cqs, qid); if (chp) { atomic_inc(&chp->refcnt); - spin_unlock_irqrestore(&dev->lock, flag); + xa_unlock_irqrestore(&dev->cqs, flag); spin_lock_irqsave(&chp->comp_handler_lock, flag); (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context); @@ -279,7 +280,7 @@ int c4iw_ev_handler(struct sge_iq *iq, const struct rsp_ctrl *rc) wake_up(&chp->wait); } else { CTR2(KTR_IW_CXGBE, "%s unknown cqid 0x%x", __func__, qid); - spin_unlock_irqrestore(&dev->lock, flag); + xa_unlock_irqrestore(&dev->cqs, flag); } return 0; diff --git a/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h b/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h index 6fb061263956..2112c4178591 100644 --- a/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h +++ b/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h @@ -35,7 +35,6 @@ #include #include -#include #include #include #include @@ -296,9 +295,9 @@ struct c4iw_dev { struct pci_dev pdev; struct c4iw_rdev rdev; u32 device_cap_flags; - struct idr cqidr; - struct idr qpidr; - struct idr mmidr; + struct xarray cqs; + struct xarray qps; + struct xarray mrs; spinlock_t lock; struct dentry *debugfs_root; u32 avail_ird; @@ -316,70 +315,12 @@ static inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev) static inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid) { - return idr_find(&rhp->cqidr, cqid); + return xa_load(&rhp->cqs, cqid); } static inline struct c4iw_qp *get_qhp(struct c4iw_dev *rhp, u32 qpid) { - return idr_find(&rhp->qpidr, qpid); -} - -static inline struct c4iw_mr *get_mhp(struct c4iw_dev *rhp, u32 mmid) -{ - return idr_find(&rhp->mmidr, mmid); -} - -static inline int _insert_handle(struct c4iw_dev *rhp, struct idr *idr, - void *handle, u32 id, int lock) -{ - int ret; - int newid; - - do { - if (!idr_pre_get(idr, lock ? GFP_KERNEL : GFP_ATOMIC)) - return -ENOMEM; - if (lock) - spin_lock_irq(&rhp->lock); - ret = idr_get_new_above(idr, handle, id, &newid); - BUG_ON(!ret && newid != id); - if (lock) - spin_unlock_irq(&rhp->lock); - } while (ret == -EAGAIN); - - return ret; -} - -static inline int insert_handle(struct c4iw_dev *rhp, struct idr *idr, - void *handle, u32 id) -{ - return _insert_handle(rhp, idr, handle, id, 1); -} - -static inline int insert_handle_nolock(struct c4iw_dev *rhp, struct idr *idr, - void *handle, u32 id) -{ - return _insert_handle(rhp, idr, handle, id, 0); -} - -static inline void _remove_handle(struct c4iw_dev *rhp, struct idr *idr, - u32 id, int lock) -{ - if (lock) - spin_lock_irq(&rhp->lock); - idr_remove(idr, id); - if (lock) - spin_unlock_irq(&rhp->lock); -} - -static inline void remove_handle(struct c4iw_dev *rhp, struct idr *idr, u32 id) -{ - _remove_handle(rhp, idr, id, 1); -} - -static inline void remove_handle_nolock(struct c4iw_dev *rhp, - struct idr *idr, u32 id) -{ - _remove_handle(rhp, idr, id, 0); + return xa_load(&rhp->qps, qpid); } extern int c4iw_max_read_depth; diff --git a/sys/dev/cxgbe/iw_cxgbe/mem.c b/sys/dev/cxgbe/iw_cxgbe/mem.c index b54c74380c74..1f2c57719873 100644 --- a/sys/dev/cxgbe/iw_cxgbe/mem.c +++ b/sys/dev/cxgbe/iw_cxgbe/mem.c @@ -324,7 +324,7 @@ static int finish_mem_reg(struct c4iw_mr *mhp, u32 stag) mmid = stag >> 8; mhp->ibmr.rkey = mhp->ibmr.lkey = stag; CTR3(KTR_IW_CXGBE, "%s mmid 0x%x mhp %p", __func__, mmid, mhp); - return insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid); + return xa_insert_irq(&mhp->rhp->mrs, mmid, mhp, GFP_KERNEL); } static int register_mem(struct c4iw_dev *rhp, struct c4iw_pd *php, @@ -558,7 +558,7 @@ struct ib_mw *c4iw_alloc_mw(struct ib_pd *pd, enum ib_mw_type type, mhp->attr.stag = stag; mmid = (stag) >> 8; mhp->ibmw.rkey = stag; - if (insert_handle(rhp, &rhp->mmidr, mhp, mmid)) { + if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) { goto dealloc_win; } CTR4(KTR_IW_CXGBE, "%s mmid 0x%x mhp %p stag 0x%x", __func__, mmid, mhp, @@ -583,7 +583,7 @@ int c4iw_dealloc_mw(struct ib_mw *mw) mhp = to_c4iw_mw(mw); rhp = mhp->rhp; mmid = (mw->rkey) >> 8; - remove_handle(rhp, &rhp->mmidr, mmid); + xa_erase_irq(&rhp->mrs, mmid); deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->wr_waitp); c4iw_put_wr_wait(mhp->wr_waitp); kfree(mhp); @@ -651,7 +651,7 @@ struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, mhp->attr.state = 0; mmid = (stag) >> 8; mhp->ibmr.rkey = mhp->ibmr.lkey = stag; - if (insert_handle(rhp, &rhp->mmidr, mhp, mmid)) { + if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) { ret = -ENOMEM; goto err_dereg; } @@ -708,7 +708,7 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) mhp = to_c4iw_mr(ib_mr); rhp = mhp->rhp; mmid = mhp->attr.stag >> 8; - remove_handle(rhp, &rhp->mmidr, mmid); + xa_erase_irq(&rhp->mrs, mmid); dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, mhp->attr.pbl_addr, mhp->wr_waitp); if (mhp->attr.pbl_size) @@ -729,10 +729,10 @@ void c4iw_invalidate_mr(struct c4iw_dev *rhp, u32 rkey) struct c4iw_mr *mhp; unsigned long flags; - spin_lock_irqsave(&rhp->lock, flags); - mhp = get_mhp(rhp, rkey >> 8); + xa_lock_irqsave(&rhp->mrs, flags); + mhp = xa_load(&rhp->mrs, rkey >> 8); if (mhp) mhp->attr.state = 0; - spin_unlock_irqrestore(&rhp->lock, flags); + xa_unlock_irqrestore(&rhp->mrs, flags); } #endif diff --git a/sys/dev/cxgbe/iw_cxgbe/qp.c b/sys/dev/cxgbe/iw_cxgbe/qp.c index f4c620749db5..0f9466089beb 100644 --- a/sys/dev/cxgbe/iw_cxgbe/qp.c +++ b/sys/dev/cxgbe/iw_cxgbe/qp.c @@ -71,12 +71,12 @@ static int alloc_ird(struct c4iw_dev *dev, u32 ird) { int ret = 0; - spin_lock_irq(&dev->lock); + xa_lock_irq(&dev->qps); if (ird <= dev->avail_ird) dev->avail_ird -= ird; else ret = -ENOMEM; - spin_unlock_irq(&dev->lock); + xa_unlock_irq(&dev->qps); if (ret) log(LOG_WARNING, "%s: device IRD resources exhausted\n", @@ -87,9 +87,9 @@ static int alloc_ird(struct c4iw_dev *dev, u32 ird) static void free_ird(struct c4iw_dev *dev, int ird) { - spin_lock_irq(&dev->lock); + xa_lock_irq(&dev->qps); dev->avail_ird += ird; - spin_unlock_irq(&dev->lock); + xa_unlock_irq(&dev->qps); } static void set_state(struct c4iw_qp *qhp, enum c4iw_qp_state state) @@ -1931,7 +1931,9 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata) c4iw_modify_qp(rhp, qhp, C4IW_QP_ATTR_NEXT_STATE, &attrs, 0); wait_event(qhp->wait, !qhp->ep); - remove_handle(rhp, &rhp->qpidr, qhp->wq.sq.qid); + xa_lock_irq(&rhp->qps); + __xa_erase(&rhp->qps, qhp->wq.sq.qid); + xa_unlock_irq(&rhp->qps); free_ird(rhp, qhp->attr.max_ird); c4iw_qp_rem_ref(ib_qp); @@ -2046,7 +2048,7 @@ c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, kref_init(&qhp->kref); INIT_WORK(&qhp->free_work, free_qp_work); - ret = insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.sq.qid); + ret = xa_insert_irq(&rhp->qps, qhp->wq.sq.qid, qhp, GFP_KERNEL); if (ret) goto err_destroy_qp; @@ -2145,7 +2147,7 @@ err_free_rq_key: err_free_sq_key: kfree(sq_key_mm); err_remove_handle: - remove_handle(rhp, &rhp->qpidr, qhp->wq.sq.qid); + xa_erase_irq(&rhp->qps, qhp->wq.sq.qid); err_destroy_qp: destroy_qp(&rhp->rdev, &qhp->wq, ucontext ? &ucontext->uctx : &rhp->rdev.uctx);