From nobody Fri Apr 17 01:39:55 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021102.outbound.protection.outlook.com [52.101.125.102]) (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 9E80E3A1E93; Tue, 24 Feb 2026 15:28:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.102 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771946899; cv=fail; b=Lwz3lGxyi9l0/k2eh4RIcYQDlsgNWaCbOzH1b+hUkoCFIo/kWz+JKdiKC+cs4Y4CqCB9caMz5jcj3xGOyGXty7dh4Dy9CZW3jaftbAwX35FipUXuR26u4sbs0cVSIefAGfp8Zky4+3d+CZFvDNm6d3KHrINM6icdxcUXH4f2FFo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771946899; c=relaxed/simple; bh=pOD9tShg21azxOFa4mnNxH8bqyQcXlREEGf1NpsqGJM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=fhEZsGbDMvOCP4jrYRwzGxaEOX/wU+J7bdFcs2KXO/lLxKejYbcsTtvX0FUw+1GbXlK+9LA1FoGnmKw9WmhonJ2abTlPiyTFTLuh4++rR52ChduuGZHf6qu8WJ747fJcq9vTQeYvNW+jBZP3wAFW7NiHdwmB2iz/C5b5xE5G4YE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=g6cehP4u; arc=fail smtp.client-ip=52.101.125.102 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="g6cehP4u" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vANWZgrsjY8Q7ZTT/RNfO2fhW+ZTk70Gqf4jAiXrJfFNaMgZiG0y8rsWxiDnY7nwEjg52EHpo2oJgoOlFzuQrIG5vDIj3jBTaLqHxdbROE5i2bk0gSkuYw4o3oAVPWkxh6SenZvMZdFfLUouTZxWPubfXKg1TNGxhd2NCFfXIJChj3fsqtKHTAcYfLOI5OlGrhmP3QcFPv2slCg6JXly/IcTC5oPiaCiS8Q7D2WUEsu7R/YHbre9zSzamJMfgBHSPCMwdBChhs1v0wI0kI4n33kk9xERaeKIOFQT47WnaLLy5EpstLJYr5pr3XI1IaYgWjkyvBcHNFrQjOerTFWPGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wpsBZzczUl1C4mAv165HazfO3lsD54jFeoa4ExF/rGc=; b=gpa2cJ2PcfDG8UxLTrgY/xvx4atLVvNpQZi1vasRa/eCxkfDJl1xZDo6pDCxFktiJMAg6SltfIh3FhiT/8Uf9FTHzhySeGGj7rfVU5zQPeSzYIvV26vkAu8V0vZjUa8MfJmmBy5RSGZwGPAe4ea+/yvM0MM35r47uB+zopo9YlwWO/rLNolhGFgLKNLXRjmVtqbZ0GLAYlxIoY7dXkhM9UHGnDZQMKPQB2hsjgRhmfQ0hSFDEGDMQdMLLxlXgurnWAPA7a49B3iePfZsMI4mo8FpDpxo8medSoDHMIRMd5qJPlq2VlK2DXqBHGQGtik+OwkNs5LioTMIfCPGRtwd5Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wpsBZzczUl1C4mAv165HazfO3lsD54jFeoa4ExF/rGc=; b=g6cehP4usIvYNJFUTeGEK81h0isNKtBuqUbI/H34rdS9ha9t52QPFb+1TwrTFqrYEa+0QP2JcsF85JIDe19HNrU7JB7Mp5SUEcCN8luXho68Nds3/ARMd8lA7vd6zL8U193yKnPweVDaiY/lGBD9V4krpFmcRk+13301F2fYMv8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS9P286MB6904.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:418::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Tue, 24 Feb 2026 15:28:12 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9632.017; Tue, 24 Feb 2026 15:28:12 +0000 From: Koichiro Den To: Jon Mason , Dave Jiang , Allen Hubbe , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/3] net: ntb_netdev: Introduce per-queue context Date: Wed, 25 Feb 2026 00:28:07 +0900 Message-ID: <20260224152809.1799199-2-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260224152809.1799199-1-den@valinux.co.jp> References: <20260224152809.1799199-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP301CA0019.JPNP301.PROD.OUTLOOK.COM (2603:1096:400:381::6) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY7P286MB7722:EE_|OS9P286MB6904:EE_ X-MS-Office365-Filtering-Correlation-Id: 323a1628-c9fd-4d0b-546f-08de73b9522d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|10070799003|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?itP0n2ijXE66453bjyodPiJaE78og79+Sr6ooNJv0Mh/6Yh8ITSp7P3XXYph?= =?us-ascii?Q?M0BE6ExVzj+aFfoJ3hGqupP+IiHjCmtiCSRdZxuebK1ph/hKW7/naRU8fvTB?= =?us-ascii?Q?Oblhnmc5+7/f0LGYYmJw75krs/YwoQ91BRpLO84d88ituxlrlp8LdnUavFEE?= =?us-ascii?Q?zfCrq6PJ8hMDpU0OuXLtkZV1+uilnsDuRob2V1oDVuUmprJIXgpXce5NgzHC?= =?us-ascii?Q?zmX1or8qK3Ag7bviQF+SvD+HGZWDTq5u2dZRp6MBBo38JQKEslC2xALFG/zV?= =?us-ascii?Q?wWOH934j08qeS6r8Uar8inmcWJjyVS7Pav1DJPvFxCWttt7oosh7XJ1uw6EE?= =?us-ascii?Q?lTyvhaybj61TYR6jOv0CAWOzL5eKWrW7215LO+pz+h/Hik2HTsrDzY+XWGF1?= =?us-ascii?Q?KsBQ6fFRFY5sTRDidDqi2k6HWuM22IYc/uPB5MhAXpymY7ft6rw+bdoja12H?= =?us-ascii?Q?GXFDyyUFFnH2nlXSx11gSZn6oc2hYubSiYijlw4Ncxa2v/CKjvCK4a0JkEvt?= =?us-ascii?Q?3xL2tbPmF02TYdgH2gy0uTZDI7wOP2VCYZPwXAUihYZ3ZGxYxWF08pc5E8QK?= =?us-ascii?Q?osVge605NIhHk5RIsyxAwTwfIH9vT3AVfxpesUcXmdhNKjal+nAZPBUtHEI2?= =?us-ascii?Q?5SzcPg/KRMesj7ZrkOlbzNGwr0Q606o5JvYgRXaq+bCJlOjMabSwG/aYn3ng?= =?us-ascii?Q?nGouRXmkfSS/T9NBOh3dVd9Ab73auGrPJ7/xbD44FfekY9IkAVV0kcWBC2aE?= =?us-ascii?Q?WvX0IaPPLkhBpZmQagiEcnP5SIpRZkUkugdhVlgYQJfGk+5Tq00Nd9B7grlq?= =?us-ascii?Q?E4Gp36Fa54hF70o4i/DmmgzlomsuOH1TSotgOEWlih4FduOO0dsdLzIjA38V?= =?us-ascii?Q?m5knwGFZzKWiFp/Pr1jCoecrGSMHEPRe/CVSO63EfmJCb89PgekPFp5xwNEf?= =?us-ascii?Q?AvZ7cOLq8jp3420bFH0hAGV0G1dz5aDw+fcRb30DfsA9cL2RA5BA2qKf864V?= =?us-ascii?Q?eRhRF2MCHEylcNIqfmuxFMRtkCzfOCSA1RPGssh4QpCsGwZ1e1dpZAXxUld+?= =?us-ascii?Q?s9E5sLuNMXCTXuhwxCrdYGodovm9wwN1pPL9wOZ1VmwZCYpj3XGgNWm65Qwe?= =?us-ascii?Q?9A36PBu0QbvzZKZD7JDiQf+g6ngyGmPsAgWzrRAuMihKiBPa2uQvf0aYBwlB?= =?us-ascii?Q?/I0IuH9FQvBi4HRCT2OJtLAQzaKWQJIliuxx7Cev5ayLP/QfMW2d7kFsj1J+?= =?us-ascii?Q?i1SFufi5sAKWdWXwjF9Bb1PV8+aV/hHoSxYnOhwkNIvN57ZMXGiHhLIjwRhY?= =?us-ascii?Q?FIUF3X4NrDsVelURFac3876STluAr8C1Ty2ZP/a3jbCZgeihP7H5h+vjaqbl?= =?us-ascii?Q?YYbifywoaPvBAQGFBjFtJ7hO6cS9JqH+53KYBlDZJdQv3jtpYHS3+AjN6Cs5?= =?us-ascii?Q?ZUlizWW9Y2jRJsioG5oQW0wASDnZc5X8LocFeSovT2Wl+C9r/gJICqNurvqN?= =?us-ascii?Q?FbyKQVkjkI3/HTowfqgm4XxHt7sTdCsYn0eAjEYCrtEPMhB4u35OwPCpoFre?= =?us-ascii?Q?oooG7ZoeBHa3RhVEEr0=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(10070799003)(1800799024);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?7y0K7G16XN3/xcCqI9fdKSxsIStGvsNrEfQd6fsJyLDD6bx6Eu9rEkEWoLGn?= =?us-ascii?Q?34YSNaAm4eTxC20ncK8gjR/byw/02/wC59fZj5iIKKos9XbeYiCDoqQOQiCF?= =?us-ascii?Q?8vyirPmYaMNnVOQRPrGX15Z5vtv1U9smcJiH/SE8AUofCYV6tndK8cFuGTXH?= =?us-ascii?Q?4X5ABeJOvKL1tTaBMZdRTrvGp3NeXMFfVuuEIOZsLI0X1scJgpxR3H+N+oyZ?= =?us-ascii?Q?QjMMB/Y4eRM0C6H+9stiwzCOIjHsJARYYaOMRgLaqOYGZOV0qheM1LFzkiqn?= =?us-ascii?Q?WCG2I/2UwfcBJ6cuQkOd6JelYdKkvfvWD1Xg5ArH4IU7ql2W8PT+1c4Sopyo?= =?us-ascii?Q?TjG5x3R5yxOOWyWol+ouSxWSe/5NDmNieDe8Qr4zu0zHWy50daxHRp3Q4ibH?= =?us-ascii?Q?FN0K1qi5B8q7uTRtIOh8UOEn84nQ4r43ch1SI7Vjctiqt6X2a3R3fmOi/EQE?= =?us-ascii?Q?wZFJfPtUm7qoODKLV+Vu6a1e7ZhBQmjKhvJuixJdRB/ZaHJ0Ai28Rft4AXBu?= =?us-ascii?Q?HU2yrBd++4fiaWYTdREsIViJvUt+5ziGwQ0t++kapvwO41bvsjPlNI66Try4?= =?us-ascii?Q?1ma9UEfho3SKZTzg/MQtsx1bpoGMsTOPry3szXt8bCmtd/TBwGVW9GFctnBw?= =?us-ascii?Q?qh/tmRRCULh27CTOUeEDpijKGgq2//+r6kMvYKR1iZpD2BchgyHGgkurJx5l?= =?us-ascii?Q?3ifxa6IdE4aQKdi2jb0mEwL7bLTZxwqsrktYpxxgaza5HTYeuxBET0oQy/gc?= =?us-ascii?Q?lxvE5OhDIz3rCLKFnjM7+A6JFYLxI0xWL4oUqLG9ia5cNSr70Ws/sSMoQo6W?= =?us-ascii?Q?VzZwTjmgdwWhzgCHIMeQ1K9jGRAGOS139Kg/gWhjbtCIyt1DpCrAbMnlo4nL?= =?us-ascii?Q?+znMKK7dAVd5uD3zs878bdtWletbFfwHK0KWUAB4N8iWRCk4w2epLGIX7oxN?= =?us-ascii?Q?yPHZYWeomQsHYg9JqogNarosjsZR9p1f5SymRA4M6t4YiTSkzVzonvxwYodX?= =?us-ascii?Q?UfX4BmgWB+myhpKpjTQgWf+Xgl+AaiFSMizZkB+HjSjlr8+rOUmE6kYoM5dZ?= =?us-ascii?Q?E5Jr52JisvtjV+g7soSDmAC3qmt+pcGOz5oPQWc3qzYONfSt3XRrOKcK+0AC?= =?us-ascii?Q?qEM/QSQ+3qcpsmfg7yPsOL5WUzl2pBj4PQgnprttsKECnxQeq8cKA36E/NEh?= =?us-ascii?Q?jwJZIDBYhXfLuziJpostro87uaFjFrx8CCgvCWtl7ro+W5lqeFL0hJYM3JiH?= =?us-ascii?Q?Fh5aY36N6rlM/watZK3Xr+wY2RTm5DCMo08xB/VbvpPAPYgtWc6dHdf/1qFC?= =?us-ascii?Q?7UYmjuHfX96RzWYd2oSEOXmJlrhdPeyjPJUangcP4h76i7GkhjskxESSa08l?= =?us-ascii?Q?k/YrUR29jGZFufbARLPbnI0ej2f/E49s7hxSE9TT7/laxOhm3OJ5UN32dCar?= =?us-ascii?Q?UfNJpYRoU/lFR95vFXoHt9BY4+Bdousqp5lSOlU8QCL++Bg+XLEWs7bwIQHp?= =?us-ascii?Q?ZFvc+tdB2hlRPf6Ewuh496URRZNTY3lJvczU1uzNh4r+zmt1iNWvi1UgdlH8?= =?us-ascii?Q?FAU81mUm4dCgHy8vjGbeYQjTXu7JaQ6vNpps/ru4JBDV9zOsZVq6CbwSNdsS?= =?us-ascii?Q?Y8Qx8sCGM1DNLCkwn0OekqOIayMtV7Do+bEVS2K7mwYmyDHG7FYEcU+jEr26?= =?us-ascii?Q?dPxzaQ/qvpZPe8gsETFYSh4iGaW0tRTYf6VfSMXvGLat/JjelySj8OGC8058?= =?us-ascii?Q?6SFk7EHZngEWaajFxdl3JJD2CrRFEoRfalxkfqSkbt4+dnexY0Rx?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 323a1628-c9fd-4d0b-546f-08de73b9522d X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2026 15:28:11.8500 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: dMV71MuugkXmBAUKqKrYsHPdoi2tuOW81FVhzVja+rB8B4w7ZcNmfzWj0URPc/5wnjXha6K1KMtt8OVDXCQNrQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS9P286MB6904 Content-Type: text/plain; charset="utf-8" Prepare ntb_netdev for multi-queue operation by moving queue-pair state out of struct ntb_netdev. Introduce struct ntb_netdev_queue to carry the ntb_transport_qp pointer, the per-QP TX timer and queue id. Pass this object as the callback context and convert the RX/TX handlers and link event path accordingly. The probe path allocates an array of per-queue objects and creates queue pairs in a loop, recording the number successfully created in dev->num_queues. The netdev is configured to match that count and the driver uses the netdev subqueue helpers for flow control. With the current default of ntb_num_queues=3D1, behavior is unchanged. Signed-off-by: Koichiro Den Reviewed-by: Dave Jiang --- drivers/net/ntb_netdev.c | 298 ++++++++++++++++++++++++++------------- 1 file changed, 200 insertions(+), 98 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index fbeae05817e9..d8734dfc2eee 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -53,6 +53,7 @@ #include #include #include +#include =20 #define NTB_NETDEV_VER "0.7" =20 @@ -70,11 +71,22 @@ static unsigned int tx_start =3D 10; /* Number of descriptors still available before stop upper layer tx */ static unsigned int tx_stop =3D 5; =20 -struct ntb_netdev { - struct pci_dev *pdev; - struct net_device *ndev; +static unsigned int ntb_num_queues =3D 1; + +struct ntb_netdev; + +struct ntb_netdev_queue { + struct ntb_netdev *ntdev; struct ntb_transport_qp *qp; struct timer_list tx_timer; + u16 qid; +}; + +struct ntb_netdev { + struct pci_dev *pdev; + struct net_device *ndev; + unsigned int num_queues; + struct ntb_netdev_queue *queues; }; =20 #define NTB_TX_TIMEOUT_MS 1000 @@ -82,14 +94,24 @@ struct ntb_netdev { =20 static void ntb_netdev_event_handler(void *data, int link_is_up) { - struct net_device *ndev =3D data; - struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *q =3D data; + struct ntb_netdev *dev =3D q->ntdev; + struct net_device *ndev =3D dev->ndev; + bool any_up =3D false; + unsigned int i; =20 - netdev_dbg(ndev, "Event %x, Link %x\n", link_is_up, - ntb_transport_link_query(dev->qp)); + netdev_dbg(ndev, "Event %x, Link %x, qp %u\n", link_is_up, + ntb_transport_link_query(q->qp), q->qid); =20 if (link_is_up) { - if (ntb_transport_link_query(dev->qp)) + for (i =3D 0; i < dev->num_queues; i++) { + if (ntb_transport_link_query(dev->queues[i].qp)) { + any_up =3D true; + break; + } + } + + if (any_up) netif_carrier_on(ndev); } else { netif_carrier_off(ndev); @@ -99,7 +121,9 @@ static void ntb_netdev_event_handler(void *data, int lin= k_is_up) static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, void *data, int len) { - struct net_device *ndev =3D qp_data; + struct ntb_netdev_queue *q =3D qp_data; + struct ntb_netdev *dev =3D q->ntdev; + struct net_device *ndev =3D dev->ndev; struct sk_buff *skb; int rc; =20 @@ -118,6 +142,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport_= qp *qp, void *qp_data, skb_put(skb, len); skb->protocol =3D eth_type_trans(skb, ndev); skb->ip_summed =3D CHECKSUM_NONE; + skb_record_rx_queue(skb, q->qid); =20 if (netif_rx(skb) =3D=3D NET_RX_DROP) { ndev->stats.rx_errors++; @@ -135,7 +160,8 @@ static void ntb_netdev_rx_handler(struct ntb_transport_= qp *qp, void *qp_data, } =20 enqueue_again: - rc =3D ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); + rc =3D ntb_transport_rx_enqueue(q->qp, skb, skb->data, + ndev->mtu + ETH_HLEN); if (rc) { dev_kfree_skb_any(skb); ndev->stats.rx_errors++; @@ -143,42 +169,37 @@ static void ntb_netdev_rx_handler(struct ntb_transpor= t_qp *qp, void *qp_data, } } =20 -static int __ntb_netdev_maybe_stop_tx(struct net_device *netdev, - struct ntb_transport_qp *qp, int size) +static int ntb_netdev_maybe_stop_tx(struct ntb_netdev_queue *q, int size) { - struct ntb_netdev *dev =3D netdev_priv(netdev); + struct net_device *ndev =3D q->ntdev->ndev; + + if (ntb_transport_tx_free_entry(q->qp) >=3D size) + return 0; + + netif_stop_subqueue(ndev, q->qid); =20 - netif_stop_queue(netdev); /* Make sure to see the latest value of ntb_transport_tx_free_entry() * since the queue was last started. */ smp_mb(); =20 - if (likely(ntb_transport_tx_free_entry(qp) < size)) { - mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time)); + if (likely(ntb_transport_tx_free_entry(q->qp) < size)) { + mod_timer(&q->tx_timer, jiffies + usecs_to_jiffies(tx_time)); return -EBUSY; } =20 - netif_start_queue(netdev); + netif_wake_subqueue(ndev, q->qid); + return 0; } =20 -static int ntb_netdev_maybe_stop_tx(struct net_device *ndev, - struct ntb_transport_qp *qp, int size) -{ - if (netif_queue_stopped(ndev) || - (ntb_transport_tx_free_entry(qp) >=3D size)) - return 0; - - return __ntb_netdev_maybe_stop_tx(ndev, qp, size); -} - static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, void *data, int len) { - struct net_device *ndev =3D qp_data; + struct ntb_netdev_queue *q =3D qp_data; + struct ntb_netdev *dev =3D q->ntdev; + struct net_device *ndev =3D dev->ndev; struct sk_buff *skb; - struct ntb_netdev *dev =3D netdev_priv(ndev); =20 skb =3D data; if (!skb || !ndev) @@ -194,13 +215,12 @@ static void ntb_netdev_tx_handler(struct ntb_transpor= t_qp *qp, void *qp_data, =20 dev_kfree_skb_any(skb); =20 - if (ntb_transport_tx_free_entry(dev->qp) >=3D tx_start) { + if (ntb_transport_tx_free_entry(qp) >=3D tx_start) { /* Make sure anybody stopping the queue after this sees the new * value of ntb_transport_tx_free_entry() */ smp_mb(); - if (netif_queue_stopped(ndev)) - netif_wake_queue(ndev); + netif_wake_subqueue(ndev, q->qid); } } =20 @@ -208,16 +228,26 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_bu= ff *skb, struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); + u16 qid =3D skb_get_queue_mapping(skb); + struct ntb_netdev_queue *q; int rc; =20 - ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop); + if (unlikely(!dev->num_queues)) + goto err; =20 - rc =3D ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len); + if (unlikely(qid >=3D dev->num_queues)) + qid =3D 0; + + q =3D &dev->queues[qid]; + + ntb_netdev_maybe_stop_tx(q, tx_stop); + + rc =3D ntb_transport_tx_enqueue(q->qp, skb, skb->data, skb->len); if (rc) goto err; =20 /* check for next submit */ - ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop); + ntb_netdev_maybe_stop_tx(q, tx_stop); =20 return NETDEV_TX_OK; =20 @@ -229,80 +259,103 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_b= uff *skb, =20 static void ntb_netdev_tx_timer(struct timer_list *t) { - struct ntb_netdev *dev =3D timer_container_of(dev, t, tx_timer); + struct ntb_netdev_queue *q =3D timer_container_of(q, t, tx_timer); + struct ntb_netdev *dev =3D q->ntdev; struct net_device *ndev =3D dev->ndev; =20 - if (ntb_transport_tx_free_entry(dev->qp) < tx_stop) { - mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time)); + if (ntb_transport_tx_free_entry(q->qp) < tx_stop) { + mod_timer(&q->tx_timer, jiffies + usecs_to_jiffies(tx_time)); } else { - /* Make sure anybody stopping the queue after this sees the new + /* + * Make sure anybody stopping the queue after this sees the new * value of ntb_transport_tx_free_entry() */ smp_mb(); - if (netif_queue_stopped(ndev)) - netif_wake_queue(ndev); + netif_wake_subqueue(ndev, q->qid); } } =20 static int ntb_netdev_open(struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *queue; struct sk_buff *skb; - int rc, i, len; + int rc =3D 0, i, len; + unsigned int q; =20 - /* Add some empty rx bufs */ - for (i =3D 0; i < NTB_RXQ_SIZE; i++) { - skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); - if (!skb) { - rc =3D -ENOMEM; - goto err; - } + /* Add some empty rx bufs for each queue */ + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; + + for (i =3D 0; i < NTB_RXQ_SIZE; i++) { + skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); + if (!skb) { + rc =3D -ENOMEM; + goto err; + } =20 - rc =3D ntb_transport_rx_enqueue(dev->qp, skb, skb->data, - ndev->mtu + ETH_HLEN); - if (rc) { - dev_kfree_skb(skb); - goto err; + rc =3D ntb_transport_rx_enqueue(queue->qp, skb, skb->data, + ndev->mtu + ETH_HLEN); + if (rc) { + dev_kfree_skb(skb); + goto err; + } } + + timer_setup(&queue->tx_timer, ntb_netdev_tx_timer, 0); } =20 - timer_setup(&dev->tx_timer, ntb_netdev_tx_timer, 0); - netif_carrier_off(ndev); - ntb_transport_link_up(dev->qp); - netif_start_queue(ndev); + + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_link_up(dev->queues[q].qp); + + netif_tx_start_all_queues(ndev); =20 return 0; =20 err: - while ((skb =3D ntb_transport_rx_remove(dev->qp, &len))) - dev_kfree_skb(skb); + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; + + while ((skb =3D ntb_transport_rx_remove(queue->qp, &len))) + dev_kfree_skb(skb); + } return rc; } =20 static int ntb_netdev_close(struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *queue; struct sk_buff *skb; + unsigned int q; int len; =20 - ntb_transport_link_down(dev->qp); + netif_tx_stop_all_queues(ndev); =20 - while ((skb =3D ntb_transport_rx_remove(dev->qp, &len))) - dev_kfree_skb(skb); + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; =20 - timer_delete_sync(&dev->tx_timer); + ntb_transport_link_down(queue->qp); =20 + while ((skb =3D ntb_transport_rx_remove(queue->qp, &len))) + dev_kfree_skb(skb); + + timer_delete_sync(&queue->tx_timer); + } return 0; } =20 static int ntb_netdev_change_mtu(struct net_device *ndev, int new_mtu) { struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *queue; struct sk_buff *skb; - int len, rc; + unsigned int q, i; + int len, rc =3D 0; =20 - if (new_mtu > ntb_transport_max_size(dev->qp) - ETH_HLEN) + if (new_mtu > ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN) return -EINVAL; =20 if (!netif_running(ndev)) { @@ -311,41 +364,54 @@ static int ntb_netdev_change_mtu(struct net_device *n= dev, int new_mtu) } =20 /* Bring down the link and dispose of posted rx entries */ - ntb_transport_link_down(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_link_down(dev->queues[q].qp); =20 if (ndev->mtu < new_mtu) { - int i; + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; =20 - for (i =3D 0; (skb =3D ntb_transport_rx_remove(dev->qp, &len)); i++) - dev_kfree_skb(skb); - - for (; i; i--) { - skb =3D netdev_alloc_skb(ndev, new_mtu + ETH_HLEN); - if (!skb) { - rc =3D -ENOMEM; - goto err; - } - - rc =3D ntb_transport_rx_enqueue(dev->qp, skb, skb->data, - new_mtu + ETH_HLEN); - if (rc) { + for (i =3D 0; + (skb =3D ntb_transport_rx_remove(queue->qp, &len)); + i++) dev_kfree_skb(skb); - goto err; + + for (; i; i--) { + skb =3D netdev_alloc_skb(ndev, + new_mtu + ETH_HLEN); + if (!skb) { + rc =3D -ENOMEM; + goto err; + } + + rc =3D ntb_transport_rx_enqueue(queue->qp, skb, + skb->data, + new_mtu + + ETH_HLEN); + if (rc) { + dev_kfree_skb(skb); + goto err; + } } } } =20 WRITE_ONCE(ndev->mtu, new_mtu); =20 - ntb_transport_link_up(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_link_up(dev->queues[q].qp); =20 return 0; =20 err: - ntb_transport_link_down(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) { + struct ntb_netdev_queue *queue =3D &dev->queues[q]; =20 - while ((skb =3D ntb_transport_rx_remove(dev->qp, &len))) - dev_kfree_skb(skb); + ntb_transport_link_down(queue->qp); + + while ((skb =3D ntb_transport_rx_remove(queue->qp, &len))) + dev_kfree_skb(skb); + } =20 netdev_err(ndev, "Error changing MTU, device inoperable\n"); return rc; @@ -404,6 +470,7 @@ static int ntb_netdev_probe(struct device *client_dev) struct net_device *ndev; struct pci_dev *pdev; struct ntb_netdev *dev; + unsigned int q; int rc; =20 ntb =3D dev_ntb(client_dev->parent); @@ -411,7 +478,7 @@ static int ntb_netdev_probe(struct device *client_dev) if (!pdev) return -ENODEV; =20 - ndev =3D alloc_etherdev(sizeof(*dev)); + ndev =3D alloc_etherdev_mq(sizeof(*dev), ntb_num_queues); if (!ndev) return -ENOMEM; =20 @@ -420,6 +487,15 @@ static int ntb_netdev_probe(struct device *client_dev) dev =3D netdev_priv(ndev); dev->ndev =3D ndev; dev->pdev =3D pdev; + dev->num_queues =3D 0; + + dev->queues =3D kcalloc(ntb_num_queues, sizeof(*dev->queues), + GFP_KERNEL); + if (!dev->queues) { + rc =3D -ENOMEM; + goto err_free_netdev; + } + ndev->features =3D NETIF_F_HIGHDMA; =20 ndev->priv_flags |=3D IFF_LIVE_ADDR_CHANGE; @@ -436,26 +512,47 @@ static int ntb_netdev_probe(struct device *client_dev) ndev->min_mtu =3D 0; ndev->max_mtu =3D ETH_MAX_MTU; =20 - dev->qp =3D ntb_transport_create_queue(ndev, client_dev, - &ntb_netdev_handlers); - if (!dev->qp) { + for (q =3D 0; q < ntb_num_queues; q++) { + struct ntb_netdev_queue *queue =3D &dev->queues[q]; + + queue->ntdev =3D dev; + queue->qid =3D q; + queue->qp =3D ntb_transport_create_queue(queue, client_dev, + &ntb_netdev_handlers); + if (!queue->qp) + break; + + dev->num_queues++; + } + + if (!dev->num_queues) { rc =3D -EIO; - goto err; + goto err_free_queues; } =20 - ndev->mtu =3D ntb_transport_max_size(dev->qp) - ETH_HLEN; + rc =3D netif_set_real_num_queues(ndev, dev->num_queues, dev->num_queues); + if (rc) + goto err_free_qps; + + ndev->mtu =3D ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN; =20 rc =3D register_netdev(ndev); if (rc) - goto err1; + goto err_free_qps; =20 dev_set_drvdata(client_dev, ndev); - dev_info(&pdev->dev, "%s created\n", ndev->name); + dev_info(&pdev->dev, "%s created with %u queue pairs\n", + ndev->name, dev->num_queues); return 0; =20 -err1: - ntb_transport_free_queue(dev->qp); -err: +err_free_qps: + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_free_queue(dev->queues[q].qp); + +err_free_queues: + kfree(dev->queues); + +err_free_netdev: free_netdev(ndev); return rc; } @@ -464,9 +561,14 @@ static void ntb_netdev_remove(struct device *client_de= v) { struct net_device *ndev =3D dev_get_drvdata(client_dev); struct ntb_netdev *dev =3D netdev_priv(ndev); + unsigned int q; + =20 unregister_netdev(ndev); - ntb_transport_free_queue(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_free_queue(dev->queues[q].qp); + + kfree(dev->queues); free_netdev(ndev); } =20 --=20 2.51.0 From nobody Fri Apr 17 01:39:55 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021102.outbound.protection.outlook.com [52.101.125.102]) (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 6A42D3A1E81; Tue, 24 Feb 2026 15:28:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.102 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771946900; cv=fail; b=AgsgfldLIdzAwVrXnCStImRxN67Rq8QZzsmFN1y0kJPkp/wQ/QXUuJa+PW6+aQ92inLuC4gFFs2sblP6yc6JTjI1P67e+n7v0cy400oXOaUa/n1wg9/dnhoohBbu+SvB+4kA2SobNbakAB2EB0GZjVfZSqudddmspXkqfp8O4Cw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771946900; c=relaxed/simple; bh=Y6q2cKIxrlJP2Q+2gEAWccuDV8Qj+0kQ3LlwHDOW/EM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Fka5B45YsNXsMkUQul4ek+pcU4yATJiUA+ZDc3Hvl3FaJ5/vxkQOslYtKbiAlrm7cSOMzjDY0ilC1BlSaPHqqvsV5ToDTwyhweL+P/2B+pmxV9mjWfoJ4Ng5D8U9G5C02pB6oq/TPOFupILh3pufe2/IbX3hAyfoQMrebOZHvMw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=oUXVBP+X; arc=fail smtp.client-ip=52.101.125.102 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="oUXVBP+X" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gAFdMn/pK02/FR5pyaSHPFzX2aROSYZIdPnWzK3h5FGJXUFYhuYVCG7E9ku1nAwmwAuw0yHUywfPRx6xKn78N/HnsAEkKvczth9I4WRcjhOAR5ptAcGE04r93mmmpiJ4yuv6a5vAnfy0ATiBzHd6qKiBtfhrgM0vNeehNhD9MCc+UDYF0QBHfzcRc3q0gC+SWZlmGre77LQj08CrTU7oZc+w4a+d3dbaMoMp6SaUYYLLbUvLvYf6T0v0VVX7mHiXV4k0BGZGs7vyWqst5hPZuP/YtjWMT0DBcKiKmCpsDk29HU1Za166MxwjUN2FBDTBcsyc07dGCDQ+IO99X0V9JA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=oblD4ebdjPE66qy2PiMJWLNOTP09pxZR/qWy18JkVbE=; b=Ocx3bQLZIjDQoj4NepsGUIyxHmR3woCL/pfptfd3yb3tVKzVaALBhr7uU94uz3+Dwo0jzU2scswdU9mj8ifvXQa6vev0KEvVgkKCaD3EcOY5NCUTXyG3fuv/2MngTbMaPQzPhZhGzUzixWerMkR7UABhpM1xcQ+5cHT/Nav+g7GZWfDApmk26u5u/BeISbC9uSuSwOMgtyZpvk6Xaeu42DGFTPsH5CmRC0Y9lcPs96Zq8/EzTCt6O7DAfW148zD2FhtSOzjIh/wAHB2cS3zzHMNfzWVPdYaEl4xP5ftBwoOI6+NePGk4lZuw95xDyEvmSok+/GQOmVo8uJ1NoyZ2hQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oblD4ebdjPE66qy2PiMJWLNOTP09pxZR/qWy18JkVbE=; b=oUXVBP+XBWhqrTGxtFmgmZtDrJVQ++wPKuxsVKJ9bsokgTuZaswB0p3MUz0+Eat2a3/S944zkBnZpOwBwz2BVMvaJEfH+9lW/Zl/EfgayeTCYmQQrbrjY4UZ78U5odKiZ01R/4U0wgPpvRri1reE9/OeeC6RAdNbWs9qmYJMdIE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS9P286MB6904.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:418::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Tue, 24 Feb 2026 15:28:13 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9632.017; Tue, 24 Feb 2026 15:28:13 +0000 From: Koichiro Den To: Jon Mason , Dave Jiang , Allen Hubbe , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/3] net: ntb_netdev: Make queue pair count configurable Date: Wed, 25 Feb 2026 00:28:08 +0900 Message-ID: <20260224152809.1799199-3-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260224152809.1799199-1-den@valinux.co.jp> References: <20260224152809.1799199-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0195.jpnprd01.prod.outlook.com (2603:1096:400:2b0::17) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY7P286MB7722:EE_|OS9P286MB6904:EE_ X-MS-Office365-Filtering-Correlation-Id: ead3721c-e04f-4099-52fb-08de73b952d0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|10070799003|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?pb9PoQvnqm0yIs/3KvCMr0QslKUKpu5zd1Zkzi5Artb36rkhg1GXgUoa4wTl?= =?us-ascii?Q?oxnsaPvS8VourZ+RzwNt2Y+5dCZENBU8GeArXSUuiQLk7pQ4G7Lt0OiuKHcX?= =?us-ascii?Q?4tgDAMoVbCvwpa8DNdRhmRsahmHuOnh/LkDdRI8bsKmE52FUTc1Feg/osVAX?= =?us-ascii?Q?QvqQsRi8y6RPdWjgJeU4OAmR2QulmlrS8HaQmlXDp0KGCMbYSB+MoNp0O58x?= =?us-ascii?Q?NLQVmBv9kBfN9Q/AcqPT8Nq4ZrDgPVKGqvm3a23SbAGFazPinOxUerl8Y/PL?= =?us-ascii?Q?oGXDUU7q6byPd9ivOAVuhxSaXA1XuSQDCfK6zHfUWqDRu0aQ2cNoCnr7jG4h?= =?us-ascii?Q?JGrnCDvYCgFyOzOyoEqJCGvknuvIbYIeq3AARaKQTB6WoLOyamjDYQn1x3Kt?= =?us-ascii?Q?VfWjT1O458/41I9ZlUTScU5a3zmDXuziGjeXKLPskKOlU+rOkaBqVwvXc5Up?= =?us-ascii?Q?s8DC5aml0FiQzCXGUDv2IYtSJVH/kRKuNdAeKYt0Ix6Rb+fyuM/LXFID7iKz?= =?us-ascii?Q?WIW2ce0cChL7woaYB4jFhoOKAqgVdnb/Hyjhy27SyCtk7kl4vl5yBgXUTk1A?= =?us-ascii?Q?5nS3Pe3kzvRpSffPaJzqdoydFWYr2YT+4azD6LPJM4cdqq2AsaLMbEM9SqYf?= =?us-ascii?Q?J7PMc5Lg7t+CqFT3W4OMEj40nXwwk7ShLzGONV2Fkx46KolOxMh7Qjij0Cts?= =?us-ascii?Q?/7q2Tz/DEtC1/S+Q96WlSZ6zWQr+ZwbprEZb9Cuvnv5XCZqDNPk2X+3BxRW4?= =?us-ascii?Q?RcKGfJmlDWgk7WTGQa4hcUisFxTxcrKyqbgACH9SJXFEd61kZe9ti0dKTHIA?= =?us-ascii?Q?dt4tAt4xE07RJyML5AN6jsNOPDSW06nDsHi/xPLaYIsQl7JTpw87i8gAFrCy?= =?us-ascii?Q?BF5jQepdrJaYbz6MaIMM1VdCzDthNhIc7Oppe0Iz9a4CMceymDtp0In098E8?= =?us-ascii?Q?x0XBNDj4aTy2FTmZ1LRrnMd1Tqw1ZdBax8EM3zOcLdvaPUGJr5BUrwuStXqV?= =?us-ascii?Q?q/vXgstS65ic24qQ7IDIwAqVQUwN4ot/Wr4VoPHs1wiwoq9RNBwFpyxSdXgo?= =?us-ascii?Q?RTGQayIQGwdjY6mVDHZpHbcKJpxxAo3zbjbQ9qOm8jSe1ZOI+KeCqEvDD0BS?= =?us-ascii?Q?HUhI9jseIHg3SwWAIQzqcHfpPAKJu7vLwsfhGj+u4a7IA+Dn7Pfd4I46jURn?= =?us-ascii?Q?a2GAUcRvT668wLlkcTAwm/qZ+6lti7wlOIQF+pLKhwvOrqF7obSBWVqMXifI?= =?us-ascii?Q?MVCwdjbNfSHVK3le0OaLaa8QGkx2Y3lIAewPvqhh/+hBZzMjMQg2098g2DIG?= =?us-ascii?Q?MYo7nhCsgz/7Vs/2ABSEPHD86rW/uXNFQ1/RsN7FKxGMcwOvAq1G1LWoTxJ9?= =?us-ascii?Q?a+1e/U7mD711lSd4/ujWvSi1iktGAArTnyrwvmqDyzm20p1qxb1UBRSc/07t?= =?us-ascii?Q?eq5tmkneal6o+N2KVqf2v/pm2Il/l1QwV0Y9Ss/smPbgrFTq/Rv0UNGUFzTU?= =?us-ascii?Q?5L2VMTdKytXy7nF0LJXgQwxUXIrpa4aBlFmJ7X26eU3e+oIMKOAJrl8wXzAa?= =?us-ascii?Q?l+l/ovQ00cm6Y8q92ac=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(10070799003)(1800799024);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CwUoDjKEez6TUWvVunyAsT902IqccsmxQxoL0EXEr2Ay11xHN9OxSm7tVcpb?= =?us-ascii?Q?roN11LGzr9bcC5/JxJliCRoyLp6Ru/m8ecaD8quH63oK/zG7kRBz6Ju/MCSy?= =?us-ascii?Q?nsijr8N2dJ1F9X58M0nIyRrMV976yOc66sYMrSCG4BAe2jrcFJsY6ron2g9u?= =?us-ascii?Q?TSI+9XIMCvzoaokp71zWEjB+Igva7ObjnsAYj2krZ/9OFRP/JUmziwXNLbgR?= =?us-ascii?Q?eC48237MqmlBdxWQBYBzb050yTller8PzC3lC9D/JeHWtDZ7/hWO2BQsYoZp?= =?us-ascii?Q?q5rQ0YUy1ST/me51y+891RRgKzjT28UxBXoNHN/DrOAyJydrfJiARA/kguBf?= =?us-ascii?Q?h48M62SPDIZDirhINYkGxkGu5F4SJQQ+AwIii7bvtiSEi65XU4h3ZornxD0U?= =?us-ascii?Q?dTeMzR6wrDtfEVN/ppPFkML53cRIlX7t1k//6IWD9xzH4cvD+A4rAIyunDAa?= =?us-ascii?Q?fDlFz1pfn1vsDoAb5zx6n039P3WCEGVaB9r66iyXBMVSjAizm+4RYpbGClap?= =?us-ascii?Q?KqICoBAJifJd73JxGGk0ieproD8rTDAA2XAC/IVjo3m1Bu09d0790nXyH1sQ?= =?us-ascii?Q?as5moI1SlQgQANudFftIflWRrfb1+zvrEcNUJQ8wz5YOCJBo6OFN9cIpro8B?= =?us-ascii?Q?gbN+J/jQA5IYfIItC5vcAkDl1EtRWtKWWEFKtCjQ4pdWme/kHG4XKBMhxl9Z?= =?us-ascii?Q?tyCAr5Yq79Oz0psZDgxrJf4Ja3s0h+SCV1KGvAr9w3PXFJZ/bVL4DFE6CkDj?= =?us-ascii?Q?3PKfXyL+HqG2muiP7TrZvOhS/MpFrJv2/vVKy+jpBwZBhZAe1LC5Le+D4qOx?= =?us-ascii?Q?GGr0JOFPkptXsxRFfEGyX+g+UjBr6rnlYfAQZ1Mxj/t/Bakf8i9G1JP2OaDh?= =?us-ascii?Q?R9WkNxEGLghp9DWpBQB02AT8AwD2J+R3+wo33+5JMm5U4l1lnuGEXYnoe1Ev?= =?us-ascii?Q?poQWR4CMGC6PLN9AzL3uXE0eASztSYn+rGlRmqhm1BQQnoyLqprraLB62mfe?= =?us-ascii?Q?J0gDHHRESfYsHgl9TU+5h5CuNNoO9wkme3Vjiauo6O4gu4ItKpbbbZQqpyVt?= =?us-ascii?Q?S6fhFuRsLCkgdmGlhSGbW9nz40cSTLyAyJSbp7eSFx6embuyvmDqVL8BOSWY?= =?us-ascii?Q?X3AjGFr82T1CuXC5ehYSSjV5NS8dR9Y5AbBXqj9oBtdX1lNSoyQDsar1axbi?= =?us-ascii?Q?v4V5zOZvqkcn52tYdv+LpXLmgmEQ45nkBjgfINIzvHIPlbZWi/3GrqDMesFA?= =?us-ascii?Q?Rww0YHQEGuYiGOm9ZWP6LZqY6Nx5fyDjG0UtYlLy2M/hv2f02zz67prRVORW?= =?us-ascii?Q?jnqh/jpAEXFuuWJQMS3pIYSI+U8AowShZw8nMg0X3tpWyeHELDEHGwt/7nsQ?= =?us-ascii?Q?ZKOkBB570aGdYL/YHvrmSA732b/a7isZueFxGx8gyqMpDd4IqtSA76bF3Uwv?= =?us-ascii?Q?olAfnLw3FQ3KYqODgloQUwHZiFaZzBSQ+36U6kygS/qSeK0KNJpvnq6+gYTW?= =?us-ascii?Q?VoaH1H4BEvSXNdhNwyjHLyrR9F1QlVWq5MqvhDv0zwnnZ2WiRWGCVB7MzU/5?= =?us-ascii?Q?AYyWRFG4BmeRu+AHw5Y8jc2mJ9Mkf3RbeBTbt2afgAbh9Mq47xW1x8IiBXm8?= =?us-ascii?Q?PlhL+XXhsPIhjaqlP9hQO0rTU2wXQSU8Ih26KVDosHETuBcTjdMGFuttDGeX?= =?us-ascii?Q?9cT/isLO0qmCVTbsrL22XhMZqh1SCqbRxoeg5vR3mS2ew6Ttiv6aLLzDkuF1?= =?us-ascii?Q?oauiR9iNDb9hSlTOZc9n1+yU3YfPrXilxBCaKvstywLFMC+cRFMt?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: ead3721c-e04f-4099-52fb-08de73b952d0 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2026 15:28:12.9215 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ZNa0MCWZ+6Q7vVh9CYJUpSCF6RTM3MXjr5Mhwegdzj0PgLuaafH2/QZl6Lyyh9tE5K5AVSdMiRGa2v225l0UYA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS9P286MB6904 Content-Type: text/plain; charset="utf-8" Expose ntb_num_queues as a module parameter so users can request more than one NTB transport queue pair. The value is clamped to a reasonable range (1..64) to avoid unbounded allocations. The default remains 1. Since we don't support changing the value at runtime yet, permission is intentionally set 0444. Signed-off-by: Koichiro Den Reviewed-by: Dave Jiang --- drivers/net/ntb_netdev.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index d8734dfc2eee..837a2e95f06e 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -71,7 +71,25 @@ static unsigned int tx_start =3D 10; /* Number of descriptors still available before stop upper layer tx */ static unsigned int tx_stop =3D 5; =20 +/* + * This is an arbitrary safety cap to avoid unbounded allocations. + */ +#define NTB_NETDEV_MAX_QUEUES 64 + +static int ntb_num_queues_set(const char *val, const struct kernel_param *= kp) +{ + return param_set_uint_minmax(val, kp, 1, NTB_NETDEV_MAX_QUEUES); +} + +static const struct kernel_param_ops ntb_num_queues_ops =3D { + .set =3D ntb_num_queues_set, + .get =3D param_get_uint, +}; + static unsigned int ntb_num_queues =3D 1; +module_param_cb(ntb_num_queues, &ntb_num_queues_ops, &ntb_num_queues, 0444= ); +MODULE_PARM_DESC(ntb_num_queues, + "Number of NTB netdev queue pairs to use (1 by default)"); =20 struct ntb_netdev; =20 --=20 2.51.0 From nobody Fri Apr 17 01:39:55 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021102.outbound.protection.outlook.com [52.101.125.102]) (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 D49AF3A4F32; Tue, 24 Feb 2026 15:28:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.102 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771946902; cv=fail; b=YubWf2HGxmVsfIK/GaVs7SDB3PKqnqZuci+kFoIs/+qYgzNu4a9q0g0EHHkVms1wWBvI2zId119rk44oB2Y8aEZ/61YNLxqzBxo/xuJjVniBBiEvXeiU1ZL0YW84YWTpwmMK9m5ov42qI7/qZQ4BHw09XTjPrzlpHOZBeA8diD4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771946902; c=relaxed/simple; bh=DbXcRxV/gCfbvtn0x1z8ta1CnZU9iXZZyOLKKEbhUMM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=QN2CzypeFuiqYfXEG7rp66nglY8pJnVuN6DSeXl8wi47CResSC5nR8O3rxJoBqaC06WDQkKLX+Nx1JrjhppeGLpYukTKJAUMiKdZX7N6vGaCtrzeNsay5U4w2AGDoigdS+Swh4ZfCok1Pg1J1oEJphaSyefhw8ydBT6UmtevYSw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=fqiVzUql; arc=fail smtp.client-ip=52.101.125.102 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="fqiVzUql" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eaH4XLa2SFwBeY58n+pkQiB8+UN8A3eU6iIP7//lGwp27LaKSfRRJXJYs3ee4iETS6yKdJ0r6qittAg7DNb4set664hBfUUQMfx5DlCUSmt3SIuu1fTtlt4J7XqWYt2hbprfDMLJAWeP+QCkC4v6mjNMukDOckBMbt7ZdGPlZyQE9lrJnYi6yixC7jIOeVLfvnW7Lc16pSCNhfJngrRPcVpcr1AfwiPaMrT8GMzW4ZU9eKtGDD5fLGANFuLsohXSHDT5Y6qMKfuxV2Fu/y4FkcazZkPUV6WBGedJ9GcbjfYESVL/IvrtReohQHZN2fgor99/VuShuhyzSdxMNriX5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=NnaXYSypsg5d4y8lavMtesONgUOp5AE6K2sqsEYPSxE=; b=Rr9gP9hGZElnvTTvS3CH1p6H3himB5w0csCfXZNK1PM89H9AmYXdRor1uEvxUunEIqdrS+9hblp0B0ZqsknNoTp2l1ikUUJE0vNIYHsx3EtA7/OSormd8WTh6si/XjerVr02rccuAJxvf1Q0Kc4CPBEELYebgia7LuccdeIdC7n3xZxY4wwxN0XWVUrTEpuJtxyv3BAb8Zj2llqbYC0FzJx8iMQlmaNKWBAKUrKHPMgfgBHfAz0XCq25vyDprTZCrgmYts+wfa53zKT87xunHVprZV8FNAZpg+I/ZAYztqxsPRKupkLnTe8n9q129fy/A5/Cx3xtYc5WD43bgxlpyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NnaXYSypsg5d4y8lavMtesONgUOp5AE6K2sqsEYPSxE=; b=fqiVzUqlO5kaPf/wpG/p3y+Qs8aGvZ1DSDVn+h2zInTzV50WdPI8Xt+KCwwA04ygxVKcsPfXSDr0Bth5blvuUbtlE3nVSb1tAG3655tMsf4jaz1sHnoGJGYYi21H8afsrG9Q53uJs2Dm/ulUgEGSAsQCX+ICKlELEbcs7mfxNLI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS9P286MB6904.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:418::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Tue, 24 Feb 2026 15:28:13 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9632.017; Tue, 24 Feb 2026 15:28:13 +0000 From: Koichiro Den To: Jon Mason , Dave Jiang , Allen Hubbe , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/3] net: ntb_netdev: Expose queue pair count via ethtool -l Date: Wed, 25 Feb 2026 00:28:09 +0900 Message-ID: <20260224152809.1799199-4-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260224152809.1799199-1-den@valinux.co.jp> References: <20260224152809.1799199-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0124.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:37e::14) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY7P286MB7722:EE_|OS9P286MB6904:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f7436d4-30c4-4b5b-b168-08de73b95365 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|10070799003|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?8U6pf4YErZPsUrKibPuAYn2glC18RDiiRDY7VNc7ot0W8bg5BYq6KEC6DGcr?= =?us-ascii?Q?27TeVI2JaLM8L9WhzGC+JRMoC6zSpF3Al47e57zl2JodQsonZYa0cTXGdxm5?= =?us-ascii?Q?nByf1XgRjiolxjEohZ5lK6z6I7Xw3EbrgyR6ZhEZk2S7AhKQCjvrO4Ei5VG3?= =?us-ascii?Q?DGUwoPUa1vjzQxI3vmQ25WSmRBYx/1FwF6QYc0ZNCr4gwgLLUIABRJHC1P9y?= =?us-ascii?Q?3d50hjVzNmDGRUZgX4/1vSKheV75IFSh6QlKvlWyyvJiJ8w6E+a8sU161hkc?= =?us-ascii?Q?5DxGJ+AiFm5Zf6vcwZauwNtr8mOfqtiQ7XBbwZP19rL/mK8cjOgQaypgxuZZ?= =?us-ascii?Q?QSqolu4bDxtZjZxjkUYkhI1hnUZ3gTTMeSg7hG8qwFzDaOX05x0+aE2J2Aqp?= =?us-ascii?Q?vD9U2XDh/RnMK6YIyLFmH93xXH2Nmjo2yVor1AIMpE3a7uI9+ieaqGqu/RE7?= =?us-ascii?Q?G9+Wc89y6BwbDjKFVCDN0ddb9fzXGLeqUbejD7JHV2s7QhO8NhwQggv8M3Np?= =?us-ascii?Q?MAJDxQSFl87LXRKOsAiZUcrHFrb2TS2fAWxwQejJr0A8z5JCF3rB7q3kBRFr?= =?us-ascii?Q?B/6Z6+2zcbCqEUFDF5BPqXSNVuOKSjLyYn25J9LE5QdtkUJk3Rbu1hn5adsp?= =?us-ascii?Q?077nfy7ZPrOLYJYQj+TcrExyge4/IaR2x/nzMFPPwlbmYVviOc6JL6sB3DnQ?= =?us-ascii?Q?F+8P38zz0C20yojG0/sgDzDVDyA3fJpN3xw5JaVpvY0jlwl5x/USC8iYIcwV?= =?us-ascii?Q?ahTMOhNX/Xffvxls8ex0xWu/hXDicF920hppVMyApTxC47p37HQkFwCIza7n?= =?us-ascii?Q?+JMurVNwx1uuBAgUlDhO8fS8oKnin8kMzcJyB4x0dYHDUIqYUJXYALLfonov?= =?us-ascii?Q?3xzhP4E0QS8SPGpmqM9FHaVLgsCbFF4WoEOrGdT5K+uYPpjRBXswMY7D9kTM?= =?us-ascii?Q?RWV/GjQ4xUG5XmvJZqxUdG+XArKdnHN/RPFQN08z9y1H8qDxF9GVHqeVjk8u?= =?us-ascii?Q?FKFqJicfBFmCxogRL+/xmT5uUXpmfBXMT3nsHMCtKKMfB8LR4HuUlLIUDwxd?= =?us-ascii?Q?5a1KZviB+RbGwPSHJqFpgM/LsqWZvOpp47RJJupd7jMCDsaW4PkbyMnLAs4M?= =?us-ascii?Q?XoOVU2j/wKodH8RFzeF8V0fGFUxibYR98MIY58c8kLjWZm1mx5r3VNaosrsN?= =?us-ascii?Q?hTG5tNU5CWbJJrnhFiMKMe/FCfIyXU+5HRfz3B1DxhLq9dDePz8SAQYXXEcO?= =?us-ascii?Q?0odhZKuo4p+p6S1TS69zfc7/svgpLZnSoH/ybjx27nTd6NNHdHgMk45RVNk8?= =?us-ascii?Q?T4ePlziwSwqyodVESdiOkYHZBps7KDxmjwBeWeKeQ9efXzi8F1DD1k6kAvKu?= =?us-ascii?Q?XuSq+XEDlGXZPC3UTcErZrd3neItgmad443/8JdTGSHEKyDWvwquuf1JYm7Q?= =?us-ascii?Q?ufbh78tockVc9PzIi3Bf1kA/7oyRiclxRrGuw6HfJsANyKJXssXQ5kbeoJTi?= =?us-ascii?Q?9JKpzLyu65Vs0PbBLAxmnZQc1goKoD+9FL393E8P47WNvQyZit9ViQdWKaBO?= =?us-ascii?Q?W1vPnk7YKJMwoqAtK1o=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(10070799003)(1800799024);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0hgMncuvr8pfZ4ZHW9V0nvn8ak+HY68LV7N64/rxRtvSjM7jWnPH1erfVew+?= =?us-ascii?Q?hI1nO1nocm7qqJibuebllbFrlNbIqYlzMXbG87niCkmbTCYCiksAu06hyo7A?= =?us-ascii?Q?hkSzkKUv1oi0lAcObhGWNZ1WF6dLUVB+bRwf/WiDU24R8QIplJ5k5L6t3k0I?= =?us-ascii?Q?CFS0x2fBQXmzBP6RDSUZ6zlYDnuR4UuYDwJjgIeKwG+Typfn/T4k8/YL34EN?= =?us-ascii?Q?qYUrpVJ0vGxzfgVGpYDEngVKHeXx5KMktPf2wpd+IJeTBJ1QHh0r2YIPAHSh?= =?us-ascii?Q?JrmLD2jYAZ/jKmwbVHrNeAzGmHB+Bf63DSc0m+meHwYUbKLMCTVK7HF0rckr?= =?us-ascii?Q?Yy4Mhhck0YpOowXWDnb+jDm/NQntSxiyZYx2ioPq+8AEUW/9QyBbml/2XODp?= =?us-ascii?Q?qx66Qr0gqQzUWbt5+CAJ6Im1Uq9CoTwEECas1eZq3CceoCkvhjvlnE7DqIb6?= =?us-ascii?Q?pH4XvfcqlXCtIXG+WrLWmZsOyHznrF7sowhUQnHdZneCU5l20YHSYXvn4dC8?= =?us-ascii?Q?XSJC91Zk/FhxKqIHb52HLD1RObE8g43/onvnBUSTU8Rqn4efDy7bP2f+rVv5?= =?us-ascii?Q?U6JiIHvqdm0VSL4YjG3UxquUm2QrS2mdhKXeyh9On88us5gcrjnnbp4xwNUo?= =?us-ascii?Q?oe29frmEIobSDjke5WYtI1QroyE3WUlunodywD3ejBXVmB9FY5Qqc/G/7hNI?= =?us-ascii?Q?DNBPugVNAnU7CrRBKLNshDVcy36D7kT2mFKiRqTeUbjfVWJqn6MKlmovjJ87?= =?us-ascii?Q?vDBkncVotG9eXWJsgmo7D7IN0Tv3kfTY2MYMwSKBY8N1B1Bai9nzRCg3xTFw?= =?us-ascii?Q?Opf+gm9jJPUVtsCLR+FSuK69L4M0jRsVJndNaUMKW42QKXzGcUuxzgbgruSi?= =?us-ascii?Q?ug2hi4QOwOitbborM+/UQeuk341Y74U3JhYIP5OzZhBEtq20OtlDwHWiDFpo?= =?us-ascii?Q?ZOVrK/Lz3Mf+6yoEUtuYu6/Tjw3tUM/Y1shHey0cTo3W+Mh2LrB90waEnLoq?= =?us-ascii?Q?nf92u/0ykTqeCRJ6g7lh+qubADZQS1S9mJpQ9CMEN5abzbzIkDHDc4svR9pc?= =?us-ascii?Q?yILHKMdt7fOROwTnGylLLfsJj9GqlHL03hEOiEYuxgMNepPnh7b4LjYXo1h6?= =?us-ascii?Q?z0afrfH1vcMyBqJ5YT1+uvhEd9dLnhL7WpKex3lGXhmHbeW/QT34upKF92vo?= =?us-ascii?Q?iaCzcWgl/4Ms+2kFNQHjub2NxZvl98+oeSJlPcrJV0Fj8W7qRx/pfBN5zVYW?= =?us-ascii?Q?jz5ShIDn3PUZS/nKZ1zZmorFgDXETjKouhJy2pFbIllyhTuwWOoDsAjDUWbC?= =?us-ascii?Q?/GJ8NY0b1Ag59M7QyfQYMwEYMdxTAwpE7HOFm0FUWsqqWvC+P4M3Auew/n5U?= =?us-ascii?Q?ZC8ec0Oh60ZQDC10yDYsbI/ohk+x3MFrTu/a09Dfnx4BjzQxTepuo8qT0ZId?= =?us-ascii?Q?aXPXFjyrh83OS7wkdzztGovG7CzngjLbt0Vz6inb+tle4WMwPPW3sJwY2fIQ?= =?us-ascii?Q?MQhttfdtMPE6AipilTpE4bYfWQU6dvUPG1lh9OwLRhoDISPzjvT+GHQfT//m?= =?us-ascii?Q?xSm1mth8imXw75LwrNM+fV2QXxHFkcAcGtiR3vBxPGK5RUpNSFT3tf5q3aR3?= =?us-ascii?Q?i9yyzb9Om9Z+rVHZbphQ64R2FA/zHx8miasVDc80jGDOTGHImZ7TOqBGwTiH?= =?us-ascii?Q?J5avyMb5DWNjeE8a6Ck5hfLal+IvLZbqfi2kNIGrKRu+6wNjTJAidENwqUTS?= =?us-ascii?Q?s3dfJta79P3YiwM8tbYjLCHtkiHuLK19lluCOGnTZ2Z3Zj/WPeCk?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 9f7436d4-30c4-4b5b-b168-08de73b95365 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2026 15:28:13.9038 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: JFPny/jI8QiY33rySCHi+hOF3cFwbKGxtk25FnjQNAPyvlmguwMHikgN5ra9xnCOR6rbEqQCCpp0zkcsvz+Cbg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS9P286MB6904 Content-Type: text/plain; charset="utf-8" Implement the read-only get_channels ethtool callback so the active number of queue pairs is visible via ethtool -l. Report dev->num_queues as the combined channel count and maximum. The driver does not support changing the channel count at runtime, so no set_channels implementation is provided. Signed-off-by: Koichiro Den Reviewed-by: Dave Jiang --- drivers/net/ntb_netdev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 837a2e95f06e..185cc9ddfce7 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -470,10 +470,20 @@ static int ntb_get_link_ksettings(struct net_device *= dev, return 0; } =20 +static void ntb_get_channels(struct net_device *ndev, + struct ethtool_channels *channels) +{ + struct ntb_netdev *dev =3D netdev_priv(ndev); + + channels->max_combined =3D dev->num_queues; + channels->combined_count =3D dev->num_queues; +} + static const struct ethtool_ops ntb_ethtool_ops =3D { .get_drvinfo =3D ntb_get_drvinfo, .get_link =3D ethtool_op_get_link, .get_link_ksettings =3D ntb_get_link_ksettings, + .get_channels =3D ntb_get_channels, }; =20 static const struct ntb_queue_handlers ntb_netdev_handlers =3D { --=20 2.51.0