From nobody Sat Apr 4 03:20:29 2026 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7C0CF3AA4E4; Fri, 20 Mar 2026 23:54:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774050880; cv=none; b=PPwYLGyjkBI9BEmmh2nF9j7sZrWjZ5OOgCcf5lkZxVgqJIfsOREGJpcSwLZIi7QGHcrAPRw83UHMSj9ppggFy+9pstgeWxINxiSTD1lMrmWh8YU1z7Dq1jz9RF0NvCk/cSzygpDbwAOEwcbYLzhfTR8m9r3DdWk9E9hY8DVtjws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774050880; c=relaxed/simple; bh=7U3YWQS7u2xteMc7s0vtl7nKzK9zjYBg+daZ4w0aDxw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=so3v0RUVOvpdnl01I87FjfEIrtzv0Ig2sUL8Pq0wGKNdn9Lb5brVOSaisHxzvn9Wj3oGi1u+eV4KqtepKUR0spI3VoQcyi8q8MbdNzwXsKn74VocYjWKt+unLCXJi2ZnU40T8SYJOrHb8Fkbnw355z4jHcNvN8YRxr3T0hbNvuw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Received: by linux.microsoft.com (Postfix, from userid 1202) id 72BB820B6F08; Fri, 20 Mar 2026 16:54:38 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 72BB820B6F08 From: Long Li To: Long Li , Konstantin Taranov , Jakub Kicinski , "David S . Miller" , Paolo Abeni , Eric Dumazet , Andrew Lunn , Jason Gunthorpe , Leon Romanovsky , Haiyang Zhang , "K . Y . Srinivasan" , Wei Liu , Dexuan Cui Cc: Simon Horman , netdev@vger.kernel.org, linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v4 6/6] RDMA/mana_ib: Allocate interrupt contexts on EQs Date: Fri, 20 Mar 2026 16:54:19 -0700 Message-ID: <899e1c1e2e8fd6a0c94aafa67051376993c1a820.1774049761.git.longli@microsoft.com> X-Mailer: git-send-email 2.43.7 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the GIC functions to allocate interrupt contexts for RDMA EQs. These interrupt contexts may be shared with Ethernet EQs when MSI-X vectors are limited. The driver now supports allocating dedicated MSI-X for each EQ. Indicate this capability through driver capability bits. Signed-off-by: Long Li --- drivers/infiniband/hw/mana/main.c | 33 ++++++++++++++++++++++++++----- include/net/mana/gdma.h | 7 +++++-- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/drivers/infiniband/hw/mana/main.c b/drivers/infiniband/hw/mana= /main.c index d51dd0ee85f4..0b74dd093b41 100644 --- a/drivers/infiniband/hw/mana/main.c +++ b/drivers/infiniband/hw/mana/main.c @@ -787,6 +787,7 @@ int mana_ib_create_eqs(struct mana_ib_dev *mdev) { struct gdma_context *gc =3D mdev_to_gc(mdev); struct gdma_queue_spec spec =3D {}; + struct gdma_irq_context *gic; int err, i; =20 spec.type =3D GDMA_EQ; @@ -797,9 +798,15 @@ int mana_ib_create_eqs(struct mana_ib_dev *mdev) spec.eq.log2_throttle_limit =3D LOG2_EQ_THROTTLE; spec.eq.msix_index =3D 0; =20 + gic =3D mana_gd_get_gic(gc, false, &spec.eq.msix_index); + if (!gic) + return -ENOMEM; + err =3D mana_gd_create_mana_eq(mdev->gdma_dev, &spec, &mdev->fatal_err_eq= ); - if (err) + if (err) { + mana_gd_put_gic(gc, false, 0); return err; + } =20 mdev->eqs =3D kzalloc_objs(struct gdma_queue *, mdev->ib_dev.num_comp_vectors); @@ -810,31 +817,47 @@ int mana_ib_create_eqs(struct mana_ib_dev *mdev) spec.eq.callback =3D NULL; for (i =3D 0; i < mdev->ib_dev.num_comp_vectors; i++) { spec.eq.msix_index =3D (i + 1) % gc->num_msix_usable; + + gic =3D mana_gd_get_gic(gc, false, &spec.eq.msix_index); + if (!gic) { + err =3D -ENOMEM; + goto destroy_eqs; + } + err =3D mana_gd_create_mana_eq(mdev->gdma_dev, &spec, &mdev->eqs[i]); - if (err) + if (err) { + mana_gd_put_gic(gc, false, spec.eq.msix_index); goto destroy_eqs; + } } =20 return 0; =20 destroy_eqs: - while (i-- > 0) + while (i-- > 0) { mana_gd_destroy_queue(gc, mdev->eqs[i]); + mana_gd_put_gic(gc, false, (i + 1) % gc->num_msix_usable); + } kfree(mdev->eqs); destroy_fatal_eq: mana_gd_destroy_queue(gc, mdev->fatal_err_eq); + mana_gd_put_gic(gc, false, 0); return err; } =20 void mana_ib_destroy_eqs(struct mana_ib_dev *mdev) { struct gdma_context *gc =3D mdev_to_gc(mdev); - int i; + int i, msi; =20 mana_gd_destroy_queue(gc, mdev->fatal_err_eq); + mana_gd_put_gic(gc, false, 0); =20 - for (i =3D 0; i < mdev->ib_dev.num_comp_vectors; i++) + for (i =3D 0; i < mdev->ib_dev.num_comp_vectors; i++) { mana_gd_destroy_queue(gc, mdev->eqs[i]); + msi =3D (i + 1) % gc->num_msix_usable; + mana_gd_put_gic(gc, false, msi); + } =20 kfree(mdev->eqs); } diff --git a/include/net/mana/gdma.h b/include/net/mana/gdma.h index 84f85b2299b4..9faa072e779e 100644 --- a/include/net/mana/gdma.h +++ b/include/net/mana/gdma.h @@ -615,6 +615,7 @@ enum { #define GDMA_DRV_CAP_FLAG_1_HWC_TIMEOUT_RECONFIG BIT(3) #define GDMA_DRV_CAP_FLAG_1_GDMA_PAGES_4MB_1GB_2GB BIT(4) #define GDMA_DRV_CAP_FLAG_1_VARIABLE_INDIRECTION_TABLE_SUPPORT BIT(5) +#define GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE BIT(6) =20 /* Driver can handle holes (zeros) in the device list */ #define GDMA_DRV_CAP_FLAG_1_DEV_LIST_HOLES_SUP BIT(11) @@ -631,7 +632,8 @@ enum { /* Driver detects stalled send queues and recovers them */ #define GDMA_DRV_CAP_FLAG_1_HANDLE_STALL_SQ_RECOVERY BIT(18) =20 -#define GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE BIT(6) +/* Driver supports separate EQ/MSIs for each vPort */ +#define GDMA_DRV_CAP_FLAG_1_EQ_MSI_UNSHARE_MULTI_VPORT BIT(19) =20 /* Driver supports linearizing the skb when num_sge exceeds hardware limit= */ #define GDMA_DRV_CAP_FLAG_1_SKB_LINEARIZE BIT(20) @@ -659,7 +661,8 @@ enum { GDMA_DRV_CAP_FLAG_1_SKB_LINEARIZE | \ GDMA_DRV_CAP_FLAG_1_PROBE_RECOVERY | \ GDMA_DRV_CAP_FLAG_1_HANDLE_STALL_SQ_RECOVERY | \ - GDMA_DRV_CAP_FLAG_1_HWC_TIMEOUT_RECOVERY) + GDMA_DRV_CAP_FLAG_1_HWC_TIMEOUT_RECOVERY | \ + GDMA_DRV_CAP_FLAG_1_EQ_MSI_UNSHARE_MULTI_VPORT) =20 #define GDMA_DRV_CAP_FLAGS2 0 =20 --=20 2.43.0