From nobody Fri Sep 25 10:38:23 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021122.outbound.protection.outlook.com [52.101.125.122]) (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 DA37B3D3314; Mon, 14 Sep 2026 08:48:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375731; cv=fail; b=QMe5vzS/qXQlUEajGBIsI8ssCJl6Xe3dZRUpr3utVyKf6k5NS7fnCEyVdcwkJMF/UmFAh/tML6uI+yLRrNU0/JBeebcqgMDY2kMNUQ2PVGk8vmLv+2phJwM2/lFCPcPOArK5MK6lopWIBTmu+bverJGpf8h3SKJFIH70mgejpM8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375731; c=relaxed/simple; bh=foZ8+YSp3Ia09R1m+aBXHThQFp/xE22EeboPn+4ZLME=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=UYgCJDiZjR1fNhP2YNlYIwT5ENtNNpfMxgAMZZGZnTNfJcrlvsIf+0/YWrcqAeIczDpmc4fdxzhwOfIWW4EA0p8Kopn+1fKfPOKujAZHfY2cT/yTdbAWwFep4laSeR8zMAuBrc+MA/mu4yhZYzg7F8VmMMMFTVzlBxE/+IetYZk= 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=rn93oKaD; arc=fail smtp.client-ip=52.101.125.122 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="rn93oKaD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KP2zL/+SPMQfcTr3yyQYFgs66W0dUgr++pqtamDdYyQy8jCTMQBwCH3pPw+gj8IYew5CSxOaZHkslUBYAFfbXj7sgJw4WfBQ0eA0Qc305AizreEqSX6zBkY0wglsIosR3QxMgUBPtLpbFLdY3e7HRdjsdhz3ETFz1Uul8Qqq1ZztJO9CTkG+vodCA1hvpoALjAm3IvyhVsaHr9xg8hU1t9RQMBeqhbQco6STGcqctcK8UT/oeq2mUUx1DaEqbuCRZUYDRa9oNwpfCtmUrjNZBm9cKL/JVhGzfzf+jd7WUbd1RUjrA9kKguXCbul63Uy6hd/GngIALcDaRp3cMHxmFA== 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=WYbRfe8rotDyZFD14lomX/I7s5/GflRA7eBGeMOrpjs=; b=Aw8ZH8ARRt3CQaXikkFolDqKiAdKHNSx0ziVa/FgrcbHPMhijgLFe3/tt0wtez2vd2Rbzabg+wKyi/GO5seAtewaiqr5nSWdTuDfWh9fecE6eKKZuwswG8BfWlK64BBJmlvTwapuvQA/7UraWTx+qD3Zhlvsz1/5znezoENKraticPnUJMp1PBFHXpB6gocPJXCku8QUSukWB3YAn0yVm4eKyRW+tn2YcWXcRr21uP3Wvi4L8TzoeZhgYgw1n2DJiDiA22drqifoxGr0bgWs33RXQl761FMas/FRhj2iw+mwqoPLeAygMFssc32sVpt9yBGmXhv4CqixZemUxEVTDw== 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=WYbRfe8rotDyZFD14lomX/I7s5/GflRA7eBGeMOrpjs=; b=rn93oKaD6NK9gdn9R8Y++M2WHOw12rrJl95bT0701Ambn2pcTAg0q8tyKT+8tAlOtqt2DfVeBNX0Vw6EyKR9UIuBipAnz3rxZJvEGUJhtniqQRbg01VbzQLcRYvwEuEBco97xRiHfRrgfkXf8/fiqvcVzJ1nafLOimFM3WQOWg4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TY7P286MB7153.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:326::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:43 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:42 +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 net-next v4 01/10] NTB: ntb_transport: Order RX descriptor reads after completion Date: Mon, 14 Sep 2026 17:48:29 +0900 Message-ID: <20260914084838.2158249-2-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0095.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b4::18) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TY7P286MB7153:EE_ X-MS-Office365-Filtering-Correlation-Id: 0ae4fd4b-8485-4386-d952-08df123cfa91 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: EB9w1TZqVFkyelqSCCc9StJSfcvQzt2Zx3D87mHBk1Aou4RE2wwHIex6bBVxWjWaNfILeMWp4dVKP8DRU1I+taEQpz8Kd/V0nHeoftH+tNtYPVjzMvcokC1LuTODZmzdHHwtqWwlAUeMbasFGP52WNyi12yfrkqQZFnxgjXbEdU4dpjarlPxg9aZM3vghDjLscL8lW1Oo+qWxfr8pbtdA/6PBk4W07F82hs25NP3azQc5YzMcEyxORf9b3+IvHijcz5+JPeGwJYwS0aI2tiAmKS6Gk1okLvmcOCXZpJZxCXumz9dBYwDZbx2knsw5n2Cu48mheNSl6kQVJBNVni91y/q5xXJVTyz2dlj9blUhNnZcO5r+DRjgTC+hoImN5STaC5PqLDCnC71dM4ycO9iDdrtI5ZT5mkc5E8IcivAqnA+Y/kwk0PeOOWYRMGvY88Gjo5cOgiC9oSS1PJiOPc/c47J1Ipu7o4khFhyNsp/670EEYYaBcS6UYiJav6JGitIZlz+2VUnPA7vt/wQuIDOE3JhHeC5RCV9nuM+jwTPPdzeyQQFwxShKchykfTs1Y30x4IDkAoT2DgwAk/M9JmojPFENQ2Fy4OTtWGfsEOe45i8ZbEB8zwX9950XlEZtbSx X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Qet96C61kXgIhLvd0M4WicQk2gRPU0rD89wdShEgE6ivRdx7OUi63WqSa4g1?= =?us-ascii?Q?XaHsbQy4x2e2nuXpkVR1o64esRhOY0xxUz7fFNG7r8lazGE0DYoEzBRaRMKm?= =?us-ascii?Q?sCt8XFWpJKKiWUyb5HwVAo0JQ+7GgpDsE4KcpxwULA0tBsD5pnopbbF3nwGA?= =?us-ascii?Q?O/E7tubBP9PkhXn6fKPwZC4/1hsz40CHR/v2rxZXBf/icohs3gga77Ha5m1T?= =?us-ascii?Q?TKjk5/Lt+ndtBdl7ODALIFxeX834vGEjOD8dFRVx3SqGwz1FENc3x7K8x33s?= =?us-ascii?Q?I/MzCVegiZ3Z8diq51C0EPId19Wt6Az1+unzqPZyWuEEA8CTz5/f6hrxOdAM?= =?us-ascii?Q?PsiRNbm/5Q53HC3jyJ6QvZhNNpxLHB5qdiET5DzGS+rVin6V7wNI0DzXx5O2?= =?us-ascii?Q?t8mCizxCdT0SbQLLWvayAKvIBy5/uI+cpzw7ogz2JTQGK4Og5NCa+CZCcYYl?= =?us-ascii?Q?avhsbE0YDelY52bu2THo8fbH3JALTstWpHLgacvjR8FFhGovvsC22+1SC/vv?= =?us-ascii?Q?jHv0Q0RY7CjND9aBiMllVPUcl7ufG2JqkIgPZHqpXlVUlNev8yXZ3uUG/gXJ?= =?us-ascii?Q?j+J0y63aEAS0t5aQsZp6fXtUULrUnXFlED0irJTe7+PzFWfKlehZZnaNY0qA?= =?us-ascii?Q?nEhjR60xkLZRCHy+xLifgKBQl9/FDXQ8y7MpxUw/0leSujpNyJRETcqAJ2tn?= =?us-ascii?Q?VtrMdJKx5WEX9gdl5AR8DNCyiaC0knVeH+D/mNl6vbJjlSUR7bXCu8oezqy5?= =?us-ascii?Q?uU4TLlTJPBGZMujG7GmG57Cl1H+oG5rOyrh3hSFBt0TBp3NgtDQWjJz0kDhQ?= =?us-ascii?Q?4Xq4MI2fYc/S0xXimbgQyURFlMCigdd01HgehfufHQY/SUcvSRyINxZMKtRI?= =?us-ascii?Q?aNYESwYdcIQIJWhZ0hBVwiOwYMlfJnDkLO33fV5bYanYuA1E3Fv2iois2m2l?= =?us-ascii?Q?+qfK5HeGGu/+wmT6DU/cpmdYnklG9hPjJm1WnFx+8x6ETocik2n/jrDuUNjV?= =?us-ascii?Q?ULY7k98/TPCWFOl3xtRcZOEh0QFZAKscRkH2gaIwNgrsddyJs1lq5Ke3ugqt?= =?us-ascii?Q?uNxMLLBxOmqN5pHgry8hnYzoZEvwWxLnKqwI4OtKQ1/xrhfcN5O85ovD9LRO?= =?us-ascii?Q?2U6LXfxlw0p5yT4SKQVAfgKY/HbP6cLKhuQ09nvCbh4JdNMfVzdkCSTZtqt6?= =?us-ascii?Q?ausaCD8C/6OKYOBB4oc9ysmys6SiZKSvvh/AV8rz95h0r4EPduKK8YviYGFF?= =?us-ascii?Q?b7lI24wJvO/RIHKJ2KOeEpn1FE/BD2uzUiLo+JXzWdU7RG3F/XcG47fUZTe+?= =?us-ascii?Q?03xdDbydG1MADpIztpkuvbuaBZOB9k2ePkdhXczalDJZHZz1hSsQwKT6HWnm?= =?us-ascii?Q?y1b7I/3HYpB0/yXtiRXKZgMQgdfbFTO5/amGINqu9eWH4E/S5nEctw6RrQ9r?= =?us-ascii?Q?nt3n0RVVzeg6/oFqASZQQZgAQG4X2PHTj7LizUonKrQ/cusP8kl7/Bd26qUQ?= =?us-ascii?Q?qrbwcunKcujq0+dpZvLB7jovUVvQpalD1mjBr4hlDumOD9mv7sPj1WvRYKuC?= =?us-ascii?Q?M8sUVOkIflojOfDeEkmVchTvB3ZISgsMe6/sSjPL2a2FdSlS29y67suWhsh2?= =?us-ascii?Q?Eots+8E5HmV9/7LzNfNJENP/abshQTMFpOdJkSefaGPvZABvsb7j4qxt8Fre?= =?us-ascii?Q?dtsTsdvHn0vEKYgbLp42b/+BA0JWx8vLrPMU2E6kpdjkkkDu7pka61NJgN3m?= =?us-ascii?Q?tD0g4frXL4Ni45V1jPLP4v0epzH/Oe24QkMyJa9pIb3P40vUABYF?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 0ae4fd4b-8485-4386-d952-08df123cfa91 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:42.2297 (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: SDEKiSAL7NPDR5+wWSFgYObKDQo7NMfFgkZOARe4du76eaZNuUFXJ1dIBZu/xzMzfcquUYLRHbqiaUEfTnnu7w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY7P286MB7153 Content-Type: text/plain; charset="utf-8" The peer writes payloads and descriptors into a DMA-coherent memory window. ntb_process_rxc() checks DESC_DONE_FLAG before consuming the descriptor and payload, but coherent memory alone does not order those reads on weakly ordered CPUs. Read the completion word once and issue dma_rmb() after DONE is observed. Use the saved word for subsequent transport flag checks. Fixes: fce8a7bb5b4b ("PCI-Express Non-Transparent Bridge Support") Reported-by: Sashiko Link: https://lore.kernel.org/r/20260815032932.151F11F000E9@smtp.kernel.org/ Reviewed-by: Dave Jiang Signed-off-by: Koichiro Den Reviewed-by: Joe Damato --- Changes in v4: - No changes. drivers/ntb/ntb_transport.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index f9caa1a653c5..74f4f8c1c7be 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -1609,21 +1609,25 @@ static int ntb_process_rxc(struct ntb_transport_qp = *qp) { struct ntb_payload_header *hdr; struct ntb_queue_entry *entry; + unsigned int flags; void *offset; =20 offset =3D qp->rx_buff + qp->rx_max_frame * qp->rx_index; hdr =3D offset + qp->rx_max_frame - sizeof(struct ntb_payload_header); =20 - dev_dbg(&qp->ndev->pdev->dev, "qp %d: RX ver %u len %d flags %x\n", - qp->qp_num, hdr->ver, hdr->len, hdr->flags); - - if (!(hdr->flags & DESC_DONE_FLAG)) { + flags =3D READ_ONCE(hdr->flags); + if (!(flags & DESC_DONE_FLAG)) { dev_dbg(&qp->ndev->pdev->dev, "done flag not set\n"); qp->rx_ring_empty++; return -EAGAIN; } =20 - if (hdr->flags & LINK_DOWN_FLAG) { + dma_rmb(); + + dev_dbg(&qp->ndev->pdev->dev, "qp %d: RX ver %u len %d flags %x\n", + qp->qp_num, hdr->ver, hdr->len, flags); + + if (flags & LINK_DOWN_FLAG) { dev_dbg(&qp->ndev->pdev->dev, "link down flag set\n"); ntb_qp_link_down(qp); hdr->flags =3D 0; --=20 2.51.0 From nobody Fri Sep 25 10:38:23 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020084.outbound.protection.outlook.com [52.101.228.84]) (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 02EE839CCEA; Mon, 14 Sep 2026 08:48:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.84 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375732; cv=fail; b=EHzvekmzYg1/CBp8YavvB6tpYgM8qhwJ8lu6vR2hFAI97kj0tfb3l1w+oyjecTfVK4YS25XxbQRB7nreP1w7bYN4nieAuF9dB8ixuqPuZCcVWMUJ7KAipWgiAeOptGkcPT1gbDBikfno3HnTgKGPG+ouYwLr+liuCgiibvAeugA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375732; c=relaxed/simple; bh=ActISJ+VSOp3vcteG/+vsMs0dv/Er/RH0iSnL4AXCz0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=l3Nl+mqBczamUdEJippcjp1RN7fdNf62WqUt05MZ0coiI9N1pz9zmCNgtztLxe3zG38AMqVjFIcRg4Khpor9bOQ6IjDVbYzRvMuFueUw2GaKSGL9dEOgruxJewmEAw+n7ULl6msIGzeboM+W43ysYpDE5Gr3Mi8aG3JzKxXrqnU= 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=DBrbG2qt; arc=fail smtp.client-ip=52.101.228.84 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="DBrbG2qt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yzlweBo+XUix6BnaMqish5emMn84lXytvwdCK99WWrr0X93ptETwogZtjcXpRVx+38EnS42rHpac/niQfnR8gRd6E78sg7yCj3pAfnuiIcNlMegEjCT2lO+Fu6kW2ZA1e5OT1rpKBw18tBROkz69dsX2Op+/LFjc6v9R8YxB1qRCI0ERnTb1WPbLUXeW/wIh26sufhB/IzK7upxDlMWywi85Qcs+rCJSNVuaJybSPQ8KHvuMS99hFjtZhjY7nvcV0KJwv92U7JP3pXlBUfmKExwy+rvVlRdIebDSf4Z2+rhbU/3W0IL1TjaT0hVNYUzVl76ZNjuOTCpIHMq3alFY7Q== 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=4/vV09gA9jPjDsbtO8S5MwaAUakVh4jO7IfBirUJv64=; b=IAdcDXQvrL62uUxTm0tc64eCNNIfbiintmpYTVNRMm0fr4uV863kEA9eNQsTUa4mHZudxoXpv0SqcIDNDCB4lX0XvUJnJI0KxllRIv9UhySxMx+Z4F4b06pCcn2TEvpEgrQS+o2QfJmCrzXc/myrfhE9Jum++5oaUvGQwmMTsftZdnaCzceZlcc85GBgIorkmkUf72E1L/Kbd1eu7N3qS4rPD3RDdt0Zobqi2fsrwTRiFdHi+wEZgsKB0JmTFwyreUJxVQcS/oDURzWcqfOXEueo54Xeo5Ht3jMi8HD7WThJjgyJXp/GFpGiaKm6G7TlNYtzCmaGVhwmkPXVuuS2xA== 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=4/vV09gA9jPjDsbtO8S5MwaAUakVh4jO7IfBirUJv64=; b=DBrbG2qtlxWOywDk3M4YoyNflglg5p/sbMaqijtjaCtZ0Jalkbc+2xrq2G6+66/4p2NyJCBZ+lkpeNgQ3Osbm57W1kPglWiKPxTByxDoEOJ8HRfStR4TccCc4153QhoGlieUbzvHKunIx7tHTlTaSPloAhcy7SnxuHgQie7aswU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TY7P286MB7153.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:326::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:43 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:43 +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 net-next v4 02/10] NTB: ntb_transport: Use little-endian shared fields Date: Mon, 14 Sep 2026 17:48:30 +0900 Message-ID: <20260914084838.2158249-3-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0029.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:2be::12) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TY7P286MB7153:EE_ X-MS-Office365-Filtering-Correlation-Id: 23a2b42d-9863-410e-3441-08df123cfb30 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: gB08wKslX/7oPz3Zbo4m7uzm9bfaKn+IV7vQ8svqC4AApYjXJaGwItAC7LaPopxTQUfiJMEf4wWuY6HA1yDMtGb7pLhf6VuipoeooYcFFM5RhPljUKcp+YNHH71YsQXI8lvjTYK60lRp7nGlMsJ7qaraj5H9ZgTrbGduXJtkTPfoku5HstoAies8LmjL7e6Al5PxyAoVatNk/y+xON5PKATgok+c1U6IePQ8RtxjjWTmFKa/HeqE5OVUK4EqavSgOvZAi3lc1JT7TC2JjFfS3t/iqGmNQgiFmV497wEascCh10llCa/N7qoL8kDzdZu9wUdxT/VdMsggyFTm7gfnahzqsGw3MTihcR7xy/TxrCVXlTjH/pZDYGhLHSeqOajJciSJf2xlVKopqvmUevxoQVT0r27WzeW3e+A8vZBXBLbI8oC5sb0Q6JXIEvp/Its5jrGM/ElcDnG/zU96fONpX6Jolz3MQznB4l+iP6XP+sRW3PeVYsJXi/RW6QnObH3AdlakPDg1M9QC4inRop0zSLa1iqtmPUrXXyrNboGgcJ97HdV+/ZudHR1k8lA8laOIUY+uR1ZVx6iL3IOJIcPAi/rNfDrjuZ2XDqd0RdqnAfQh94fY5PcF7PaaKD8Y0XM0 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?DVzcze3tgSUAQDi4wddLADnfi6BRP/qGyWM2vxQRRZjc7JIcF+oF+SkWS2FJ?= =?us-ascii?Q?bT+DcBMcD+LGeajQp37vFC/L8d1tv/W6OKpc3p9heRce0iFzuLN42is9opH4?= =?us-ascii?Q?HItam1JZlFSplDX0eUKazr6BcX+vOE+THYmg6PiTVnjSQrnwIFn8rikdYKDl?= =?us-ascii?Q?Q/bzp2UGmQn6pLF36veiWaIxNM9FQ9NkVrObjPgnElaHzHLPG0o9gpz695Tv?= =?us-ascii?Q?RM7FluASKrnGgbtFgGhJ4ZaH/3Vik4387LMYjvs79CdtflMBliLAUOwS/rsW?= =?us-ascii?Q?N1RUE/rao5mavrwj1qJ3PK4ydYHSxSeJbbSryp59fyygdoZZw3HV8JCZxFXS?= =?us-ascii?Q?zW/XyToc6zr5tG1tDiU7YpFPcxRSuPQ0N/iu9vrN/ablmY3WkLvPRupFgOrF?= =?us-ascii?Q?JURsKuUrEllAWYFgfvD5BqLl6Ka5U1oFCAjsNIIbc+WpI8L7iakzTF0N8t6j?= =?us-ascii?Q?uPgFs+7EFfAxSSST+Cr3BN3Fd4Z9xz6CCctlDlrT1jUvh5FORVu5LUTHQfOx?= =?us-ascii?Q?nJVOI5ydeuCHzMKsKaBcD9J0UiIeVdrs8vwlgfAIhNo0jJKJzoxDytmYb0+k?= =?us-ascii?Q?BoRPZAplGeVuVmISd45FD4OG04KP4Nb7woBLrBraRQ5/ITKNlb3p7L4R4vs7?= =?us-ascii?Q?7mFfSyOmQLQ+dYC0gxGW3NYrNmvkcXIA6plyALT5Hl5BoP/TQF6x1tHxzqTD?= =?us-ascii?Q?EEvPwlABYKNrDFFadBcNttKUXRP52ngs+H+Od6WMl99z6NxZyg7YQyQ5Bqnj?= =?us-ascii?Q?la1gYntpqR9WPNfzuTjP4hnKKrQQr7OnN9oNpBXXQ38CNbdFUzEqyDpd+UC3?= =?us-ascii?Q?47ZliZ4jkgSiwyDzZ67aBxG4Fr9sgaLKpAedtzciMeIZ6z0q7bcdCMSZW8g0?= =?us-ascii?Q?Vi1Ma6CM9CWWtRJ1EbuhrNwUa7RzuMaFYbA1iLiMIwvI3uX7U/Ck9lQ3jR/D?= =?us-ascii?Q?AN4Vz3KUAPlDUcUF+4d0l/fi6+sUiJtYJC4tzC2y3Jlj1tZR15t75I5RC0+A?= =?us-ascii?Q?6Z8xRkYr0sAQt/u8W2tW8doLA+nQ6ZGV1LBDQIpBOn6vzA3D84BEG2lvGBMT?= =?us-ascii?Q?AdKWb0bTZZh9wW/+LfjYuoAexDDI/IVBoRH/pX7k8M9R0VyDDK3tx9MboxpK?= =?us-ascii?Q?T5TL9Oy8iJPAAvHQVgBPVhog3UU8fuAc5WC+hI94YK45MFwXO78VjNQFgWxF?= =?us-ascii?Q?mZx+GVrauylzKc61n7HOUK/zz0xMIwUn7Oy/1wgrgGslpZyO6DawHRr9i6w5?= =?us-ascii?Q?pRT0rQV65yNDtL03JiRF7fl03bVIxErNkZmQO5zdlWigWYbHCIkd74/tjYSf?= =?us-ascii?Q?9fqUn4YEOd59GjQwlQD4jssawU3PmKg3w08DKN/XgajfhV90/7ois6yXLXCG?= =?us-ascii?Q?UcnawWOZsXO9QAb6QlpKn0Mz/hSObO8gtqQKf4c9y3Ee1guIrLP12XsoOB+e?= =?us-ascii?Q?MmBfJmrU/OgnFTmpToa2XSRKDlpuiqiOU0cTcCo1R8l7KaYyCLKA0XfJGqgL?= =?us-ascii?Q?dic6Kdj7KzJRn9pcJibFCN02BK4+kq8gQIppp8UgKHAm5KEucsdRD/SXa/gJ?= =?us-ascii?Q?nRPMZPKId/8MI7z1rbNLDzWCocVw7C1xXeOMJ+GTFwxXpkQlCsiUDcigqaew?= =?us-ascii?Q?2R8+5e3f9SzQwyrfD9xdTsXVeNtxMFbeo9vHiRoVf4k0MeFLCcjOZANEnmyQ?= =?us-ascii?Q?6zsDF9NCex29zycD0i6kqhKC5Duex+oGQRsahLU2uKwUZl9qsEBVj+wijPyY?= =?us-ascii?Q?yQLAwyh4Z84KYkdb6F15FDU2KSKsao4BDrI8RzBLUKllJE+dwZ16?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 23a2b42d-9863-410e-3441-08df123cfb30 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:43.2905 (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: Tv5XQn7/KpmEW5KLyD22NUc+V/ame4EC9v/cas+LRxUkcbGRlb44ruKbn1Ivqy++yDevLA1hgktpG8R1X8qGag== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY7P286MB7153 Content-Type: text/plain; charset="utf-8" ntb_transport writes payload headers and the RX ring tail with iowrite32(), but reads peer-written copies from coherent memory as native integers. The values are therefore byte-swapped when read on a big-endian system. Mark the shared fields as __le32 and convert coherent-memory accesses accordingly. Read hdr->ver and hdr->len once so their checks and later uses see the same values. Fixes: 74465645cdb4 ("NTB: Fix Sparse Warnings") Reported-by: Sashiko Link: https://lore.kernel.org/r/20260815032932.151F11F000E9@smtp.kernel.org/ Link: https://lore.kernel.org/r/20260818064951.7EA231F000E9@smtp.kernel.org/ Reviewed-by: Dave Jiang Signed-off-by: Koichiro Den --- Changes in v4: - No changes. drivers/ntb/ntb_transport.c | 47 +++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 74f4f8c1c7be..3f497a62673f 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -132,7 +132,7 @@ struct ntb_queue_entry { }; =20 struct ntb_rx_info { - unsigned int entry; + __le32 entry; }; =20 struct ntb_transport_qp { @@ -265,9 +265,9 @@ enum { }; =20 struct ntb_payload_header { - unsigned int ver; - unsigned int len; - unsigned int flags; + __le32 ver; + __le32 len; + __le32 flags; }; =20 enum { @@ -514,7 +514,8 @@ static int ntb_qp_debugfs_stats_show(struct seq_file *s= , void *v) seq_printf(s, "tx_err_no_buf - %llu\n", qp->tx_err_no_buf); seq_printf(s, "tx_mw - \t0x%p\n", qp->tx_mw); seq_printf(s, "tx_index (H) - \t%u\n", qp->tx_index); - seq_printf(s, "RRI (T) - \t%u\n", qp->remote_rx_info->entry); + seq_printf(s, "RRI (T) - \t%u\n", + le32_to_cpu(qp->remote_rx_info->entry)); seq_printf(s, "tx_max_entry - \t%u\n", qp->tx_max_entry); seq_printf(s, "free tx - \t%u\n", ntb_transport_tx_free_entry(qp)); seq_putc(s, '\n'); @@ -633,7 +634,7 @@ static int ntb_transport_setup_qp_mw(struct ntb_transpo= rt_ctx *nt, qp->rx_alloc_entry++; } =20 - qp->remote_rx_info->entry =3D qp->rx_max_entry - 1; + qp->remote_rx_info->entry =3D cpu_to_le32(qp->rx_max_entry - 1); =20 /* setup the hdr offsets with 0's */ for (i =3D 0; i < qp->rx_max_entry; i++) { @@ -919,7 +920,7 @@ static void ntb_qp_link_down_reset(struct ntb_transport= _qp *qp) { ntb_qp_link_context_reset(qp); if (qp->remote_rx_info) - qp->remote_rx_info->entry =3D qp->rx_max_entry - 1; + qp->remote_rx_info->entry =3D cpu_to_le32(qp->rx_max_entry - 1); } =20 static void ntb_qp_link_cleanup(struct ntb_transport_qp *qp) @@ -1445,7 +1446,7 @@ static void ntb_complete_rxc(struct ntb_transport_qp = *qp) if (!(entry->flags & DESC_DONE_FLAG)) break; =20 - entry->rx_hdr->flags =3D 0; + entry->rx_hdr->flags =3D cpu_to_le32(0); iowrite32(entry->rx_index, &qp->rx_info->entry); =20 cb_data =3D entry->cb_data; @@ -1609,13 +1610,15 @@ static int ntb_process_rxc(struct ntb_transport_qp = *qp) { struct ntb_payload_header *hdr; struct ntb_queue_entry *entry; - unsigned int flags; void *offset; + u32 flags; + u32 len; + u32 ver; =20 offset =3D qp->rx_buff + qp->rx_max_frame * qp->rx_index; hdr =3D offset + qp->rx_max_frame - sizeof(struct ntb_payload_header); =20 - flags =3D READ_ONCE(hdr->flags); + flags =3D le32_to_cpu(READ_ONCE(hdr->flags)); if (!(flags & DESC_DONE_FLAG)) { dev_dbg(&qp->ndev->pdev->dev, "done flag not set\n"); qp->rx_ring_empty++; @@ -1623,21 +1626,23 @@ static int ntb_process_rxc(struct ntb_transport_qp = *qp) } =20 dma_rmb(); + ver =3D le32_to_cpu(READ_ONCE(hdr->ver)); + len =3D le32_to_cpu(READ_ONCE(hdr->len)); =20 dev_dbg(&qp->ndev->pdev->dev, "qp %d: RX ver %u len %d flags %x\n", - qp->qp_num, hdr->ver, hdr->len, flags); + qp->qp_num, ver, len, flags); =20 if (flags & LINK_DOWN_FLAG) { dev_dbg(&qp->ndev->pdev->dev, "link down flag set\n"); ntb_qp_link_down(qp); - hdr->flags =3D 0; + hdr->flags =3D cpu_to_le32(0); return -EAGAIN; } =20 - if (hdr->ver !=3D (u32)qp->rx_pkts) { + if (ver !=3D (u32)qp->rx_pkts) { dev_dbg(&qp->ndev->pdev->dev, "version mismatch, expected %llu - got %u\n", - qp->rx_pkts, hdr->ver); + qp->rx_pkts, ver); qp->rx_err_ver++; return -EIO; } @@ -1652,10 +1657,10 @@ static int ntb_process_rxc(struct ntb_transport_qp = *qp) entry->rx_hdr =3D hdr; entry->rx_index =3D qp->rx_index; =20 - if (hdr->len > entry->len) { + if (len > entry->len) { dev_dbg(&qp->ndev->pdev->dev, "receive buffer overflow! Wanted %d got %d\n", - hdr->len, entry->len); + len, entry->len); qp->rx_err_oflow++; =20 entry->len =3D -EIO; @@ -1665,12 +1670,12 @@ static int ntb_process_rxc(struct ntb_transport_qp = *qp) } else { dev_dbg(&qp->ndev->pdev->dev, "RX OK index %u ver %u size %d into buf size %d\n", - qp->rx_index, hdr->ver, hdr->len, entry->len); + qp->rx_index, ver, len, entry->len); =20 - qp->rx_bytes +=3D hdr->len; + qp->rx_bytes +=3D len; qp->rx_pkts++; =20 - entry->len =3D hdr->len; + entry->len =3D len; =20 ntb_async_rx(entry, offset); } @@ -2490,7 +2495,9 @@ EXPORT_SYMBOL_GPL(ntb_transport_max_size); unsigned int ntb_transport_tx_free_entry(struct ntb_transport_qp *qp) { unsigned int head =3D qp->tx_index; - unsigned int tail =3D qp->remote_rx_info->entry; + unsigned int tail; + + tail =3D le32_to_cpu(READ_ONCE(qp->remote_rx_info->entry)); =20 return tail >=3D head ? tail - head : qp->tx_max_entry + tail - head; } --=20 2.51.0 From nobody Fri Sep 25 10:38:23 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021122.outbound.protection.outlook.com [52.101.125.122]) (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 A024541228D; Mon, 14 Sep 2026 08:48:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375733; cv=fail; b=FD4nRYQYW+Gm95jRHa6Dp/vFDQPDsi/2YF2B2QtUJkplV1cv/MJP7tWgv+wzaM99KGPhnQR6K7wyjPrEL1dpky19RXWEwJgas9mT4BcP8P0ahsvkmmaaegJ4C+ls0EJ3P0VUuVteVgdvUV3jXoPsNghbSJcz8DisHZOBzrvD37M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375733; c=relaxed/simple; bh=OadsX1OdSZwMEQO3A/K4IWawZCbIWcbpGv5BZiiQ3sk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=I2WzMSetvxkXgftGe66H2MP30y83puCvmPumjGRBPIv3jYUCMi5vQblIJU3EeWbNQ2KnSJAJofyxZDjMk2bv/ATQPxKycsPN8ydinQRT3XBi+Nhy/h8d34jnJbnVg0xLdcrgz+EdSRs28Bkd14mUpIh6rEyJh40ecGEqrbYofbY= 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=EUjuct8H; arc=fail smtp.client-ip=52.101.125.122 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="EUjuct8H" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dpdHvBqIomgsvc6g0MwKikxjK4trvaR8VI8555I0YUEFuOAPZG2LD1OEZO+AfoL8vyzACloleEG2wss4GfV6FU0GeeQ51o3zExGgEkEEtEYHqDhWpeA7GPNDrzxLcWCFNo+nwdIu1gaZwUsm48FPxna6B5ex7a3MK4mX1/HovAIDGx9zZh0yPp810P4cUwOWx3T30HxDKmhNm7COu3cNL7tT0olgqiHraBsrQ6WP1Uul431Z1TKeNx1F1zF6l9g2gLpfBhivN2F3PG3qmeeEWcsRK6b7+tMfYpMX9pTG9D0pbnVcK/QqQjKTeht8NNeZClJ54D12m+tyG5R3hYnzzg== 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=hGK9AAVwOUh9urIaJth1F8DO8yIs2ftyHbbjmiMZmIs=; b=H+aDL+kLipGThq5ykL+r7bwL6sAjn5KZ5L9dgM//7Ztenj2BM4sGyFjZtklHkyvPRtyRRIPVqVN9uM7PA288xi4cyrnQite8xc+3YveDxOcOXc8NR4vS7ttt7/g0N7V9nDEWmxgqGN1yvGr9y2iC6woHEMjleDdqkrQvHM02gRtvkAqWNR0RI30dQxnqfPFpZsrMSGGyk4inxLazQ9e5MgyDxke5Tc4nEFQEcScmioID3FcRxlIKINEq7FGncLVNQhFInGwa8CE1CIOYiF3xx48MLfHv1ukkORqxQeoipZ01wOQkSILSOcpeY5mTBFcShpb1xfYdSQH25F7Pssecbw== 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=hGK9AAVwOUh9urIaJth1F8DO8yIs2ftyHbbjmiMZmIs=; b=EUjuct8H6PPgRb1NcWqNG9xgCgaCSJcrmYEBh3R0aWYu3bk6YSoL3iq+TI1KAzGY3ep3iRlzzKE4UZ7AXwxGNKBEsI0bcd5o+S7UxeETBn4872dPssBqsFSh2BVXTz9h89O+SU0yLxtVjm6iEolUB6v1hizcrd4o2A/PaS9pKUY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TY7P286MB7153.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:326::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:44 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:44 +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 net-next v4 03/10] NTB: ntb_transport: Order RX entry completion Date: Mon, 14 Sep 2026 17:48:31 +0900 Message-ID: <20260914084838.2158249-4-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY6P286CA0029.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:3b7::19) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TY7P286MB7153:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f29e283-0a2d-4665-4a33-08df123cfbc6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: kim9Bc8lJJZP7l9M9RhyAwz3XWfvxwtlseNxLQrttFUimDuPbrUxESoP0mT57JCG8qfcmB9zfpbshUytAl7vDeLNn3z4pENK9HZaISGftenls8nOzGf4ALUdNCVfFYHnU/jUgcqRQ859NLlnIbrmUzAPX2Kk12M+CJ7Rz6s9nZNCgcHA+7lXdBVi1cgIrLfFYQjBkYtp+j1rZRPDtZZ1cKy0MYsiSWnSzIzbd9ncCQwK67Z52ptlSsX3B4e9eKyZjqNEhbRwy86UvMf+iWy7KrfXWsZChDGBiJlmaR7R+Xz/WGb+n4YDgL+3eiSj7EUbFgoUUTG13NocyFZfH/S8N458kQK7+32ge856Heh9WhhkQqB4q+rv+/1iFKYOpA1qi39E7RcwHzOJzvUbIt6blXTzWAbDo3/zZYsRBpeBcM9DTCzfbEPoK3ILFYi6ASKG9d7zEMHCGMOMAGCJFVLylThlQDFsnPUMmmNwWimG9eXC1/bPjkm9uvyad2AkU3pGnqkhkrJ4wUyIcHQGt/16AUVMqw67ko1WFJA71OTgDc3L/H0xHTgEwe+NAJkSfcTISTqLqtYvzmET8ogF4Z/ESiiSYj9Gn4uQz87avH6g9j7dQnVhzQDS3el9hhl2YUhU X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xaRZz6gT+2e9QpfNERt1vOtHMxc/f6y9HAVLeVPv12alz1HjfKSncqBu4asE?= =?us-ascii?Q?wMUXlfnoy3jNMh+WoVSYZDkcGUMC5OUyhEEu0LkNQz5E3P9msKEKjhS32BTV?= =?us-ascii?Q?OgHFd61CRqv2LJ/BqyXfFwNxx74QfTqqezBDxPKoGq3xE9lXIEMLPBi1Zohp?= =?us-ascii?Q?DvN9RYTnhJec8c6kyWEAWXKp3u+bU3Z1OmWkf6NmowdVaxJ8NQjGfEyjWi0A?= =?us-ascii?Q?Yw+1gcG70lxFyWYlHXO/5611Ia51PfEMTNGB7fyzMnK6szHN/3XQjtpeBD6p?= =?us-ascii?Q?b+k3x4Pbn8kKhbcoTFrtB8xKxHkSnbrYXB2G9Vm8VesKultfycKtKpM1gogG?= =?us-ascii?Q?xhtBV1vBCMlP4gKPgFh9G3BeiNaCNwSwBvmm9qT3EzMfYPupFYogGAJ7w+kd?= =?us-ascii?Q?P4Sc8NlgjV2aKzAjbu5BxR3rBTkxcR+w3ur0IzIOkB8RPnJ4U6XaAPQACJ6z?= =?us-ascii?Q?HpHKBB/nOKnId2NawtsOi320jOI1AmBSfkrmmP0Vn/OPQDk5nYpTdn12oWnV?= =?us-ascii?Q?NQUK5GN+tjkJZcyvLxRPlK5p0uGohUyas21VJ+8HQojsCUEAhqi2A0J3n1w1?= =?us-ascii?Q?cgBkEOH8QHr7JaH6IBcCbjghUasFL5ndOakB/l+mXzPOHt6GPtxp1ath08kw?= =?us-ascii?Q?ZCaZC1xZj+v9HXWOiLxHRPlBPYrLUW8JLQm+6I3FshSK77fmCOaCim95Ryoc?= =?us-ascii?Q?nSlKd1kJvM3KpTBWVACLL4k3ZievK7F8Bv5F2r/f4cp/1r4xPGVV+2/9gwG/?= =?us-ascii?Q?gfG78PF2RG0yRoXj2jIUbjB2vp211fbSf9kypIAiboBvWK7Vdr65485RYyET?= =?us-ascii?Q?Yu6VMiKxxINPprYkSdzGE9o1FeuRZ/rQu2q0xW+fsiTiWIsZwfgOlCSbMOIh?= =?us-ascii?Q?DRpVnw9lxZhdogFyuVJM8sH2l/LpeVhXpHIX//r9SXNuGU3ZyL72DN4LHIUV?= =?us-ascii?Q?/lykyc04fYH+0VOn6XEVAV1VOzXCm7caSwZkDwDLJKOZwoHwSKc7DPLbX0Ep?= =?us-ascii?Q?a5ARK+fzl2Nyozq6iayHIlJ/OBERSc2+dLpWq1o0cRmeEFt4LgLFd751a14O?= =?us-ascii?Q?lm7ph78Ie+CHd01TJaN7b7yjsChMUgJCZ5eQGlWA9aN5Qias+PuNqB9azHrW?= =?us-ascii?Q?NGLDR2tQBjk5Hvbj6m32BERqH+b1qKO9hFlDBTWDTyR4WdJ16bq0NmeTz3Jw?= =?us-ascii?Q?TQrPfarGVDoHSr7dl2djOCTe9echTddFxY4IQde0StXiuYZeTvXlm+Ps5hI6?= =?us-ascii?Q?azXOisWbFrXAez6b1b05POqi21IW8CAp/jhbhDOK+VfKDQpm1CNISmDMIRjh?= =?us-ascii?Q?XjS6P4QKJ0UPhtIqVEXQD6CjCW9JPXBDJC/yU5ps745F1pmvWTPCOpTdSytW?= =?us-ascii?Q?GY29FI8cgTI+R6XAgNtyL4vjFYbm2iXsTOdUG1jJP5x6+O+M6HvHxMpAoP66?= =?us-ascii?Q?Q/lJo1lvKJ0bDYFEONh9i1rdsoLK5Ln1OkRJnq9QeK1s+qcr/Zv6tRtaK+B5?= =?us-ascii?Q?lB72dZkhFYdBcq9zsTSR6xVQ1Mhx5F/S975MuyMBbrZTiFwcI7k1a3AQ58M0?= =?us-ascii?Q?/G6QwBnNcn8b0YBJl+lWEKEE/I+N6rNB7kSsYwFdo+xTFf+SXdIqPFkSAEMo?= =?us-ascii?Q?6kQwZpGOq5JdJIlwMhpGuiVUfcCa6GV85FK7fIRndrkwGWCd5aIeYW/kt+4l?= =?us-ascii?Q?cRlZcqKiGVC90v14kdlgnOp0fHfAnh3t+6fJUjZq5jM+1dEBi6WlfguQCfs6?= =?us-ascii?Q?edI8Qw3OpGcRys43MkYIVwqkttrSn2WfrJBPuQhCesfR/62uB+fj?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 4f29e283-0a2d-4665-4a33-08df123cfbc6 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:44.3035 (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: NJvioSrcn9uCbLXcbF19pfsFMaQbVtse2LGnODcyvMFmdvr9twP0l6q7DGRtmKvwqx/LHdHG5opCpCQvg5KHvQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY7P286MB7153 Content-Type: text/plain; charset="utf-8" RX entries are added to rx_post_q before their fields are filled in. The overflow path sets DONE without a write barrier, and ntb_complete_rxc() has no read barrier after checking DONE. A concurrent completion can therefore consume stale entry fields. Publish DONE with release ordering and check it with acquire ordering in ntb_complete_rxc(). Use the same publication rule in the copy callback. Fixes: da2e5ae56164 ("NTB: Fix ntb_transport out-of-order RX update") Cc: stable@vger.kernel.org Reported-by: Sashiko Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260904052134.29= 70111-1-den%40valinux.co.jp?part=3D3 Signed-off-by: Koichiro Den --- Changes in v4: - New patch (Sashiko) drivers/ntb/ntb_transport.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 3f497a62673f..b69e8ac8047d 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -1443,7 +1443,8 @@ static void ntb_complete_rxc(struct ntb_transport_qp = *qp) while (!list_empty(&qp->rx_post_q)) { entry =3D list_first_entry(&qp->rx_post_q, struct ntb_queue_entry, entry); - if (!(entry->flags & DESC_DONE_FLAG)) + /* DONE publishes the entry fields and copied data. */ + if (!(smp_load_acquire(&entry->flags) & DESC_DONE_FLAG)) break; =20 entry->rx_hdr->flags =3D cpu_to_le32(0); @@ -1496,7 +1497,8 @@ static void ntb_rx_copy_callback(void *data, } } =20 - entry->flags |=3D DESC_DONE_FLAG; + /* Pair with the acquire load in ntb_complete_rxc(). */ + smp_store_release(&entry->flags, entry->flags | DESC_DONE_FLAG); =20 ntb_complete_rxc(entry->qp); } @@ -1664,7 +1666,8 @@ static int ntb_process_rxc(struct ntb_transport_qp *q= p) qp->rx_err_oflow++; =20 entry->len =3D -EIO; - entry->flags |=3D DESC_DONE_FLAG; + /* Pair with the acquire load in ntb_complete_rxc(). */ + smp_store_release(&entry->flags, entry->flags | DESC_DONE_FLAG); =20 ntb_complete_rxc(qp); } else { --=20 2.51.0 From nobody Fri Sep 25 10:38:23 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020084.outbound.protection.outlook.com [52.101.228.84]) (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 F3D34414423; Mon, 14 Sep 2026 08:48:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.84 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375734; cv=fail; b=SFryPUkPCs30ANfI7mUPPhEumWvLWetAacH7Des3X41191AjMfbeOEOwDX6pyIXi4nX9o2HnmP5x9j6j8nb2SXpr8YgWZox5v+sbKu5HxQh8GyJagICQN5VMT3WSCxynoG8M+/6frGzVYJuyKrQ9KMF7WP0W7GDF3+UWudIX618= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375734; c=relaxed/simple; bh=fi510pSp+tU+IMhlqPLkFICv1DddkIlQ98KiZsAQi5U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=SVfhH2SssbCmZLu1/dbdrtcKgbZvR9JdOs3OjFWelL6m8Y7VxIanRtO80LV8gLoIhocEBpI9Tp/uuy+rgBxnC8l99wjzbChsFN7UihIP5KUcj8IRBd4UGKJwda8h0lFBtYm9JuGI0v+mQsUBohd+yBdwIRtQS6ZnDV5BFfYTPX8= 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=e3ZEekxP; arc=fail smtp.client-ip=52.101.228.84 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="e3ZEekxP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NSyidUlukCbcX3g4oeQwSgAxcFQhOU7vjl44B8ibZYInu3s4XPBxyK2NCjjudM9KHJA3oJlzC5ZUOhxXPmMIWzW5qtV2axukCqU4mHXeXjk/vntCB2n8u0OMyv0dzD7JP4r9/2R7e9vsPy8vgXLbMq4Zu0L5c5N8XYTYfc9fuPRWCTyAkNKGh9sYZZ42kWFiVm7iTH1TqneP5paEqniIY22Qm1ByDtEewkgsFCNZHKwDZp31m+4l7B20H6yfJ7hAPI5AeQjNQ2QCDS8jA9wC7pY5K1FLCoc4g7bNRESSsUlMr1yz3uydBSMEQVdcVpuTIvyniKfO8sC+yMSc7USVuQ== 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=53W9iwXOiV+CBicmeKDEiC9Sh7YvSqQrgXXpO9Qyl8E=; b=uB7QpC9EYB/JYsgxk06Wubkt4H8d7WQ52UKL8jqy/JosD79DbhBL0tFOkLcJAxjhqD7pAlNvJZLYqDg1g4REXo3aAC/hzCF6GnVBuDx3T/EWXq7x2Kg8XmJnzAlHP501QgGqBGL+fnwdcyoHOAatjhp8d2QSZ8DSPj70MWXG+lUQNAySCa3Urw/li4wbnrwHu0iDBy2oEESEXHrrPvppVaJbkODD1DFg0ZDtbPx/g0/skpJsHeKkcvqVd0uyRMAuA8kQS5islS/NKe2Ja2ilvIZOYsqcH9fcTL6i6GrPUrW0GQj1aE7ENkB125oI8ti6ip+Go5MNDxfhYfMooI+kVA== 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=53W9iwXOiV+CBicmeKDEiC9Sh7YvSqQrgXXpO9Qyl8E=; b=e3ZEekxPm49erDUGaUX7A1It2cUwZ4UgFOB8GQZqBm2vybDAQHRvsdQaiqCk8egflbCFo8RAVZ7vBPIrv4HnuX7Q0v0DQRSITzbHcKyRMByi0GOc9I/dq4agtY3xB7zjc9xQJG6zclnDENkhfeKKKaWNtPYD0ry9w5PLQ4A7uNY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TY7P286MB7153.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:326::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:45 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:45 +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 net-next v4 04/10] NTB: ntb_transport: Keep local QP link requests separate Date: Mon, 14 Sep 2026 17:48:32 +0900 Message-ID: <20260914084838.2158249-5-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0179.jpnprd01.prod.outlook.com (2603:1096:400:2b2::14) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TY7P286MB7153:EE_ X-MS-Office365-Filtering-Correlation-Id: 87e05c90-b0f8-4cb9-19bc-08df123cfc52 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|6133799003|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: T7IrJZBTEQWhf7TBUGUbbRDHmOhq0pfmIsO+0QhCIGWGE1e+wDhCAy9RkaKwURSCQYTdS2cBT/j3oszqC/pjtdpG4jlKP48FL6IXZFNvgFJLOocDvMfI3iy8IeLhw0Ces7ohQSakbOcLFTsQ9zC/mUtgYj96cCPCHG29lDrJgfYJuBHSeXDfiiO889VHetpY+QSsE3XIirgANR7SkS2uLqJfvjqD4J+BEHt/xIgbzn8ephxQw3I8YnYh0YXoXlv1bdjeHOje4CU8vI3Oe16wwPTq9GkhTuJKcEjOu5gcTMsyKONHiTnwnegPl4/mQQMojHtsCTaXsfs2/XsBz6FU4GOS0EwzF1g9w5HpCZHE7IXoEaN34+GXA8R6kRgmPnkaWXHllebFGwukFvsLNOBV5+PFYRIRO9cHKcBZrlossg9SOTA3DLFVMepUnSy18Mzwv0puHvMbn6qCT7Pa0SylCw2pYNLTX+cH+pSsbbtk+OxIJ9nXs/vYBb6iIP1gABEjYmqIzIoFOAN3rU/F+k2jo+GZWymtDD5QSFDe0EpCZwhTGyJt36ZoWPsdlGeO4cOaS6NlPnhgdy4GKimURPCXsHZ8sV+H1wxYoaPEGsZsC82u9T8hbbJaOjG0XT5/bAIcjD5dHTWriCTV2sltEf0TtMIyOQ0Pr8Tz5M0Dz1cwi9E= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(6133799003)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Puc6Z8J1lTpUqVo8b1Hsb0WWKEAiARL4Son7ocKGUfuvg8j78QPIwwbxyN4D?= =?us-ascii?Q?tbI5cERkBGKStTEs6UQXQbwm+gmWmx/DpWwV8nUj0lIXBSaOPeVETweb3Ni/?= =?us-ascii?Q?5Hzb85raM3/7FuBsM1wTEJyWWyo+QXNpVq5OYpO22JYJFTHzfe5HVQ576sTT?= =?us-ascii?Q?vgn2Eh5a0Jjrx+k5x5cSncvZWKwiMLr1+XOkmpa/puksaJSjiNmBELZrAHAU?= =?us-ascii?Q?PkEjXJchAJf6OkrthHuW38O2hL1PwsQ+CdSMuxXynj01mg9BcE7CRFT0kfdb?= =?us-ascii?Q?AzNQlB7vBHNYt11sHuvbSOkEfAmlAusEBBl4s+8pO9eNG6Tr4+RdmShB6wZT?= =?us-ascii?Q?Z3vqOG2U2r5ZcjU6yTrYI4+Q0/vwvDBgicpU543PKELpoYi2zA/haaFfZyK/?= =?us-ascii?Q?+cmO9Hq6dBfECVDQ6//o/SWxorBSRBTLMbmXITtk/0TALylw2LB5mlATus7u?= =?us-ascii?Q?/u94Z7yHFdyMeNJKh6TVtaw+IaEh3b8jx0o6ww61x0Yr4lIkH4wtROodSDr9?= =?us-ascii?Q?nJApTMq3Iw+mPIaIk/mxA3/ik9f57/gAJtEpGt0CA1XuDgOYCc/9FtsNeoIV?= =?us-ascii?Q?gn5N15ekkC6fJW0CoNipn9qEa42q065/t+GF4So7EMFYA2mWwqmWiOk/3g1B?= =?us-ascii?Q?gPwoaFjwo1sXNiz4xUd6ZcyHXfTsy1Dz9u3d7R31Uq1ep6UclyS6cBOtHwPP?= =?us-ascii?Q?MrX9tAByKkVI4ZitJst5fRA8z7I94bC//ihZuNkbmYjP2P/M/TIUMDXbRCGX?= =?us-ascii?Q?p1XGmTwjFWCY6PVtkYO+sanfeUnEK8UFdFQqZLZ9fPkyEti6/neWPevSsE1E?= =?us-ascii?Q?4V/ChW4bja/sMUlXpKpyFzXAVdvrx+bf4trMtXjl7SLu9mgo7XnV4p2dASzf?= =?us-ascii?Q?QK+nB0cgy2gcz/Rv+7dbBcKtFkCjQD4tigyLE0NHA/Rlb0ASQzazStP0Mllz?= =?us-ascii?Q?NODuCOyfggPQPcbTigVgxC5j8QnyA3+JMuGOpEwRIZfnHDbavqAXH5ptzNlo?= =?us-ascii?Q?pjXbcG+krZ4QhgQmXmkkYX2gh5VmMn+uQIcZaJQUdrBcjq7Cmxi9rq31xpPA?= =?us-ascii?Q?YJ/+Qr0CRvFnZXZV8a477wYZmTgUmEsC5lTSuoMQa0fHqpuJASNWJwwirxBm?= =?us-ascii?Q?SWdLrJX8qkim+HVbmnoRQZvbpP6Zy1G7kTxdlTOo13Ec66VroJjFK63uXyS4?= =?us-ascii?Q?v0/hbnBhZ6Z6DyoUFkWfoSCc4Gpj5G2HEfe5d+vGqI9ihm2w7ZHTvuNkFCSK?= =?us-ascii?Q?s+gXDeYFL5cA4Y+M7Dl/4ljz7Y0LP+Rr6D0Ly73GCQ/ADtKSTCVR+6J8Jg/C?= =?us-ascii?Q?Y3AlOH5oEz7/UyzwJXUlWVSoPDralKHtC1b053TZxQL7ahm2m67hP68xAbmp?= =?us-ascii?Q?T+4gG8CfCpSuACtY5wrI+86i/GB/mJmztn0csLiH1BRgPQZ5mHDdXycdxEz5?= =?us-ascii?Q?vr5IHVzhYLw4vT5NpcGFu+r4tF6s9Hxpr4LctGn7/qRgW/Oe6bcb7HnhhhkO?= =?us-ascii?Q?iwOjAEd1wDz6VEEbEp2Lc/UcbLPRvbuKFmJluFs5DNvCabIa0id/JyCOIoHN?= =?us-ascii?Q?oZAkBzw3nv1sHuVY33GaTCdGwiUaFMRspiUecRc3ZU8zvvA0/LGL+7O5CRfZ?= =?us-ascii?Q?E2iWs8ugMdD6WWxmRz4luhQ9umrwnGNK253Nve+gZfYEjPs4fFnzxzgd5DUb?= =?us-ascii?Q?42krnRe/w3WToNGTOcy0h/TlS1/3Rl7Hlz8Nqtbwgkaqm7JLY37vSFWXUryP?= =?us-ascii?Q?fxuuZg5cn4jFrylDI699XMhQXmy46VgxpzdRW/HTVhINbWA01xof?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 87e05c90-b0f8-4cb9-19bc-08df123cfc52 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:45.1136 (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: WhXC2Ge5VzI+/47KrX5rCrE6pZtRuljMybA1oDFcFSpyOCeBQfilYPLjhAyT0S1r+MjyMkDFMCCC6X/8SYxTpw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY7P286MB7153 Content-Type: text/plain; charset="utf-8" The QP_LINKS handshake is a smart way for both sides to converge on link-up without peer SPAD reads (MRd). But copying the peer's bitmap back mixes up local requests and peer readiness when multiple QPs are used. When QPs are shut down back-to-back, each update reads the local scratchpad and can restore a bit just cleared in the peer scratchpad. Likewise, a peer's QP1 worker can echo our QP0 request before its own QP0 worker runs, making us report QP0 up too early. Keep our up requests in a bitmap in ntb_transport_ctx. Serialize bitmap updates and peer writes under one lock. Clear it on transport cleanup so each QP advertises itself again after reconnecting. This bitmap handling dates back to commit fce8a7bb5b4b ("PCI-Express Non-Transparent Bridge Support"), but ntb_netdev multi-queue support exposed the problem in practice, hence the Fixes tag below. Fixes: 24d9e73c7e00 ("net: ntb_netdev: Support ethtool channels for multi-q= ueue") Signed-off-by: Koichiro Den --- Changes in v4: - New patch for a pre-existing issue found while preparing v4. drivers/ntb/ntb_transport.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index b69e8ac8047d..0b47285ef48b 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -244,6 +244,9 @@ struct ntb_transport_ctx { unsigned int qp_count; u64 qp_bitmap; u64 qp_bitmap_free; + /* Serialize request updates and peer writes. */ + spinlock_t up_request_lock; + u32 up_request; =20 bool use_msi; unsigned int msi_spad_offset; @@ -976,6 +979,9 @@ static void ntb_transport_link_cleanup(struct ntb_trans= port_ctx *nt) if (!nt->link_is_up) cancel_delayed_work_sync(&nt->link_work); =20 + scoped_guard(spinlock, &nt->up_request_lock) + nt->up_request =3D 0; + for (i =3D 0; i < nt->mw_count; i++) ntb_free_mw(nt, i); =20 @@ -1113,6 +1119,21 @@ static void ntb_transport_link_work(struct work_stru= ct *work) msecs_to_jiffies(NTB_LINK_DOWN_TIMEOUT)); } =20 +static void ntb_qp_up_request(struct ntb_transport_qp *qp, bool up) +{ + struct ntb_transport_ctx *nt =3D qp->transport; + + guard(spinlock)(&nt->up_request_lock); + + if (up) + nt->up_request |=3D BIT(qp->qp_num); + else + nt->up_request &=3D ~BIT(qp->qp_num); + + /* Update the peer's view of our requests. */ + ntb_peer_spad_write(nt->ndev, PIDX, QP_LINKS, nt->up_request); +} + static void ntb_qp_link_work(struct work_struct *work) { struct ntb_transport_qp *qp =3D container_of(work, @@ -1126,7 +1147,7 @@ static void ntb_qp_link_work(struct work_struct *work) =20 val =3D ntb_spad_read(nt->ndev, QP_LINKS); =20 - ntb_peer_spad_write(nt->ndev, PIDX, QP_LINKS, val | BIT(qp->qp_num)); + ntb_qp_up_request(qp, true); =20 /* query remote spad for qp ready bits */ dev_dbg_ratelimited(&pdev->dev, "Remote QP link status =3D %x\n", val); @@ -1361,6 +1382,7 @@ static int ntb_transport_probe(struct ntb_client *sel= f, struct ntb_dev *ndev) goto err2; } =20 + spin_lock_init(&nt->up_request_lock); mutex_init(&nt->link_event_lock); INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work); @@ -2412,16 +2434,12 @@ EXPORT_SYMBOL_GPL(ntb_transport_link_up); */ void ntb_transport_link_down(struct ntb_transport_qp *qp) { - int val; - if (!qp) return; =20 qp->client_ready =3D false; =20 - val =3D ntb_spad_read(qp->ndev, QP_LINKS); - - ntb_peer_spad_write(qp->ndev, PIDX, QP_LINKS, val & ~BIT(qp->qp_num)); + ntb_qp_up_request(qp, false); =20 if (qp->link_is_up) ntb_send_link_down(qp); --=20 2.51.0 From nobody Fri Sep 25 10:38:23 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021122.outbound.protection.outlook.com [52.101.125.122]) (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 89669414A11; Mon, 14 Sep 2026 08:48:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375736; cv=fail; b=JKMDrIsRC6Qu35gn0xEeEixMSGPKafXXDWeVGLT755L8iIF5sUZnaWvrmTD7deI97z9AyUdQTX7AAsgIVx8BQO0ibaOPRvP6hjltMCVPqdqwb5coUvshb74BdLetHh443DXUc/iASLRf71plLjdv7l/M806+dKl7IHBFROXNkJE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375736; c=relaxed/simple; bh=Bm6igc0MXhNi2xfH6dqLngZKbktC3AhZb0VTk9OIfYg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=pryg+pzJhbIpMmDBTFyFMoSlzcjBMdf1iFUL4Rnh+DeL0+dOIPkpLFREi8KAXP4q1ObJUQ5rxrJeXVQa4JswXnx5dn/ysKkH8AhLwcwpLZxNi+GWWJbNUILQRfXZpZFALWBGlysiUKMTYNNGMGzZ0y9oumCi4Rqw3D24TTruTb0= 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=XBGzNu76; arc=fail smtp.client-ip=52.101.125.122 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="XBGzNu76" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JCmN/fdLFIIvxwgm+r/yg2ouKCpqLfN1PYvVdMUCwj5sIFjI9iHdaQ97upJEt+FiJK9ULJ2rFB76q/tokc87kOxm2l8ea5DhfA1TCIG0ccaXlxi16ZTMpx4DPQ+87w7c79iLcpbDOCt90q1cuXPS5QTDhNPKJnTpvhwHT5lZBNLwqnwukQCGmUs8S2ihqSpbO3Ex+1rPYvrkz4lfmt3U3xrZ9epLNwVl/4LCyo8Pl34bAKDfbCwqiHeHJPHsNs2ktH61mtw+3byGI/sHmjjAaL3oz1NbN4i7lKWjr2XImYs/veJdBwU2fBp+74TGCbkJdkkXtcz+2LXfB0wBBJRLnQ== 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=KQXqe6qohQtFrBGyA/UUHmDwrR6Rn99WWy9HU2mExJY=; b=nSaYqokSKCoQfu3gvr+Vm1Y/4KF4AnMhFkqMjRGFRYhXYqsoe1reuHwlYa7GCwqiu/DTELukoofhbc0Y5pBOUDRa2OhIZ6vEXTRDm+FcgVr0obIDKH8HtbK+HUZpyazzvMbJfqBREbcPmo9uJGPsJXjrUgsd/9nRULmpQc4vO37zBmx83eui342fr558Yjh0YkO1ZC84eiC+r5y/jINL//VXycc7CnBsVj27yQ1GgDo3RaQtpqDittlKHuDOe8+8wwwr+6/W2rymHP95J1Oj5RlLKIBQ+bV1ihvAHBLCpqS+ttrWZpMKiAxmYzNDBCjW1K8TdY4L6oezKiZdZjNBug== 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=KQXqe6qohQtFrBGyA/UUHmDwrR6Rn99WWy9HU2mExJY=; b=XBGzNu76uXpAuQjUyj9sNYp7/iY83RRVo1TwmVwfycaHZHcdINsyH7LUjMZVkfw5sWWgKF+dDztHjrBFpQzXU05Ie7RqeOfQlIxk0SEumizEW4TMl/1+VvBO2B1V9xXlqsMD2o+L6M3RM1qAzAI4nbKCFMUQaXdmbKWJSrEkJnw= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TY7P286MB7153.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:326::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:47 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:46 +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 net-next v4 05/10] NTB: ntb_transport: Exchange client capabilities at link-up Date: Mon, 14 Sep 2026 17:48:33 +0900 Message-ID: <20260914084838.2158249-6-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0179.jpnprd01.prod.outlook.com (2603:1096:400:2b2::14) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TY7P286MB7153:EE_ X-MS-Office365-Filtering-Correlation-Id: 2df1f887-c6a4-4c4b-1dc2-08df123cfcdc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|6133799003|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: pZDeO/j3rM05LHy4cM8PCZdXl+7OnqWSTxTgJBiEOXYE6+SjxlMpwZ8RqWw1glxdqtTLiBuL9PimOlcP6m/XLVvAvLrPxEQ5kQiKSLvR1z4Scz8XOEoOKKXlWbv+MDyC5n6Z5zDjWqF/nHL7cj9G7nb2iQZ8pP6fhuxFp/wfYE56AFeg+G1wQi2Mp32r2X+wQ8UMLVoEmNP4ZpBR8atLwwv4hhwcXlV79H6TDk8aQ80l6AcExtu6HojtSsWn5RSo22+kn008rl6xDZ++Cg6meGbq6DYWn4GaU5u+bKE1dqYS1t3WkLT8WHOjwU9RN+mJc7V9hpLcqMNiKUDcaXt3O/OpwW3Grk0CHHlfUGRQlTd5grplSqZ6EC1XY05vJ9w9mbiF5qxEvGsdl+Hy93PL/WkxG0UH1L4tiU8gkfKVMMbrWZ7vqF9tLiu39aIDq6DdwGrOVQ/SyCXKEY7pDut0RWMpvYm/plfOlS++aZ+JpFhobHug+wwQDn5X4gPlt6ro3XaFd/EnqBkLjUVTwjvN9t+yK0oOUvt6n+DQfISR/UODiMnmdZSLrEKqQ0umyGaovVwpaIYM3uLDPQ5EKdj3kfE1ziWkyjbSxhjE9AId3Zc1awc2mQ9WqiP8BptqWmmOJ3P7BBb0I7jgHqbJh6lEoz0Wp2xmvcItZnLNCYz43EE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(6133799003)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?nc8XgnmYHRqjaZwSJwLFnAGL33nh8X9h+rdNALtz2JuNy5vAytkmrkTs2OSf?= =?us-ascii?Q?vSftFGzSMAp5gXGG3+AhsVMYWCopujFKK0Eht7UpAEO6RyP+F/tyn0I/lc3u?= =?us-ascii?Q?X4hJOvH8VwZEEfgq+ZsXk6u+o5w1hSSecyFciYpFBlE+KTicSIUl4lJuM/p2?= =?us-ascii?Q?6jmPuuXDjjALUko+8HW+eekQBCgDla4Y5+6Jhxp0eD+vx4mwnnVLVaVMpfB3?= =?us-ascii?Q?4A7q2gmo10yIvOTqrI4NPY4AM6qIlSI7kN5H+JM34ijpxVJYSB6PRKfko3o2?= =?us-ascii?Q?D16DJu76MMwoBlbBMfffT5a//Y3F6I4YObnkiM5d5yOkGbiKbIappm0veZoK?= =?us-ascii?Q?5jts8656Pt7EI1SU9g/TL1y7WW6y5vikKshiXf1eysPjz53HSP15CpLk74BO?= =?us-ascii?Q?dpWRHNMYC2Mnp7FMjKUIu6R++fHwpsfr85IEL1bnIqgBvLKzJqZwGbbKHueg?= =?us-ascii?Q?y8wkoXmjku6m9tEoqVqV5tLfwZp6EXzCg9Za+Q+udsIOfvQ4Nog8jE4vvyYT?= =?us-ascii?Q?T7ztOxxgAraCm9+ndyUtjbvt9p3gJAaTTBwNiS69twU4ADS+gEyMHiFqTifr?= =?us-ascii?Q?KHOg2NaxGhyjHXhMV8mMj4T5W8hEFj8rfS4kkc81FlBBwtGS7jc1Dxmtpqbh?= =?us-ascii?Q?F7xBKIK9pK2HqgZvLNsUrnLnTicbUlvj10JLQHjR755kEiihJhudyNnbI0Y0?= =?us-ascii?Q?LOesDTQc1AdkBpthCY/gVQ789K7uDxVzmxh5x5jK7zgjnEH8RwqP4i5d4jaH?= =?us-ascii?Q?i5lthzwCCTyno8t1cWyl1zt57tUoxQWvB2ILhRXS8kKN2d9EgViV9/45P7I3?= =?us-ascii?Q?HcqpoeqV+zKjjBu2ILtbWcgOD6sBn3GrO0ryeMuxrqZ9Vj1EyLzqono3gSWt?= =?us-ascii?Q?MxaCzqyQL8osKAL+2TCHhJbUiziX3qWQ6mb7D3IujtbCm/GrRsclXLX7g97n?= =?us-ascii?Q?PyrpfiI08FfBm7g1XTjjzrE2dzsKMy6q8UY5M+OGiSbv49KD0S4+TJ2RmBha?= =?us-ascii?Q?PV1jRn7zZraPv4Ww/DFzgNUV9DxA90ougg0gWGSYu2GK6VY9z0sIexlhRIb9?= =?us-ascii?Q?Mba0W+XzaQQWgp0eLHX8wsSEOidJUa4WgDLz9peiFeziexdPB4m/ZbHdbDOc?= =?us-ascii?Q?BPXh65PYOjSeSMX07qb4Ndca+8S5KfuI/EPKFp0GYi/Q9qFNArWNip3IjscH?= =?us-ascii?Q?XjoTevHZ/G4UvoCSr1Tq0pwMjcBWu61Mhr4cDwffEfPmaIyWSQpiYShGCHX1?= =?us-ascii?Q?/NdoBtt5KxVbp2CS4RFEYBQitRO8nuiptSEQV8wF73o8LuIztFIFuAX/X9hK?= =?us-ascii?Q?LafximMlXp643dx8Q5BvOPBv2tEtDsNaHy+ZRjxpN67WxxBfR5BX3feXQt0Z?= =?us-ascii?Q?hH/TiTdyNJZTp5o3maLHf5W5q8Hvs8Vhz3Q2bHfAXaTlmBcab4AoD6cnkajT?= =?us-ascii?Q?VtelhfvIalUlhmqwFjSyhpo3Q5jllQUhluRS2sSwmYJcFOrZUNEP2RBXi4wW?= =?us-ascii?Q?F1E3aQzvhtz3OF47va2IpSczGKELVHcy49PDkeEGf6stfgGv0MAeHOn4yrvW?= =?us-ascii?Q?kdE1udfcB36apSFPrO6RQYf7yDh1C7Or/rksxED3zAVh6mv6wezpE/33tmhK?= =?us-ascii?Q?/rcEBYCVBmCaFd2K95MT4KEmongX+AG9t5+XtloBWQOynw/TqqJSPOViaLD6?= =?us-ascii?Q?h9Z5ecyyLCPgoWdLxkZj4NCoUzng9NV90+74m58MqRzy3oa7GIM5zy28j8YU?= =?us-ascii?Q?lKDmksBKQTS9AP43xKj5EMP7fEKqjDJVr50rYF5aQ9fqN6S5flkW?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 2df1f887-c6a4-4c4b-1dc2-08df123cfcdc X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:46.0597 (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: Z9R9NSGuf71imX0zDM+FqkJ/Jwpa78NX7ZPivO1oVYqAhnZsVl8NxJ/mxIgKZSVIb6lSnjYMa4LP0/1WKn8RRg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY7P286MB7153 Content-Type: text/plain; charset="utf-8" Clients need to learn peer capabilities before sending data. Exchange opaque 31-bit capabilities during QP link setup and pass them to the client with the link-up event. Use one scratchpad per QP after the MW sizes and MSI descriptors. The top bit marks a valid advertisement. Write capabilities to the peer before advertising QP readiness. Read peer capabilities from the local scratchpad once the peer reports ready. Clear the local capability scratchpad at probe, not on QP open or reset, so early peer advertisements are not lost. Withdraw advertisements on link-down. The existing transport link cleanup clears all local scratchpads. The transport version 4 layout is kept as-is, including MSI slots even without local MSI. Report zero capabilities without extra retries for legacy peers or QPs without spare scratchpads. Adapt ntb_netdev to the API without using capabilities yet. Signed-off-by: Koichiro Den --- Changes in v4: - New patch to address Sashiko's feedback: https://lore.kernel.org/r/xsaocp32a6siggahziu4jqbwgmdasmp6v64pd5aujfkox= hiqws@n5luestlntzc/ For reviewers: we could also protect qp->client_ready and qp->local_caps with ntb_rx_q_lock. I find the current approach easier to read, but I'm happy to change it if preferred. drivers/net/ntb_netdev.c | 8 ++--- drivers/ntb/ntb_transport.c | 60 +++++++++++++++++++++++++++++++---- include/linux/ntb_transport.h | 7 ++-- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 7a0d5e892a1a..869fc9a7f9e8 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -101,7 +101,7 @@ static int ntb_netdev_queue_rx_fill(struct net_device *= ndev, return 0; } =20 -static void ntb_netdev_event_handler(void *data, int link_is_up) +static void ntb_netdev_event_handler(void *data, int link_is_up, u32 peer_= caps) { struct ntb_netdev_queue *q =3D data; struct ntb_netdev *dev =3D q->ntdev; @@ -346,7 +346,7 @@ static int ntb_netdev_open(struct net_device *ndev) netif_tx_stop_all_queues(ndev); =20 for (q =3D 0; q < dev->num_queues; q++) - ntb_transport_link_up(dev->queues[q].qp); + ntb_transport_link_up(dev->queues[q].qp, 0); =20 return 0; =20 @@ -430,7 +430,7 @@ static int ntb_netdev_change_mtu(struct net_device *nde= v, int new_mtu) WRITE_ONCE(ndev->mtu, new_mtu); =20 for (q =3D 0; q < dev->num_queues; q++) - ntb_transport_link_up(dev->queues[q].qp); + ntb_transport_link_up(dev->queues[q].qp, 0); =20 return 0; =20 @@ -538,7 +538,7 @@ static int ntb_inc_channels(struct net_device *ndev, =20 if (running) for (q =3D old; q < new; q++) - ntb_transport_link_up(dev->queues[q].qp); + ntb_transport_link_up(dev->queues[q].qp, 0); =20 return 0; =20 diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 0b47285ef48b..ea89eb336472 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -145,6 +145,8 @@ struct ntb_transport_qp { bool client_ready; bool link_is_up; bool active; + u32 local_caps; + unsigned int caps_spad; =20 u8 qp_num; /* Only 64 QP's are allowed. 0-63 */ u64 qp_bit; @@ -181,7 +183,7 @@ struct ntb_transport_qp { dma_cookie_t last_cookie; struct tasklet_struct rxc_db_work; =20 - void (*event_handler)(void *data, int status); + void (*event_handler)(void *data, int status, u32 peer_caps); struct delayed_work link_work; struct work_struct link_cleanup; =20 @@ -282,6 +284,9 @@ enum { MW0_SZ_LOW, }; =20 +/* One per-QP scratchpad, with the remaining bits owned by the client. */ +#define QP_CAPS_VALID BIT(31) + #define dev_client_dev(__dev) \ container_of((__dev), struct ntb_transport_client_dev, dev) =20 @@ -937,7 +942,7 @@ static void ntb_qp_link_cleanup(struct ntb_transport_qp= *qp) ntb_qp_link_down_reset(qp); =20 if (qp->event_handler) - qp->event_handler(qp->cb_data, qp->link_is_up); + qp->event_handler(qp->cb_data, qp->link_is_up, 0); } =20 static void ntb_qp_link_cleanup_work(struct work_struct *work) @@ -1141,10 +1146,19 @@ static void ntb_qp_link_work(struct work_struct *wo= rk) link_work.work); struct pci_dev *pdev =3D qp->ndev->pdev; struct ntb_transport_ctx *nt =3D qp->transport; + u32 peer_caps =3D 0; int val; =20 WARN_ON(!nt->link_is_up); =20 + /* Pair with the release store in ntb_transport_link_up(). */ + if (!smp_load_acquire(&qp->client_ready)) + return; + + /* Publish capabilities before QP readiness. */ + if (qp->caps_spad) + ntb_peer_spad_write(nt->ndev, PIDX, qp->caps_spad, + READ_ONCE(qp->local_caps) | QP_CAPS_VALID); val =3D ntb_spad_read(nt->ndev, QP_LINKS); =20 ntb_qp_up_request(qp, true); @@ -1154,12 +1168,26 @@ static void ntb_qp_link_work(struct work_struct *wo= rk) =20 /* See if the remote side is up */ if (val & BIT(qp->qp_num)) { + if (qp->caps_spad) { + u32 caps; + + /* + * Order the readiness read before the capability read + * for memory-backed SPADs. + */ + dma_rmb(); + caps =3D ntb_spad_read(nt->ndev, qp->caps_spad); + + if (caps & QP_CAPS_VALID) + peer_caps =3D caps & ~QP_CAPS_VALID; + } + dev_info(&pdev->dev, "qp %d: Link Up\n", qp->qp_num); qp->link_is_up =3D true; qp->active =3D true; =20 if (qp->event_handler) - qp->event_handler(qp->cb_data, qp->link_is_up); + qp->event_handler(qp->cb_data, qp->link_is_up, peer_caps); =20 if (qp->active) tasklet_schedule(&qp->rxc_db_work); @@ -1189,6 +1217,12 @@ static int ntb_transport_init_queue(struct ntb_trans= port_ctx *nt, qp->ndev =3D nt->ndev; qp->client_ready =3D false; qp->event_handler =3D NULL; + /* Reserve MSI slots even when only the peer might use them. */ + qp->caps_spad =3D nt->msi_spad_offset + 2 * qp_count + qp_num; + if (qp->caps_spad >=3D ntb_spad_count(nt->ndev)) + qp->caps_spad =3D 0; + else + ntb_spad_write(qp->ndev, qp->caps_spad, 0); ntb_qp_link_context_reset(qp); =20 if (mw_num < qp_count % mw_count) @@ -2409,15 +2443,22 @@ EXPORT_SYMBOL_GPL(ntb_transport_tx_enqueue); /** * ntb_transport_link_up - Notify NTB transport of client readiness to use= queue * @qp: NTB transport layer queue to be enabled + * @local_caps: Opaque client capabilities in bits 0..30, unchanged until + * ntb_transport_link_down() * * Notify NTB transport layer of client readiness to use queue + * + * Exchange capabilities before reporting link-up through event_handler. + * Report zero peer capabilities for legacy peers or insufficient scratchp= ads. */ -void ntb_transport_link_up(struct ntb_transport_qp *qp) +void ntb_transport_link_up(struct ntb_transport_qp *qp, u32 local_caps) { if (!qp) return; =20 - qp->client_ready =3D true; + WRITE_ONCE(qp->local_caps, local_caps & ~QP_CAPS_VALID); + /* Publish local_caps before QP link work sees client_ready. */ + smp_store_release(&qp->client_ready, true); =20 if (qp->transport->link_is_up) schedule_delayed_work(&qp->link_work, 0); @@ -2439,12 +2480,17 @@ void ntb_transport_link_down(struct ntb_transport_q= p *qp) =20 qp->client_ready =3D false; =20 + if (!qp->link_is_up) + cancel_delayed_work_sync(&qp->link_work); + + /* Stop advertising capabilities before withdrawing QP readiness. */ + if (qp->caps_spad) + ntb_peer_spad_write(qp->ndev, PIDX, qp->caps_spad, 0); + ntb_qp_up_request(qp, false); =20 if (qp->link_is_up) ntb_send_link_down(qp); - else - cancel_delayed_work_sync(&qp->link_work); } EXPORT_SYMBOL_GPL(ntb_transport_link_down); =20 diff --git a/include/linux/ntb_transport.h b/include/linux/ntb_transport.h index 7243eb98a722..685dde629a48 100644 --- a/include/linux/ntb_transport.h +++ b/include/linux/ntb_transport.h @@ -48,6 +48,8 @@ * Jon Mason */ =20 +#include + struct ntb_transport_qp; =20 struct ntb_transport_client { @@ -66,7 +68,8 @@ struct ntb_queue_handlers { void *data, int len); void (*tx_handler)(struct ntb_transport_qp *qp, void *qp_data, void *data, int len); - void (*event_handler)(void *data, int status); + /* peer_caps is 31-bit, zero on link-down or without peer support. */ + void (*event_handler)(void *data, int status, u32 peer_caps); }; =20 unsigned char ntb_transport_qp_num(struct ntb_transport_qp *qp); @@ -80,7 +83,7 @@ int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp,= void *cb, void *data, int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *= data, unsigned int len); void *ntb_transport_rx_remove(struct ntb_transport_qp *qp, unsigned int *l= en); -void ntb_transport_link_up(struct ntb_transport_qp *qp); +void ntb_transport_link_up(struct ntb_transport_qp *qp, u32 local_caps); void ntb_transport_link_down(struct ntb_transport_qp *qp); bool ntb_transport_link_query(struct ntb_transport_qp *qp); unsigned int ntb_transport_tx_free_entry(struct ntb_transport_qp *qp); --=20 2.51.0 From nobody Fri Sep 25 10:38:23 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020084.outbound.protection.outlook.com [52.101.228.84]) (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 F247340B6EF; Mon, 14 Sep 2026 08:48:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.84 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375738; cv=fail; b=Lx0ZNH7gc1DJeZFKEyXPMG2g1cdS/WXeKAkvGg2svVULYugbilNbrcRgSe0+DwRtLzl6HwAGx0qDSRztewhfiUcT7vrpdbmtM8gHz+hWekz0Qz/rVpyEQbbRVGRuD6EnTrqyjlSNiCabEWAC7PXmzNrdW42SszJWXrwqbn+4w3Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375738; c=relaxed/simple; bh=E1IMZ7jSk/5Ukcv8hz4MO9T8TIkkt24vbrRmbjuuVhk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=u98dHhIAMK50XzP91hVBncHOdBwccR4itFTwhElZ4H/+RqdiMc3d4hxFSuZPBcrTswo5ONBnR5diDlxNru2H+66vi9cXgLmGUxtZ0pGlIKz3x38NK5oIB91GNR4poCIR/76A9KK4fwcMWMpBAdK9iUMDalu2yBaU64GqDVZwJs4= 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=iDwr1zko; arc=fail smtp.client-ip=52.101.228.84 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="iDwr1zko" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NldfIsSxny85zN9WTKbeq4CHe6GLTWDZBeKWNg7a3AAMUFRDq28qr0TDHLNy+wrY2lb0gfaK09rE8fxgx3uhWiDzEzXNYJnkGp5/0oyvPmOqMwS5RojjrAhIKtg7nGIujXPoGPQ+NnqpPFuDP8jnKPtPcMoGukJ0dl8N2xyePVq9JzjxQQd81C/6MT3xujmc1sb8Oo69IHJtSNo/0ZYIDZJQyAhVFQA9XoDLdQsNg+rU1G1ahB5zlHQtt2ftk+mzddpQJd3Kg8uX2rL7boQUwkNXswqNPoWwdjYC8lqqJNOh/fG+FVbDl8Ohvy5M1LFLi1s8r5qspzEDJ/fkngcN9g== 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=/SN9JisR/Uw31EEe8kLFDJmajw0Tzuu8SMbKcgH+BwA=; b=UUOJh43zbkdZHa6zoSFcSUJl+zwn/8VQGxj0VJRGGrwCGFDF7TJaxFFVA6JkuM3KmhlOtlqB3n9GwIJ+7J+pbl/ieyevnKFUrfCKQ8oJUaO9KwxAQph2EmWnrdMcUS9tSndXKJ4iLUWjceaUtmmmnIi/GVN2+oOgj+Qe63RLBjgZ1uOSC2s6VJo2Ons5x4ud7DcsnuAf2/X2kThzC/vpLkGozdczSUC/9S3K9hZ1r3duJL6jiqyT8bmqMeWI5PnxWML8N/wTNQt7UhnkXmuPCNOmOrrpFrlkW9m0MukfokauI4TrlWClHnUePF+0q0QBrV69S3YP0xb7C5dXEEH1sA== 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=/SN9JisR/Uw31EEe8kLFDJmajw0Tzuu8SMbKcgH+BwA=; b=iDwr1zkob+YvqKFQnGCMSXKePx+eoMqkdzAlOBpORhlxN4ak1KaHWwxm7ehljsXmh9fSxleUcShsIzYxRMN4iKqvjNfe23Jlae582ioOo0aoNdyKaRox+n0NLSLrMe0SOjrdAyPowHhV937kXFMjwz7MA4Wf98J5sDF7961iVXI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TY7P286MB7153.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:326::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:47 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:47 +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 net-next v4 06/10] NTB: ntb_transport: Add per-payload client metadata Date: Mon, 14 Sep 2026 17:48:34 +0900 Message-ID: <20260914084838.2158249-7-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0078.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:36d::19) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TY7P286MB7153:EE_ X-MS-Office365-Filtering-Correlation-Id: 76113446-f803-43f7-5320-08df123cfd78 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|6133799003|3023799007|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: PGwWMNbZ8fMSqbFL5S4rfBGrZVjtwLvHkwLC1ATVTyeR3nLI3kKNVCovkMAIxEnF+umHkiH7DefWQTvNeuPgRYAJrDz1o9tIyMmZBPjWIGmL+tl40F1M9LRwMoJ2P/ui6d+u+T7jf3J0SLLvUJ3gnWfjXWO6UuGYZBkQvlYD7WkdahaaOrIWbWyhknv7VICkDuSS630ZnlKSLsRDLCtSzNYNxstgTHWs6IrC+wv3XgynEnHDNv670LUPnbx+1x398kniYa1Ciym8dRhmDZWEj4njiqE991Jdzai34+Swo2SK5Bm6kOskQCGNLPoWalWz5TNKeLdb5xitaBLORY8JmMl0+pXpLYZEl8WkjzE9Ly5vP7yS6sHcKuoAbjQ2eUfP2UkDPow6zWhRkKku/9ETC3s5q5kGbdCKCcQVJccB9zhpm7oZOlpH1VGk92I3Y1xBJUqBwHo0mF4B/AKpaaYNZ5Yc4s0fEpG83EkLZne2mIs/wE7DWRL5yirHmU/7jdzD1eOTTLdgck4XyMDDRSt7HUbWoyBUIjucx9cMwzCy9jUOgsuikORh1+e2ffr762VU7NPEnf1PKE4xnfWsDPk5SYIkMWlh0DM/S46gDyG1FXwZ416p3CdHjtd3xCuPAdqCYse0uqomHJreRud9N0ZY//V9tjt++vRahSoau3YKZ9Q= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(6133799003)(3023799007)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ZJJA87uE+SSk4JlGPaOWluYKCnwjrxmd+h4t/IWke/tP/GoHY+lgSo9+sLwY?= =?us-ascii?Q?14vooRzKeYDWchPenH3bVFkQ/yiGWoRLy6WHUXhX30PBS88sMAmuL2StXO4s?= =?us-ascii?Q?OuJ/d+JUyKJ4BazSREdy+Ma8mEM6bdX6J1fyfZblKmshnvRxymubjAvluHl1?= =?us-ascii?Q?idE8UM0TiVz/wnb0C68N7wH3CkI8+eHEH3HXyg+OYpo3KCY93Q07CfYS8m2r?= =?us-ascii?Q?61HjHyWx7aBEVbxfe2htkQQ8vBEnZfo10vUmqG0xK4dYbdqm+JDknge+i1Cy?= =?us-ascii?Q?sqAhOMJeiovYP/Ti4QqsrAPUzCX8fVJg0Mp3Lk5esEZRvKcem7jJPPh0vO5a?= =?us-ascii?Q?3UuvOtn4Ph2/DGfnSl7rqHrsWaM+WXMUXa6UqpJ9pRc3Ii+4r6bYRmDOGc59?= =?us-ascii?Q?W10sTi2mbmmp/85xX6PiacmuXp2H7VjvE8lqOlgOjOxJpKhjf0cx0JLlgFAf?= =?us-ascii?Q?vntvJVcutrIVJ/4hctN5pONdsO/9CZnRmjxM5Byf7fwt/How3nfRrZjD5wkY?= =?us-ascii?Q?m8duOOJtvMgUGKREMInL3eABgX43zdXSGU9nue000uIx5v5xp8W48tP1Z0vi?= =?us-ascii?Q?wkhQtgTj1aBcRSGnC9g3SrE+m7h4311FBHdM7CA21nwhBJj0LJilR0lp/O2X?= =?us-ascii?Q?UNV+Xdgl1dkgPIjnS33B38p011tgj4g1JsDnXwznLN2PrDGua3KvbZ07hHWW?= =?us-ascii?Q?BQJLcsu2ZQ7TkD0Gf/UO2Gg69LaBeYTb3GwijCvsOvkvfeC29DD0gTzAZYuH?= =?us-ascii?Q?jOE0YNnTRc8K2ncbXIL7gtP9cYueXJlkgTsJvBSL1LtofCIQNC84hlyAX8pH?= =?us-ascii?Q?jslUtc4YyoVw2fb9GmjtlPAFmmmKQ+BidlQo9MvytqQToM6EsHJ+EL6dSY3P?= =?us-ascii?Q?axuXNzAlXvyuEEAm8UFn+jaJVFPo7qIm9HpyWOapLpLnd+acpy1yglVtFwxA?= =?us-ascii?Q?v1i1xhZChZ2Vqq/F1DA2ROq4/Qs2BVuL4kEcrnWEX9khGFVOJtwj2Tkn6wsL?= =?us-ascii?Q?yXz9/J8y2/9lF9581D1+ZqP/AZHkJsXNh+334t0fBQK1FcL223OEHqLeQoiP?= =?us-ascii?Q?Talpk7+l5MHkUfZE0ZjSDaz3QOyxondKPBvJ/Pl1ia3vHaKyiVGKA+2rWMRP?= =?us-ascii?Q?p6zXdOzgphiuWUvm4Xjq4bQUtPagMVY2AUW7x4ZbP3f/3CszyqsqzIultkJP?= =?us-ascii?Q?YoH7q5sKtxfmxDtcxaYosocot1ZJli4zLqNX2CQOMHuMjcU4ZZOkjHudw4gE?= =?us-ascii?Q?Pc60eH+u2a2VhC+lGBfVBQPL4cy4JdDnL4g9DRAiwxvCjvy+UJNNyBTtcLvv?= =?us-ascii?Q?PELfvfFKsf6j8UJpQSYfcyARXW2e46rlON1eExGtI6r9CzLeXT9n01UviN8T?= =?us-ascii?Q?Ch0JHeg6DwKfX1Jy75O32wovC1ffwN2ysqY/nPNddyDHypl4h2p5aOXcAkoR?= =?us-ascii?Q?L6WKkoxqq3uQ88MqKvOzPLKN+joB0MBBTQDyJOVjAZumH56hZvDSu6Bd9uL2?= =?us-ascii?Q?vjrIuwIwg9dnc/w3Z2gUaejXVIJ8h1N8KM2LjJEw7Id+NvSlep7rOhbd1ZWk?= =?us-ascii?Q?gQ8uPyj4HMbYhlXnK/Rzxwcfa59WNQQsge8LccQrZWGKS3s3tZ26yLcfGohr?= =?us-ascii?Q?xosXfea3o0IlOjRVkE2hyiK8EQilf7/s3VBFWLcn9mbOiheq4ITCd2pwv2/P?= =?us-ascii?Q?3uP765x2lYlIslEx0iItrruXANsNymFoJGvdRokmy439cmrvgIuFN0KKT9hs?= =?us-ascii?Q?Z4K2CoFLCoIAgBvTvfpKsZd+Y8LY4QT0yH/RdPnsNYrpRb8WkhRo?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 76113446-f803-43f7-5320-08df123cfd78 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:47.1737 (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: tfWX9NAVSlDmxE5QUQnF0xw6R4QB7Sy44VIb+bawa4VFCEiYhLFWXVPn1mMBoiIbtwes0XuaY5ULb8kzYBDCFw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY7P286MB7153 Content-Type: text/plain; charset="utf-8" ntb_transport currently carries only payload bytes, with no way for clients to associate metadata with an individual payload. The payload header has a 32-bit flags field, with only BIT(0) and BIT(1) in use. Carry opaque client metadata in the upper 24 bits. Expose it through the transmit enqueue interface and receive callback. Reject values that do not fit. Keep the low byte for transport flags so future flags can continue from BIT(2). No protocol version bump is needed. Existing Linux peers using transport version 4 ignore the upper bits on receive and always transmit them as zero. Adapt ntb_netdev to the new interfaces without using metadata. Signed-off-by: Koichiro Den --- Changes in v4: - Use the acquire-loaded flags for RX metadata and WRITE_ONCE() when initializing entry->flags (Sashiko) - Document the metadata range and legacy RX behavior (Sashiko) - Use GENMASK() and FIELD_*() helpers for metadata (Jakub) - Did not carry over Dave's R-b tag due to the changes. Would appreciate another look. drivers/net/ntb_netdev.c | 4 ++-- drivers/ntb/ntb_transport.c | 29 ++++++++++++++++++++--------- include/linux/ntb_transport.h | 5 +++-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 869fc9a7f9e8..78df47659d45 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -123,7 +123,7 @@ static void ntb_netdev_event_handler(void *data, int li= nk_is_up, u32 peer_caps) } =20 static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, - void *data, int len) + void *data, int len, unsigned int meta) { struct ntb_netdev_queue *q =3D qp_data; struct ntb_netdev *dev =3D q->ntdev; @@ -278,7 +278,7 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff= *skb, if (unlikely(ntb_netdev_maybe_stop_tx(ndev, q, tx_stop))) return NETDEV_TX_BUSY; =20 - rc =3D ntb_transport_tx_enqueue(q->qp, skb, skb->data, skb->len); + rc =3D ntb_transport_tx_enqueue(q->qp, skb, skb->data, skb->len, 0); if (rc) { if (rc =3D=3D -EAGAIN || rc =3D=3D -EBUSY) { netif_stop_subqueue(ndev, q->qid); diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index ea89eb336472..8ec798893ac4 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -47,6 +47,7 @@ * Contact Information: * Jon Mason */ +#include #include #include #include @@ -169,7 +170,7 @@ struct ntb_transport_qp { unsigned int tx_max_frame; =20 void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data, - void *data, int len); + void *data, int len, unsigned int meta); struct list_head rx_post_q; struct list_head rx_pend_q; struct list_head rx_free_q; @@ -269,6 +270,9 @@ enum { LINK_DOWN_FLAG =3D BIT(1), }; =20 +/* Reserve the low byte for transport flags. */ +#define DESC_META_MASK GENMASK(31, 8) + struct ntb_payload_header { __le32 ver; __le32 len; @@ -1490,17 +1494,20 @@ static void ntb_transport_free(struct ntb_client *s= elf, struct ntb_dev *ndev) static void ntb_complete_rxc(struct ntb_transport_qp *qp) { struct ntb_queue_entry *entry; - void *cb_data; - unsigned int len; unsigned long irqflags; + unsigned int flags; + unsigned int meta; + unsigned int len; + void *cb_data; =20 spin_lock_irqsave(&qp->ntb_rx_q_lock, irqflags); =20 while (!list_empty(&qp->rx_post_q)) { entry =3D list_first_entry(&qp->rx_post_q, struct ntb_queue_entry, entry); - /* DONE publishes the entry fields and copied data. */ - if (!(smp_load_acquire(&entry->flags) & DESC_DONE_FLAG)) + /* DONE publishes the entry, payload and client metadata. */ + flags =3D smp_load_acquire(&entry->flags); + if (!(flags & DESC_DONE_FLAG)) break; =20 entry->rx_hdr->flags =3D cpu_to_le32(0); @@ -1508,13 +1515,14 @@ static void ntb_complete_rxc(struct ntb_transport_q= p *qp) =20 cb_data =3D entry->cb_data; len =3D entry->len; + meta =3D FIELD_GET(DESC_META_MASK, flags); =20 list_move_tail(&entry->entry, &qp->rx_free_q); =20 spin_unlock_irqrestore(&qp->ntb_rx_q_lock, irqflags); =20 if (qp->rx_handler && qp->client_ready) - qp->rx_handler(qp, qp->cb_data, cb_data, len); + qp->rx_handler(qp, qp->cb_data, cb_data, len, meta); =20 spin_lock_irqsave(&qp->ntb_rx_q_lock, irqflags); } @@ -1714,6 +1722,7 @@ static int ntb_process_rxc(struct ntb_transport_qp *q= p) =20 entry->rx_hdr =3D hdr; entry->rx_index =3D qp->rx_index; + WRITE_ONCE(entry->flags, flags & DESC_META_MASK); =20 if (len > entry->len) { dev_dbg(&qp->ndev->pdev->dev, @@ -2396,6 +2405,8 @@ EXPORT_SYMBOL_GPL(ntb_transport_rx_enqueue); * @cb: per buffer pointer for callback function to use * @data: pointer to data buffer that will be sent * @len: length of the data buffer + * @meta: 24-bit client metadata to send. + * Out-of-range values return -EINVAL. * * Enqueue a new transmit buffer onto the transport queue from which a NTB * payload will be transmitted. This assumes that a lock is being held to @@ -2404,12 +2415,12 @@ EXPORT_SYMBOL_GPL(ntb_transport_rx_enqueue); * RETURNS: An appropriate -ERRNO error value on error, or zero for succes= s. */ int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *= data, - unsigned int len) + unsigned int len, unsigned int meta) { struct ntb_queue_entry *entry; int rc; =20 - if (!qp || !len) + if (!qp || !len || meta > FIELD_MAX(DESC_META_MASK)) return -EINVAL; =20 if (!qp->link_is_up) @@ -2427,7 +2438,7 @@ int ntb_transport_tx_enqueue(struct ntb_transport_qp = *qp, void *cb, void *data, entry->cb_data =3D cb; entry->buf =3D data; entry->len =3D len; - entry->flags =3D 0; + entry->flags =3D FIELD_PREP(DESC_META_MASK, meta); entry->errors =3D 0; entry->tx_index =3D 0; =20 diff --git a/include/linux/ntb_transport.h b/include/linux/ntb_transport.h index 685dde629a48..2eafb53c2c8d 100644 --- a/include/linux/ntb_transport.h +++ b/include/linux/ntb_transport.h @@ -64,8 +64,9 @@ int ntb_transport_register_client_dev(char *device_name); void ntb_transport_unregister_client_dev(char *device_name); =20 struct ntb_queue_handlers { + /* meta is 24-bit client metadata, zero from legacy peers. */ void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data, - void *data, int len); + void *data, int len, unsigned int meta); void (*tx_handler)(struct ntb_transport_qp *qp, void *qp_data, void *data, int len); /* peer_caps is 31-bit, zero on link-down or without peer support. */ @@ -81,7 +82,7 @@ void ntb_transport_free_queue(struct ntb_transport_qp *qp= ); int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *= data, unsigned int len); int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *= data, - unsigned int len); + unsigned int len, unsigned int meta); void *ntb_transport_rx_remove(struct ntb_transport_qp *qp, unsigned int *l= en); void ntb_transport_link_up(struct ntb_transport_qp *qp, u32 local_caps); void ntb_transport_link_down(struct ntb_transport_qp *qp); --=20 2.51.0 From nobody Fri Sep 25 10:38:24 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020129.outbound.protection.outlook.com [52.101.228.129]) (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 AAA4640EB91; Mon, 14 Sep 2026 08:48:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.129 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375733; cv=fail; b=DPnsR6xiSfhV26uxogEF1byRT0/lGHecfBB33Ldxr3KNC/2LGsj1MhY7kPYSkxMvWF+yURUnhwpFeBROhJWBZo433hi/12E40sAmZ7BA2Q4f2QvjeZSwc7q27C7g5QA5L6YFYLy/86WwR+Pafx6oPAV9tZ6/HLPV/sMUQfeSq9U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375733; c=relaxed/simple; bh=ZpiqxBRk7OXUSZoGI8tJvhb11X3bpdvaD0vIu1qU+eU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=GggiJ0IIWifiLZFbR8Lewz0uRW3B0hsgJy2Sa3t+Qb9Xn31HqgEZicbQ1fuAto5Ok4KtzPGEBF47oQMxr67JbHD8mHNlmRW9AN5ykkW8KFGQKsFr8zjtsC4Nh4O9LMiAFOa1gqYZ2wiS9/5ekU+Wkp6cJDkLYKVyFpbADdxCFzs= 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=tYlDRnmg; arc=fail smtp.client-ip=52.101.228.129 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="tYlDRnmg" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JNdM0jkyOkHmlSIepS271FWCmmsN6drL5Oe3pxotW9PcHBgtS87TQ/lYA+gftHWiWBl28zZFGSuTYTownYXz5+CmDcU03rS1eWkL85Nio97z40nZ2rEs6q+VNj381aLTK8QQJbKhXteahG+iapqt7w5C1OHVIDYsTypdFtkVV35WvDbk+yaePMpZoyKRhoKKX39XYmR8A+woRMZl7JdLCOp1+aNOOVGLLr4YldF3QemQguI3oMM5ynCKHt8uo8MKuvdxTdePCZ6XXtXCZ4Wn69NiYVcLjLeTJF8Zhq2+ZeIkUc+04K9PH03cHEXxrxJ2n3Hg4qV98CStJ7DO0qD58A== 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=1K+yIujhq+xYov2GWHI8ub4ifp62GCkjRyH7ywtrYr0=; b=lIFIEQpMBs3YbP9B2fOl/wEnCxwMTtmPOf4bokUP0qN1dU8MsPLeGCZk36ehY+LBV0uC2KZJS4ea6CB6xSYzMxGeYzV5PJiY2LTn3f6a8qgTYzdty5OG0VCjb7oU/B407uH1tKODE5Os2BL5SYzLB7CMWXwpa1bQLpU/k7QLLXTf06DDk+/X4nuw7xVB1DgDPqW3UqenUtuvS+ym1sN1cNu8ElYtj8GVM6ld/WWeQHZga2taj5ERr5TcPg9cuDTlftZZ3dGrW+uVyfHi0UaBmT6BqTfivkO1VchlmeddD8UmFyhNViB3kOiwW+T3wMoNgl0jB40a2vsqzNeuB/4YKw== 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=1K+yIujhq+xYov2GWHI8ub4ifp62GCkjRyH7ywtrYr0=; b=tYlDRnmgqSd4S8DsJyvq9yAEIRejV/U3XuHs4yTESo+aAG8c9mRbnztcerqNENVrm26G9dDlGcy2kXy37bhn5CSdJfwxUxP6qzYQnxdUHrrAkaj52kay3rpWcgn1CHkSCuZPERQNaM9PlYpCQTss7eTpkNvz5c3y4ehpEtkYCno= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TYTP286MB4022.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:188::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:48 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:48 +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 net-next v4 07/10] net: ntb_netdev: Reject short RX frames Date: Mon, 14 Sep 2026 17:48:35 +0900 Message-ID: <20260914084838.2158249-8-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0297.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3c8::20) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TYTP286MB4022:EE_ X-MS-Office365-Filtering-Correlation-Id: fcd56223-422d-4e27-deaa-08df123cfe16 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: ftIke/aBlL4K4VxepViYscgNYtFWybqty1nATX16pZzaMUCdPiehBwRrM4lXlxuiyKVeVVkT4OFxA3vLSgMmFTjNZmgExTLHYeLd8v8BspckxqIsSwz4rLOZI9syBMqDh2rEiiZaBzwe3EeJiSuFWmLPFIKRkNGNnK8+8r1IscxeKL8GG52a28qGPGYqFyLBwh7pLWvsbsEJLueIZv2AC7IItlBIrqqISTtWx7rMaldbq4ICup18y7/+26RRXWAi4HMrT1aJa/hQd/r/Qev+G4UhENw59BWUM6UUWUK6Xy9SCEiX6nHk2vMXWY3xrg51sC+C+pjksrYhFi8nPKcJJ9Q697fpThLuDmhkoBlVpDi5aG/UQ3iDYrpo3uDzjOMNd1nszaH1I0qGgh0Two+M05KzOj2ESYfW7ujaGsph9rdFoGxImL9ouJVSg30haR90Z9Hko8EXi0Pj7qjU6cQB/f6BOG9IgCgCIvT2FV2ETuiOJlQKO4qGx8d0ZmBaQcGCV1rvLWWlkmEoRBtCsqVCQ6kXTa1dGWiFlX9vJsFxfWdFHWPnT1CpZk6QmFk6/udaUv0kNQWzoXHq8o94MR8kiGlaEJZ4sQSNR5AEKP6WLoGOUvbgjy9DjgJiiK3Y4kGYs8DW5ulZwsmH+riGlbDmv8ipO1AT1JBCLJc4cr6D42A= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ydh3w07NfdR3lxRCXcdRV+CLQN4khNvF9WnLRj5hDhJMbzTdkBRK6gUCo1cz?= =?us-ascii?Q?8j32o5xNDBypspKuWs3Mt4w4vrQWkNI9joQ0Rxwle4HZa+Xhi83FVc3gicmI?= =?us-ascii?Q?ILS29mL474qT+szOwnknF/rJmV2X+Bu5i37IFVtRsKMGQ6KS3b578xGD6bEo?= =?us-ascii?Q?e2mPbo0pEAXHOZLGvd7DRu0C6w0jO0HiAa4fKeUG+QkPNbknxdgUxKJD9nGY?= =?us-ascii?Q?ixwympMOVirU5ikgp9CkDvi7k8OqsAg1vgmKumJjtsAthqarNsosAgEejV+A?= =?us-ascii?Q?OnOyN5WIn070c/lmjZW+HpcDY8SikyTAB1IAofBeDaLx7X/ZyeoFQVkR31HX?= =?us-ascii?Q?ZX025P4zwqiGkrInG7ZkFOPHHfZ8iXmMIHk7D0TvtbqzBYVMKGFhjuy3Qqaw?= =?us-ascii?Q?qqo7v+AxCfr5YlUki2lr8S1eWVkPp3jUU/fxlipjjS55MktnKcvDh3rAQUVm?= =?us-ascii?Q?w/pbmBINW6GmtxeT3WuU7ODFWuDFnrkqKNWHcyUxrNJsLYPZYVHrz/DOeL9d?= =?us-ascii?Q?rLjDP0C3tb7o9+OYk/MyZxyP5MnuZt09TQFqMoI3heokTs8opBR2L6wf64n/?= =?us-ascii?Q?hQ8Xq+csxKd4sDNqq5Q7pIlywCAZAOJkha7V9fz11cbBGa62vMTRiOPN2bgw?= =?us-ascii?Q?EzDjLAXEgcVOXOcbOB4AjyMO2NZRwkHiVwifBqZm60O/SJdTVZGu+w/Vl7Tx?= =?us-ascii?Q?SfqnGh92/W9AwNg0PX4FVM9lexpsG7mzxuLYCubPf3uLcBuYK6Pvo3PPRBEh?= =?us-ascii?Q?XRfaXdsmnatgPVCXq6O2rlnO/djEQ12EzUvjDtfKZ4xvQIVgZ0glY3tF7N2N?= =?us-ascii?Q?16tNMUEhobLPq6Lr1gLMqVc4aLY3qU5quuUdFt1HUeaxdiMmhqsFY0cZpbpo?= =?us-ascii?Q?vVwyU6W1Vz9yJkh6Y9Kx3PQXr3o36aPUMBmRMfSgA7p1gZsu0xUUFHEbFBYF?= =?us-ascii?Q?AT4p2c812i6yFlM7s+x3o0s2A7leBb8jLpKrNGrIN/lzBbQ1gvmp2mPTZUg0?= =?us-ascii?Q?uNMTRAajmZE228CUJq/rUpK/UUDpeJtCtDUxrw6PEQJyTToSyPY/1feIoz4i?= =?us-ascii?Q?x3q6gpcotTepJG4hkNxIgZTE6VYZ+HGMJUbQp6LqegraZENJ78zniRjwlq4r?= =?us-ascii?Q?nYi5RJiVYMfaitD2gubPytS8wc4spSTJrXEYDRBUnuYc9/VwkJiOcQ19vb0F?= =?us-ascii?Q?JuAD7ErfMy5pDLY14ucX2k7TD238iuJiPqLsbFHu1yF02lDkzD4lgydZVxvq?= =?us-ascii?Q?OB6qekaMxT8djykUBhjoi8ZuT/FRcOmqiLmxYoh3+O66oAQhi/89qQd7G7kV?= =?us-ascii?Q?oO4qpqyPSY8YKoXAMrH9wgi65Dr2iRFGCfxCoLyIkXo0WEV6p8i42nYzucid?= =?us-ascii?Q?p3Q9vWx89l2LK0hFOTjJGxJ82N6QCNtcUtuMnrjvYhH4c1rsAHhJDYwl46YL?= =?us-ascii?Q?yEHkne8aFK6/+gSFbdHY7OaospeRQaK66iAycqL+Bo2p0aiOY9ySxLQiOI0B?= =?us-ascii?Q?T/rn89ccndLiYsqlT8vkFIpgnEmWzVQoaiBBo1C2yf1ql6UtvGn30376BVXf?= =?us-ascii?Q?NzAJcN/IUJwh55PG+qUd9urhzGBZpw9aao2rb9HO9mHA7xD9IhIQ2lNXCZro?= =?us-ascii?Q?lGH6Qu2mSxU53HXJYYqLPI0FuemAMRoJB6tcLsPWjrMGB0oBDcxAHcsvMr0x?= =?us-ascii?Q?69VRh9TKCq7vtIr3U2RuJ4XoMG4EC8EeYFqXu1//szHN+4ssUR4deD5s0lpC?= =?us-ascii?Q?y8iOfHA9YIQK7eRJ/gM5Rm9J0gu/oTgEPIp4z4LjAbhab2tgGtfl?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: fcd56223-422d-4e27-deaa-08df123cfe16 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:48.1162 (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: cJiQqNr08voVYJcEDyFO46cjqL3x1P+ACH1YPW9CWL2u1E2c9Oio6IjT6vgFlZHK4dYHzGGO3h1QyciMxUwjVw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB4022 Content-Type: text/plain; charset="utf-8" ntb_netdev passes RX frames shorter than ETH_HLEN to eth_type_trans(), which expects a complete Ethernet header. Reject them as length errors. Fixes: 548c237c0a99 ("net: Add support for NTB virtual ethernet device") Signed-off-by: Koichiro Den Reviewed-by: Joe Damato --- Changes in v4: - New patch. Included here to fix the existing RX length check before adding checks for ntb_netdev_hdr later in the series. drivers/net/ntb_netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 78df47659d45..84fdd81ebd16 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -140,7 +140,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport_= qp *qp, void *qp_data, =20 netdev_dbg(ndev, "%s: %d byte payload received\n", __func__, len); =20 - if (len < 0) { + if (len < ETH_HLEN) { DEV_STATS_INC(ndev, rx_errors); DEV_STATS_INC(ndev, rx_length_errors); goto enqueue_again; --=20 2.51.0 From nobody Fri Sep 25 10:38:24 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020129.outbound.protection.outlook.com [52.101.228.129]) (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 8953439A803; Mon, 14 Sep 2026 08:48:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.129 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375735; cv=fail; b=LhN7m3F3acUAVtM5vYMOmRP1DOUeBVdQIB1YUFJWx3AKbtLHltZ8ooknRjf7GGzrUzK/j7pHWulpSAs57o5isC7lVpRVyeVsyuaPnXALiX9f7aKV9SCI3O+Ix5Yvgqvz2G4g1OP26EBXELAv0a9qECncuNsqzPPijI+f7EmyYFs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375735; c=relaxed/simple; bh=QGJ41FjwFdPasJToxM9jJl1ASYtqCct4v+bDGvD6ovE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=cm9PfaD1x3Krpk+s3AJOSupOkNn0t+7MEiFwERxF8A48KDmtCrcU4OpORUljVX4AxYFaOpxmmcRpM3Oe1TLnwm+iGPZhpeeiIoQk5xVMtAvdMs7HqiabspGpN2lfqrIxIJcF9rOd6/aJDV5/uNjvJiEut8Hwu9KJk1mRqvo4MuI= 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=FECojvLh; arc=fail smtp.client-ip=52.101.228.129 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="FECojvLh" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cc0JBQnPPkqsLYvbMHOS9mYtqU0WGX1789nAKMFpKde/KPOFjq+dRGufBbqY8FmHW7yb58BbsEZnOjB4v3YDExIK7Ljz3zO1Bcsy85tXk2cIjI+GhHEiEG0wn8QIyDxH164te61ogjIFxT9D/M5pPwuKSoMxIphdu2tlGwDoOodunuhZ4hqYUB11JV1VHxp1ky9FhIbSXcS09Y6rmzYdCu51wRa7jPHkW/f+z0PgH5J2PQeUDI4xEJQceMj2fA8NbotwbrDGMXU4Y/hxD6ozRbRh0tTamx5FWf+HkylF9/3BRW6GSpyRfq29/8jBNSx0r5FywBYINe1CZmcyDGyurA== 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=NaK8YWkRcqqKniPrRlUxo4RS+V3JrL4W0o4qtcdgNws=; b=nQr+h07srLiKJDSRgTSVu7Mof9UaGccLRylzAksYrfV+Cjk0xVS3+Ju4xIuanJJcrddbo9WQiE6ANU/5Lo11WWCgHa/RtSCVl3tkRH1U/saQB17LmotizWhcXbSG3qyM2HSn43m4NVtr0oeTAl1eaS0n9TfB5mWZFFrXi/qeJaN8VN++grtydkDadAk+aQRAEBjlnG/oZBCLcEdy1qc9uuWzsDGGijy8pm0R8cCvDniofp/MIpOWhIQwet7VyVh1g2TNYXy60ovFFIc/9JOVpmJJw+ILAlAhv43hLnQIZCTgWfUR0zH9hahcwIRfDmJ3m8I0Qy4ZMxDDZJoERWL/mg== 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=NaK8YWkRcqqKniPrRlUxo4RS+V3JrL4W0o4qtcdgNws=; b=FECojvLh61gINAWDqGn4wWOZZ0MjpwNwTNuQHmAo61o3W72jTGmbk5dk8MALcMFupelYslMiDNElniXVjjJFuuS6V2brwjKAUkta27m/RwsMkHmq6kLO8suhpi4gnStxEurTW+Zx7q/lTs+ErjvRYk65DYuN0+PB/R2xumyhums= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TYTP286MB4022.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:188::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:49 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:49 +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 net-next v4 08/10] net: ntb_netdev: Factor out RX statistics update Date: Mon, 14 Sep 2026 17:48:36 +0900 Message-ID: <20260914084838.2158249-9-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0055.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b5::10) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TYTP286MB4022:EE_ X-MS-Office365-Filtering-Correlation-Id: 6d0c8cf6-ebf5-4e5d-c5e9-08df123cfeae X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: gOImDsmBqhmmnFdySi7WMFCtNFk2Bxp8TVAazvUG1ORod5AaeW3wtaSo2w72t6agCooUiA816ES0fyRCAhFGBt5Ogd8RKREo8IfG+PZfVZJBOWYxC7hl5N2FqkGHhCJShZwE4pRSjQnURePenomOpfKKCMjsZtJJNP831B0EakoAzNURPoQCQrEEwYwqF2DD353579BIndx58inBktU+zwR2yFFL5afQ5+WHDp3TEWo+6gZuA3iCmPqBGEZxRKdY5nbAefQZtVL064BQitjU4w/Dd/GwJA3oPt4TipQtDZiPKFr4yKBDm6A61MBhIQYryCsRLLVY54ytTiIRv+AlJ/LlRHraC3WFNVkZHiT9KpOjI6gAKczIBPjrdFQ0EYY1pGvORDdQixqevHNz1yFras06T96bvOgx2f39dKEl8fn0mVHRogOxAXKAU9Xb00jueS7PDrO9pTlEVAZl5Ej93RSBTjHq3wWVqQVcOuFQ1TiDm7ATMmFJXt/5ycb27bb+lya2LPHYz/rV+JlLEqm+RG4C8Zk326LRVo1elEkDA6j01skcZr0AzUaleiwGf3EBT5cepXGrf0VHfJL7Ei4g0bWybnp9N5UhZKoGZsffKG/3O7kwfz/3s/wAkBAr0z3Wxc/G0MzNyQRs6EInK+VSUyc7QYgT6FWPY81ze3D0vUA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?12VbXTiDcFkkzhnmlz0jhXCsCZiKoZkjHeZfxL2Iz5wPEHQIRUxH9UWpY7fP?= =?us-ascii?Q?Ft98Jktm/tfWsKuZ/t+cxZ4DFYd8IJ2RBE7KTq+4yuL+D70Y/ubOlMPGUP5W?= =?us-ascii?Q?ikB8zbLH5rsCDaJ3vK1bG32omMY0N/PFOh7jKRbv69p3gg/EmAM09TNCM/j6?= =?us-ascii?Q?JzOQDkJn7nKVIqbJBCE+kzoH78aczF9z9Why8TPT+eryD1litX7AnD21IvVR?= =?us-ascii?Q?R3U5SbSQ8q2MtZWbNphCzh0hH4Z2bOsOMnP46mkKdcdQFg/gtcaI4TygSeDn?= =?us-ascii?Q?e3+FbqG9z4MfrUC2hyKachI2kkIBqFm/PZ+0t8joHgFk7SddDmJHfkuoH2cP?= =?us-ascii?Q?Xk4ZRKb0pt+KC5CjXP96GSdLhIcazJO+m9BlJ7DL4WkPkX0i/AV+EGwxiBxu?= =?us-ascii?Q?zueeMlhpwwl1ba57wkohZdAZ5/Lu1OQKEVMt1EjMc6iLbg5sFBiBv4ZwoqOo?= =?us-ascii?Q?j88zttXKaced5OjefgQ2lSHlKc8HqK3f5MjIovVXs4/NOUjQYxv4R3Tmrw2P?= =?us-ascii?Q?38n6Vb/U2j1tJwv3ene8Tw8muTaI0IUgolVWQw9Py8NafOdy9vCmNd4wMVyv?= =?us-ascii?Q?mbUUyInRxsvM2LqwOyaLcC/VmrZgQE8QuVlqKax3c3X4NQluoC4w0D2PdlD1?= =?us-ascii?Q?gj1GJKGET3NJnKw2CSI6hEnkJQ/8e2/eSrxgqcyqm5Jk+c5lTzQ6LCz1LJs2?= =?us-ascii?Q?oCoz+ruDDgcF0qrXwWf53SDPV/ev2cqJ2pRnQyJlTQVBqvzsWsTXJ6KFwMW/?= =?us-ascii?Q?sS0Lam4d0SSO5rm53GAKwiR2HzW2p7pHiPWmCqdfeqizQwPCP26e6jTiTzWK?= =?us-ascii?Q?oOcgGT79GpIR7DPmNIutnGBrRYbGMpRpcqwwWtSPvjokvOQVgiMky4gOG8Le?= =?us-ascii?Q?Hoc6qsVBtyF/nAAY7wXs97SceX/FMOWI5UyOFoLQsw5yhs939jLmfjzHlpvg?= =?us-ascii?Q?kL5eJ0YLBqbrzvHF0FKo5giqztv4w3Xym7Dk4/fFCNQELGSss+SCTCoXFfvA?= =?us-ascii?Q?RgpQ/t6E9QceUCaLlj6m3YFU0LIaZOO79pDPm2+hN/VtQHnJnohP1dpbWln9?= =?us-ascii?Q?BKocOHqUmQQ1ehLlzuiFc8sY81aGJNyzYCIwI44yx7Lnae6+3vnOn5zm93o+?= =?us-ascii?Q?SXl708Vsfqm90fPYDwoVPuCyxu/554Nip9Fmlu/TqkCECEpmKxJgcHhWF7No?= =?us-ascii?Q?LUiIxb2GSrbFmb6XPsk4WBAyOzarsHHiMLNgaOnVZaWBUx5jMj6sG3FnxHE8?= =?us-ascii?Q?2zz0goYL6Kxhtjo/knIUvJy22tpNr1UN51U+P9FaPlYiEQH0WUlCFTjDRE1q?= =?us-ascii?Q?4qUzPbTaTgr8yfoG+spzTniV1ThmXe/k750/Zr2BB5NpzhEdooxsbF83+xeK?= =?us-ascii?Q?ypTOVOx+NhSdnl1aMRP4l13NjEKPM66s/BVNWXdRnyL3gDQBpZWWED5XxwKz?= =?us-ascii?Q?OCYhE1YLBLQOQs1aKi3omWlj1ozSkSqIU9n4n3yU8CNieN4Pg2t4+CT1H0Rx?= =?us-ascii?Q?hQegkuqgkb83AkEbkLtB0SrCpFRRGJxHd8iy6+2cfg0REJNMcgfAqhDO9xoK?= =?us-ascii?Q?UnymqXDkG/FUnxxxkMovs5drvuNRGBioPdMhYQPzjbwZesxaORSBTi6H8eLg?= =?us-ascii?Q?GXR3Wmmr8qLhPZkTxVRWJR8XqslkF6J0H5ZvcswjheaUq6vFC3pfiNBiIGI4?= =?us-ascii?Q?kXXxc2FRLJaHhmgjFp5cq2hRUUqD0SM5Tho1w/MbAleyszhMNcidcmMPrcIK?= =?us-ascii?Q?grxByud8yR6dJnaCo5T19QWRJJKntmlhBh9J4KKEImVdNbt4/Mou?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 6d0c8cf6-ebf5-4e5d-c5e9-08df123cfeae X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:49.1350 (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: DTEzIBFCyTCz3MF0xPQWo2Z0YFMj1BrzvEjo6BgU8UjGGAtNmMnEx/Dbr1otT0DiyrGMFc/n/3AboUVnG/n3jw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB4022 Content-Type: text/plain; charset="utf-8" Move RX packet and byte accounting into a helper for the packet-header handling added by the next patch. No functional change. Signed-off-by: Koichiro Den --- Changes in v4: - New patch. For reviewers: I split this out for easier review, but I'm happy to fold it into the next patch if preferred. drivers/net/ntb_netdev.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 84fdd81ebd16..cddfe8d63fc1 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -122,15 +122,25 @@ static void ntb_netdev_event_handler(void *data, int = link_is_up, u32 peer_caps) ntb_netdev_update_carrier(dev); } =20 +static void ntb_netdev_rx_stats_add(struct net_device *ndev, + unsigned int len) +{ + struct pcpu_sw_netstats *tstats =3D this_cpu_ptr(ndev->tstats); + unsigned long flags; + + flags =3D u64_stats_update_begin_irqsave(&tstats->syncp); + u64_stats_inc(&tstats->rx_packets); + u64_stats_add(&tstats->rx_bytes, len); + u64_stats_update_end_irqrestore(&tstats->syncp, flags); +} + static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, void *data, int len, unsigned int meta) { struct ntb_netdev_queue *q =3D qp_data; struct ntb_netdev *dev =3D q->ntdev; - struct pcpu_sw_netstats *tstats; struct sk_buff *skb, *new_skb; struct net_device *ndev; - unsigned long flags; int rc; =20 ndev =3D dev->ndev; @@ -146,11 +156,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport= _qp *qp, void *qp_data, goto enqueue_again; } =20 - tstats =3D this_cpu_ptr(ndev->tstats); - flags =3D u64_stats_update_begin_irqsave(&tstats->syncp); - u64_stats_inc(&tstats->rx_packets); - u64_stats_add(&tstats->rx_bytes, len); - u64_stats_update_end_irqrestore(&tstats->syncp, flags); + ntb_netdev_rx_stats_add(ndev, len); =20 new_skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); if (!new_skb) { --=20 2.51.0 From nobody Fri Sep 25 10:38:24 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020129.outbound.protection.outlook.com [52.101.228.129]) (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 5B0BE414A0C; Mon, 14 Sep 2026 08:48:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.129 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375737; cv=fail; b=sMBIe+hp0Z3+M17rCyvi2nG1E7KOCB55MVaqXXWLiHZQzss9S1vgC9ZQf5rdBOmLGFVAoC1vfZH1lhFpO+e3DE3JDcufSUrO7Hw7fvz1bK3T1Mdvlq/1Rk35h8HEPcws54/vls1ei+jPkvYiL8FYo63/ag0MdGatsjMjN/Q8e8E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375737; c=relaxed/simple; bh=540ftUe3kPNqKo3fY2svr3HqyoWuIgIMC3Tr4745vrU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=IgyDDY/fzQON4cVAlKUOJPji3e8Mw3t0tLEZ0t4FqTpIhV7rw+lKOgZnEl8VKE+aWL6qlU+Kg/PVMCaxyaVX928dzvUWqXaWOztqTkm34rqV+SP64odR8UY/9vLHi9sRne0Xd3qQvotWoTWRID8T4bjrEB/z0Pep1Ug/cwqStmk= 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=XTnSQK19; arc=fail smtp.client-ip=52.101.228.129 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="XTnSQK19" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vbBQn9kqLO0SHGVKmhAdmcZ3/EiSn2jDiP3NNm+uS/2ID13HdeAcpGTZ0QQ0mqSneNjsNdn+oSpzZXOWJDFX+9qbEZTnwy012xpFIMwmd/m2P/qA1E2v10sex/W64mc7BN1otUrICrv4aojSA2aMsc+Ezm0aQroSeQOXwpCwabzfJTsNQ3C5HhGXyWv8traH+0uIyTLeLEoDaTbQcSVQNItUojd1KLcD1Ovr0hZFfVcSeh5hbIBUOmSmoqgpT4YEVlq2ScQ9ZhT/2suhKm59Rts2zeGikplmbhR3fGuF577p6l1PRIpb21rEYyz6oEEq1x2KumdoYNfdXnW7Oor9XQ== 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=KjiUpbMW23BJUv9Yh7+Ca0FVgvVTErwlLBaaPa2PPWs=; b=WZ2Rz+CYc2MDMT37GSlxJ2iZRQ7D3xMK5FHc6oH6Sm10cS2aExYU0NHy8xzk1Ud8+YcNzI7zCVa7F9miXy+wdVJIJnV77nyDgpuU2zImlVd/z0S8S1fgpsIgf8dPEer5B6bCDt08pWssbdwGNt6EvTwVtZxhsVniXn8EHfj4eLU8XWa2xmJ/Z6Y6Kf9XgC28u4OcBRrw+q4aNDvbmvEatskXIIHRVvczuLRf0scn+Ro8kpAYuvRz5rmj02oVn6RUEOR49mnvTOmBpk01Cw4y/IeaWPSm0vu1scG0ojfwfsvMos1wn+usB4rI48x0Bds9PW6xhR5MoqemMClpzx94Zw== 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=KjiUpbMW23BJUv9Yh7+Ca0FVgvVTErwlLBaaPa2PPWs=; b=XTnSQK19KGlHiPk9gaqvcCzaGtxz0bIBYoyOMz1F31IzpvhHpDMbMrzq6Dm+lngpZg8NmCvaxU30hhIBZENpZUFNzQYmqhHdcHu363RT99gWzTc0wkbTri2OaoGGuYb6bvWA4T1+j6z/ZwOCokjdwSjZlpCDT2cpg1gkDodvf28= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TYTP286MB4022.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:188::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:50 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:50 +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 net-next v4 09/10] net: ntb_netdev: Introduce an optional packet header, ntb_netdev_hdr Date: Mon, 14 Sep 2026 17:48:37 +0900 Message-ID: <20260914084838.2158249-10-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0076.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:36d::10) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TYTP286MB4022:EE_ X-MS-Office365-Filtering-Correlation-Id: d95b9fd6-2e75-4f6e-655d-08df123cff87 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|3023799007|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: /aGl6hkEi9Dti590Vfz6Fgo4wWwAxZktkfSrS1+TpFJ2W8C9qScsclHvOjGGWNH7AbkekyFJ47mG8pcz/eDVCo7VM/gWPR+vK87LkPKK3vsKJp7c4mwNRMEGsNDZLV/mscedA3OB7dcdasqfHLiGlA+CaIWZkORDvFHrGKYfVWVZprSnnA1ry292Ks535LlnXtURzQJRU2+LOZbJRquMz4Agx43ChJKCmXnW8iQ3J0jPrKKXYjmK7BWhcDbLYcd0tfxqSQ06WMCULVKc2StmMFE7u6eyTgQp0pSUr6AUIPV7M9Xm7DP55oDrXwdvUp0hU1GiMTlE2Oma76LN4ldW/cXnNTnQVuwf/OCRFiRs5wFTOZwky6OMHke+HQDRv6YS+aNoF/uJ1hB0ZkL/XtIScvQ9/44JNgHqLBXTyiCR/+JUFsIGruOd9hifyYtm0BMOja5PzGc7MPHeYydNYuzUY914B2D5tWL0M5y5KNLasct62NRA68dunh3B3SSWbCNDbFXm/GgGNy/9fR2Xj8t+rOstAaBvjk9qPyCbCsO7cWrSdoCZhQq+7RE0QJr9ZoP2lmV/1FNhD6Ung0ykt1pebTy+Kv4e1VoBF52a397xzKw= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(3023799007)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AgBaSJo2ciEL+CBTEO6zXHDdNE9nnqQ+/Zj/Va5c9p7irIfG3tgqLtHkVKgr?= =?us-ascii?Q?HXy4h9bGhyS8kGOIoIJpJDKnHxJfZS9r8qgGJDuJDzw4dQRnFrcBSlqXVseV?= =?us-ascii?Q?614PRNDo7ofyi05L8Rv7Z9uQm0FbjkhHv1gAGUyoIGPuW/qqWtQkk2aIP45K?= =?us-ascii?Q?Y8jgaHUju83v3CwP91juTIgdwl0Sy83H310C1T13HjW4DXWgsetyZo4fdFaF?= =?us-ascii?Q?I3VS97Pbxz2p5isshJ5tiYwbun43lTrg2te4WYO6ytvudSySiA4KYrvEoR82?= =?us-ascii?Q?lCnK0jSKE8J5qV8MDtfSHVRyrGtTb7NpXv/bkTxGpBBQHVyGgJ2/nRTLVs3a?= =?us-ascii?Q?krGWbF1FtWaWDc0UEFNodgAbnLLbG3i3qH0CeiyH/gpb23vmP+FrF2YOoVrL?= =?us-ascii?Q?+cKWoPMCsu63JIKAJB2hI33IyUX8zv89lghoWNnVKfLnp9lxBl28V23tG98R?= =?us-ascii?Q?FFz8FEK0kuSoW3j+Z3rEm7bKTkvQVtpWJD5HbIivDONfZd9hWWl66CXPN1mM?= =?us-ascii?Q?PRngDYk285wzRBPVcbuAWmYXsjd+wQ9JQpQyd5oV653bpzHoSz59EbCzcdzA?= =?us-ascii?Q?2vcpRmYtdBWerPCWFRRmRk/jKm3KDGEHhUsUUIQngncRbPwQOhhlPwPPaMx2?= =?us-ascii?Q?VOh41BFtiGRv5Qal4vgl+rgpJMsN0k3clENeWc4RxYOJ4NcL1bkbFn9Eahdd?= =?us-ascii?Q?VHr9VFCudS6djIGk3C5HR7WS04dYnRZfFm3JW7v6AHRGhqzluvpFt8iyb/0r?= =?us-ascii?Q?bELt5FI93P/8K6yfGQ9fJmvkSCcul2pSwLFrMerSIT2aTHsq5j+wgH2c8vuq?= =?us-ascii?Q?s6a1cJTtRzF/v3Hf3CkWsQqkJ/2P0fQtV+rBpoaqa/zTMTu9mBtvDuRs6UgI?= =?us-ascii?Q?z1LJplkIepYyJSrYx3d9T4YxptmOUmgoN7hPl4+ZGtJgqUHdss2e/ryzIaJT?= =?us-ascii?Q?EHwXHDVihmtkPIzGQKzWqOFm9dLrTqcDtKxo2o7UPlN8CT+FK/it5gR251ch?= =?us-ascii?Q?A90B/NWWxt3cxYwXN96qgw+V0hEtxVAy7eJOEGeqQcNxhhPUgSBS2jYndll7?= =?us-ascii?Q?eoHhZh7KuhjXMaZiovkQsD3yuHOMwZBaHQWlQIeZgK3TFX1wAWjOQYwaz3KW?= =?us-ascii?Q?76x0vjVcZNy9rJEffz+xKN2ZdI2sjH0viWsmbueoZTgEH4igtlLLpyDuF8JG?= =?us-ascii?Q?+1O2ahSgYC3pnyx6torbOSvy+hIydKa+CUoGLmPEO7+IIe2m5qDfOwo4yWoT?= =?us-ascii?Q?8tbuMnG6jDpHnp7SxEK8PVGrPCeMo48pCb9eRsKzxUkBHD9ZQ5Hh6PN0xY73?= =?us-ascii?Q?+JCnKaMkW7jd8ROfxKdhjBcwyFxpr/RsRvBrtHObotzcQJQ376FvuHAXXHQ5?= =?us-ascii?Q?E7jWFL/XH+vI8f9z9mmJq9Va/l5ZiDnYjKCNzn3RDRzpBqVHcni3J6z5ortH?= =?us-ascii?Q?xsAguMEVmHnm0MhxzQWQ9qhr6eO0Nx6kOizXElYPUfREStNYj7+vEPUzIQ6G?= =?us-ascii?Q?0TM5e/kyV+J3syfpbdRxthkD8eRX+0gF5O/INDiQCoS1bhdKpWDha+Utmw0T?= =?us-ascii?Q?+F9BZS8PyZiKoe7wqHT99zkLkhYQf7bwYY3XL80IK/GGTgMW7hYRYeCnSytO?= =?us-ascii?Q?sudX/CJhupdPpN4uhEj1E8BsvxczwLpk2xuhA+KULbnD85e1EzvO9f6WJpI2?= =?us-ascii?Q?qGvnYcwvfgUAaSRsNpepSay1MJFFvOIc6T2GcaU804R/Egr27SKpD7q2BzXW?= =?us-ascii?Q?aOLmtVGHFW8ylwHd7UApWZleCZBasghFt4VoXZ5m+F2IeEsDsPxs?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: d95b9fd6-2e75-4f6e-655d-08df123cff87 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:50.5972 (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: w/53MzntuRKCQziBoyQaBCRo5tDKFJTWsQ1LlgpMRcg6XymeGzMgM75MU6sMq5EkXTKz+gjS/ul1FHtbF02ayA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB4022 Content-Type: text/plain; charset="utf-8" Add an optional ntb_netdev_hdr for per-packet metadata, with a length field for future extensions. One client metadata bit marks its presence. Account for it in TX headroom, the MTU and RX buffers. The flags field must be zero for now. The next patch adds checksum metadata. Suggested-by: Jakub Kicinski Signed-off-by: Koichiro Den --- Changes in v4: - New patch. (Jakub) https://lore.kernel.org/r/20260910172047.167225eb@kernel.org/ drivers/net/ntb_netdev.c | 69 ++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index cddfe8d63fc1..67cfe0f1a49a 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -29,6 +29,14 @@ static unsigned int tx_stop =3D 5; #define NTB_NETDEV_MAX_QUEUES 64 #define NTB_NETDEV_DEFAULT_QUEUES 1 =20 +/* An ntb_netdev_hdr precedes the packet. */ +#define NTB_NETDEV_META_HDR BIT(0) + +struct ntb_netdev_hdr { + __le16 len; /* Header length in bytes, a multiple of 2. */ + __le16 flags; +}; + struct ntb_netdev; =20 struct ntb_netdev_queue { @@ -83,15 +91,16 @@ static int ntb_netdev_queue_rx_fill(struct net_device *= ndev, struct ntb_netdev_queue *queue) { struct sk_buff *skb; + unsigned int size; int rc, i; =20 + size =3D ndev->mtu + ETH_HLEN + sizeof(struct ntb_netdev_hdr); for (i =3D 0; i < NTB_RXQ_SIZE; i++) { - skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); + skb =3D netdev_alloc_skb(ndev, size); if (!skb) return -ENOMEM; =20 - rc =3D ntb_transport_rx_enqueue(queue->qp, skb, skb->data, - ndev->mtu + ETH_HLEN); + rc =3D ntb_transport_rx_enqueue(queue->qp, skb, skb->data, size); if (rc) { dev_kfree_skb(skb); return rc; @@ -137,34 +146,57 @@ static void ntb_netdev_rx_stats_add(struct net_device= *ndev, static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, void *data, int len, unsigned int meta) { + const struct ntb_netdev_hdr *hdr =3D NULL; struct ntb_netdev_queue *q =3D qp_data; struct ntb_netdev *dev =3D q->ntdev; + unsigned int size, hdr_len =3D 0; struct sk_buff *skb, *new_skb; struct net_device *ndev; int rc; =20 ndev =3D dev->ndev; + size =3D ndev->mtu + ETH_HLEN + sizeof(*hdr); skb =3D data; if (!skb) return; =20 netdev_dbg(ndev, "%s: %d byte payload received\n", __func__, len); =20 + /* Validate the frame and optional header lengths. */ if (len < ETH_HLEN) { DEV_STATS_INC(ndev, rx_errors); DEV_STATS_INC(ndev, rx_length_errors); goto enqueue_again; } + if (meta & NTB_NETDEV_META_HDR) { + hdr =3D (void *)skb->data; + hdr_len =3D le16_to_cpu(hdr->len); + if (hdr_len < sizeof(*hdr) || !IS_ALIGNED(hdr_len, 2) || + hdr_len > len - ETH_HLEN) { + DEV_STATS_INC(ndev, rx_errors); + DEV_STATS_INC(ndev, rx_length_errors); + goto enqueue_again; + } + len -=3D hdr_len; + } =20 - ntb_netdev_rx_stats_add(ndev, len); - - new_skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); + new_skb =3D netdev_alloc_skb(ndev, size); if (!new_skb) { + ntb_netdev_rx_stats_add(ndev, len); DEV_STATS_INC(ndev, rx_dropped); goto enqueue_again; } =20 - skb_put(skb, len); + skb_put(skb, len + hdr_len); + if (hdr) { + u16 flags =3D le16_to_cpu(hdr->flags); + + skb_pull(skb, hdr_len); + if (flags) + goto rx_drop; + } + + ntb_netdev_rx_stats_add(ndev, len); skb->protocol =3D eth_type_trans(skb, ndev); skb->ip_summed =3D CHECKSUM_NONE; skb_record_rx_queue(skb, q->qid); @@ -174,12 +206,19 @@ static void ntb_netdev_rx_handler(struct ntb_transpor= t_qp *qp, void *qp_data, skb =3D new_skb; =20 enqueue_again: - rc =3D ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); + rc =3D ntb_transport_rx_enqueue(qp, skb, skb->data, size); if (rc) { dev_kfree_skb_any(skb); DEV_STATS_INC(ndev, rx_errors); DEV_STATS_INC(ndev, rx_fifo_errors); } + return; + +rx_drop: + DEV_STATS_INC(ndev, rx_errors); + dev_kfree_skb_any(skb); + skb =3D new_skb; + goto enqueue_again; } =20 static int __ntb_netdev_maybe_stop_tx(struct net_device *netdev, @@ -390,9 +429,11 @@ static int ntb_netdev_change_mtu(struct net_device *nd= ev, int new_mtu) struct ntb_netdev_queue *queue; struct sk_buff *skb; unsigned int q, i; + unsigned int size; int len, rc =3D 0; =20 - if (new_mtu > ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN) + size =3D new_mtu + ETH_HLEN + sizeof(struct ntb_netdev_hdr); + if (size > ntb_transport_max_size(dev->queues[0].qp)) return -EINVAL; =20 if (!netif_running(ndev)) { @@ -414,8 +455,7 @@ static int ntb_netdev_change_mtu(struct net_device *nde= v, int new_mtu) dev_kfree_skb(skb); =20 for (; i; i--) { - skb =3D netdev_alloc_skb(ndev, - new_mtu + ETH_HLEN); + skb =3D netdev_alloc_skb(ndev, size); if (!skb) { rc =3D -ENOMEM; goto err; @@ -423,8 +463,7 @@ static int ntb_netdev_change_mtu(struct net_device *nde= v, int new_mtu) =20 rc =3D ntb_transport_rx_enqueue(queue->qp, skb, skb->data, - new_mtu + - ETH_HLEN); + size); if (rc) { dev_kfree_skb(skb); goto err; @@ -673,6 +712,7 @@ static int ntb_netdev_probe(struct device *client_dev) =20 ndev->features =3D NETIF_F_HIGHDMA; ndev->pcpu_stat_type =3D NETDEV_PCPU_STAT_TSTATS; + ndev->needed_headroom =3D sizeof(struct ntb_netdev_hdr); =20 ndev->priv_flags |=3D IFF_LIVE_ADDR_CHANGE; =20 @@ -710,7 +750,8 @@ static int ntb_netdev_probe(struct device *client_dev) if (rc) goto err_free_qps; =20 - ndev->mtu =3D ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN; + ndev->mtu =3D ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN - + sizeof(struct ntb_netdev_hdr); =20 rc =3D register_netdev(ndev); if (rc) --=20 2.51.0 From nobody Fri Sep 25 10:38:24 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11020129.outbound.protection.outlook.com [52.101.228.129]) (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 33FE941CB39; Mon, 14 Sep 2026 08:48:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.129 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375740; cv=fail; b=XFcp47fSt76bmku9gWaYD/GV1vQErb/18wDnVpiLTYEuJU6jB+HlOEAlE+TWFwtOabP6E5Q5/rYHU400Bb7u3C97JroGFWf6uDP78NA/W+NKBmz33L4cEOw+1/f42XUDHtIvkNALsaKUa6efmZJysyYMSqsx//8mOZqoXvlmygU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789375740; c=relaxed/simple; bh=YkY0srYcp59bnppwGfL9A8b6JRrnWxEUr9bdnmI8y60=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=TUf5bzM5BdzpJ2gNaLQdiBIotuyeKeuaOOF7WwSKBalxSWHQLQ9PwEk/fJrJUcv/VNgVyoX5mfSTTtdLvZQOHXgPikutvdeBghfPl2wSrwF5RydhlZNmd0uLvftScBFPQUgR34TOhzI3Gt2X2KRkTb4SLpaDFtV4X0aF11KkmVA= 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=X+XOzwEP; arc=fail smtp.client-ip=52.101.228.129 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="X+XOzwEP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZMl6HB7HoRZTtYvB/PQq+PhJNI+j03h8zLfVtNxoKj/jIe3+eS9jf2pxBF66nhQ/41m6HPtu3HYDkB9CT6Rg92SuITH6Kj+S94dbjnETP6gKjmrACNXdrVD6znUPVjGYY2ph3KDHuxTGzgLLF3LwiijxHphExq8yjHjrcSFz2Mrb6IbzRwuUQfr1C8rpZ1hb0mquiMdwOF2/A/Av0aGLrDMK1DfU/V7EQ+WiBv+LcKn0NsgOyq2M6JXi+lvlrP7M8AFRYqGMCgxGQzHBeWt1MZ/S1rp3XzjWcI9wMvTrYUUFSSSfmAvErbBtMPdx7OoxlZgqPPLoY1N+VebC1B47mw== 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=G6j3CPzGkE30anSD7SwfsUj4ESx+O95eIBF+5SAoDaU=; b=xFGIXZSEIt0rcL0aM5rp563DFCtGqwAce4dC4wLkSYh3B5VTOvK3dzZiRRxsjwyWGRnmFCYdkGRRqIKxFcLZX6QKWhYLS6jMyXBmDo9dRqAJcScq3b1QAH+TRex0hy0978YWPq40adCGv6cvomcsawyfcMm49BFbkGaXQXc7SAqzA93wvkFUBWzlos76KPPxQIjJVZEdBrzyYihAQiMjQFkmNdrx3Peb8UEQ0xX2G/99ZYvLTyR20FrEQXv9HH4YghyqlQda3VkqZC5s9/nUEeId2xKqsbQWICU94weeHUG2ilFg+EarzYkmFMFzs+3sP1PSS1ldz99j8jIlx/QsBA== 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=G6j3CPzGkE30anSD7SwfsUj4ESx+O95eIBF+5SAoDaU=; b=X+XOzwEPtpJYGrCOFVvpYjsy3xQ0o/Bmh1+UfXB2N/eEDLKMB/1cz3asgolYSilkyOr4tx1z7cvZuJrtxk5+V/4sgB7CgZcy/VX3agKCtT3BSJKg+J+k+LkcKNcIPOZazWjUYCFF4idLUQNQeNg8h6LZXYBuJVkhbc9HSaQK6EI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) by TYTP286MB4022.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:188::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 08:48:51 +0000 Received: from TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9]) by TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM ([fe80::cce5:2aa8:53f9:dba9%5]) with mapi id 15.21.0406.007; Mon, 14 Sep 2026 08:48:51 +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 net-next v4 10/10] net: ntb_netdev: Preserve CHECKSUM_PARTIAL across NTB Date: Mon, 14 Sep 2026 17:48:38 +0900 Message-ID: <20260914084838.2158249-11-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260914084838.2158249-1-den@valinux.co.jp> References: <20260914084838.2158249-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0294.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3c8::6) To TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:325::11) 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: TY7P286MB6866:EE_|TYTP286MB4022:EE_ X-MS-Office365-Filtering-Correlation-Id: 8d32fb6f-f512-4922-9408-08df123d0023 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|23010399003|1800799024|366016|3023799007|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 53/EryD23DqDNXtAGdsLBLNtyi2qzcu0AuODDyVbyBj/IGWGWJRs/QoMsve0/9S+l9hJJDA9KWlnZ+G8zDHqZCH5yQIVKnFXzveHXkoTmNDfbOLMyxUNofpjKkXa7gnduaJUFRiDJZjtze4ESZdb8xKXKo2E0Xt4aDyA+GdKZQwH+M9XvpUIJN2iJ1G/JgqHQdPAYBokzkypB3DnuIXa3U7TE33233UvOgRJzHJNIJsrNtBiK2wqFG+jhJV08c1/olDEJ/D6G1SO8kmCZO/FiLJyJR3F4EPFLz+gjdFsY+2KdQ9vIaF7//O0IU4CBlpl6juU1/w0S7pnIsLfDPe+vueEbhmaR7dMfGy2f1JjOqoJat6Ghn3CoI97Ud5PUC1I4i79ae9TZNt9WjijdWRtlTHs4uGVM5clvtKrZJ3xsuaeR2QZAvuAZfqL8qtYVjez/eO97J+s0fVSd6p9o2mV7iC1VbndNZ3bo8PoMbcFpRbm1xCNPOwuEg3pOzJC8shc46D8SzhJeo7Xa/mV2MP9fOysC9Do87Oj38eD+mLNxSMGVcS7/Cbv+W4wFJ8JAMpaYJ+Uw/rYnzeWmg1K+qBTItBWpIBorKCcOE1+9/diSAxb6sx1riYgtH02PCgHt4eyCxsLe5CaVnMbJFVBjzuqw7LPGFfS0YQxxDeX/lh6zPw= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(23010399003)(1800799024)(366016)(3023799007)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?YjwiTdaXkOPYuVTVUff31+/+Jh5PY8E3KrGN1JR0rFGKAXJjMr1r9gDDhC+Q?= =?us-ascii?Q?niW4+kZz0tunu8Zxl7/OcTYblTZ/JqWboKZRZTPJ7t9eUvOKOmXg67qMox7p?= =?us-ascii?Q?Zr4wXqqWsgHF1Zm/0ihmcVXsG7/iuZg6UQcWzqLuTIDlVY7P0/9FkDv/Wimw?= =?us-ascii?Q?9MgrS2Q4m619lIs4RKEPSpohMH7uh6IPlvCYtPlOKhBaff6LWslSSf0ngWXz?= =?us-ascii?Q?++726g33X18oxuR9EatPK81jcFmrjOPU1kSyC7+NVprcRikzPb8T+x+u08gM?= =?us-ascii?Q?6KkBpElViXbjZ4ucD0XG+2+nXA0AT5kNjbAbmqt4emJcKG/ypouktGHdaQ7l?= =?us-ascii?Q?HgxlK0Fkm/AFjGqwPji0bSKRwdWzx66Z147mHuavsaughI7gPrfhSHACBETW?= =?us-ascii?Q?d2Qm/6LYfNncmCyfajEAgXNn55ilUL90ubLDzK+Cpsgn5Vn3S8JWyYrsw3kl?= =?us-ascii?Q?paKM7k0jLcolGibVCMebYfS54ZzEe+DP8dvzWc4bHaJETU2BXaxrl43FE98D?= =?us-ascii?Q?aQPV+rzPbeSlml+ycop0Rxt/8znMBkjfVTmq+VCzyvS/Ze2gNUIZtg2x/uUy?= =?us-ascii?Q?OyGSbbXqA2vFxxCIweHDQmZPDZISc3BEX7at+sR7sn0ej6DiGwPrCKvCjCkD?= =?us-ascii?Q?qQaAdrjQUJ9BdWfVPoc0+1jCljjZg+D1QUbZ2mD5+cXbgPI9FuScDFJaOpnQ?= =?us-ascii?Q?FRDnGZUyyB/zdYJJT7ymBW6r+TejIbJ8rcakhWpWk0dkQVjJQarGxzbXYDtO?= =?us-ascii?Q?DFYFn3cHzbAx5b/WZiFL0933TFBaP/iQi18KMghyGd+0uaqyCI+0/T5qD6LW?= =?us-ascii?Q?XLY+EnVupRq/2TNrmrmEpQg6S3+jx88K9y44bN2NFtVhH7x5y/bEE38jeu/X?= =?us-ascii?Q?nTTeaiv8YVn4Ib9MWn9FBX/DzHOHy6EivbGzXEU/ZHApdjJXSe+ahnU3ihE+?= =?us-ascii?Q?U2p42I0+93s4gq8V7XDvnTWGemIHDXoIABY4aCV9ujUoOQYjYkETxKYd8gWu?= =?us-ascii?Q?E64OZK3wXA4quacRQd5+tlnANdyNnKcrfjAqO9PMRJLEYmYslcvVLrRzBNk/?= =?us-ascii?Q?RbxWGB+8utYsPgav2K0hPypfZ5uWFQC0ohG65YoA4HXZ8gHDtavz9jBQH0xw?= =?us-ascii?Q?o4CCbuHBj/B+nmLt0jpfgACsPBbTqyIiK9KoIDpo23QqrZLlyhz8OGEhTknk?= =?us-ascii?Q?lt3m2pAzlnFbe4ywHk/3u0/HihRJ3SonXvQs6hMIYQBKwVuru2glNihNVsDx?= =?us-ascii?Q?Qsg++l/MSED2VR9RJzzrd6ypSI/zNO+kdS6xx4Nlpfj8mbVwAboFeQLeZbMK?= =?us-ascii?Q?3ObiLgkoZL0vdYGraJ19QpsdjL6C0GujE2kYC5zQopjpc0rmukQvn8v2f7Yf?= =?us-ascii?Q?xe9bKHGj4YVdsldn+x2UQ+HeB8PwN+aH1GJGL3bP1Mo0jQjUbKrfSZkLnqJd?= =?us-ascii?Q?CxaJYMauiXuFsoz1iszmyBXUhFE0/uK7e2bJBcqlRQzl5LLoqFkJZBMqzprG?= =?us-ascii?Q?BZItP5U3dTLez5hsVejkIIgK2jbdqlvsxuLrKG1ZEt4NUapLUYxQtj+7RJMB?= =?us-ascii?Q?LXda2grIXFO0qtBSB2wqnUsZU61rHfT+JImvsuMzcr/Uq3sVRQZ9oVkBManG?= =?us-ascii?Q?n0lh92qz2eOMd9XUm+ctucrxjtrwBdjDO3Q/2nX0XDasRzjpmatbqBCYSpJE?= =?us-ascii?Q?r5D7NKccgM0IvT78IYtPV0k5+TvHCNG7aVpZFa6JxbbuKjJecU4j4OkBDPYj?= =?us-ascii?Q?cZOlsmSE5/HPpcDCYSDxUWj1ThBnySi+upUVN0G8wa850NRPQ8Te?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 8d32fb6f-f512-4922-9408-08df123d0023 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB6866.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 08:48:51.5761 (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: 4AR2FppQdYqgvQ6Sen2D/mK+8OVMGSk2DllaEJxyp/ikcgHAMm0wTuDbdEZS/XDJi0XccKwP4cONh/8Y4zLKOA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB4022 Content-Type: text/plain; charset="utf-8" Calculating L4 checksums can limit ntb_netdev throughput especially on embedded systems, where CPU resources are often limited. On a trusted PCIe fabric, we can skip that work. Use the optional ntb_netdev header to carry CHECKSUM_PARTIAL with its csum_start and csum_offset. Exchange receive support at QP link-up and fall back to software if the peer does not advertise it. This preserves netdev checksum semantics and interoperability with existing transport version 4 peers. Keep NETIF_F_RXCSUM unchanged while the interface is up so peers can rely on the negotiated receive support. Drop partial-checksum frames when it is disabled. Leave the TX and RX checksum features disabled by default. Users can just enable them explicitly for links they trust for lower CPU usage and/or higher throughput. Signed-off-by: Koichiro Den --- Changes in v4: - Move offload metadata into an ntb_netdev header (Jakub) - Exchange receive support at QP link-up, not on RX (Sashiko) - Keep peer checksum state per QP (Sashiko) - Advertise receive support only with RXCSUM enabled. Drop partial-checksum frames when it is disabled (Sashiko) - Keep RXCSUM unchanged while the interface is up drivers/net/ntb_netdev.c | 100 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 7 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 67cfe0f1a49a..d889c8538be0 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -4,6 +4,7 @@ */ #include #include +#include #include #include #include @@ -29,12 +30,19 @@ static unsigned int tx_stop =3D 5; #define NTB_NETDEV_MAX_QUEUES 64 #define NTB_NETDEV_DEFAULT_QUEUES 1 =20 +#define NTB_NETDEV_CAP_CSUM BIT(0) + /* An ntb_netdev_hdr precedes the packet. */ #define NTB_NETDEV_META_HDR BIT(0) =20 +#define NTB_NETDEV_HDR_F_CSUM BIT(0) + struct ntb_netdev_hdr { __le16 len; /* Header length in bytes, a multiple of 2. */ __le16 flags; + /* From the packet start, excluding this header. */ + __le16 csum_start; + __le16 csum_offset; }; =20 struct ntb_netdev; @@ -44,6 +52,7 @@ struct ntb_netdev_queue { struct ntb_transport_qp *qp; struct timer_list tx_timer; u16 qid; + bool peer_csum; }; =20 struct ntb_netdev { @@ -117,6 +126,7 @@ static void ntb_netdev_event_handler(void *data, int li= nk_is_up, u32 peer_caps) struct net_device *ndev; =20 ndev =3D dev->ndev; + WRITE_ONCE(q->peer_csum, link_is_up && (peer_caps & NTB_NETDEV_CAP_CSUM)); =20 netdev_dbg(ndev, "Event %x, Link %x, qp %u\n", link_is_up, ntb_transport_link_query(q->qp), q->qid); @@ -189,16 +199,29 @@ static void ntb_netdev_rx_handler(struct ntb_transpor= t_qp *qp, void *qp_data, =20 skb_put(skb, len + hdr_len); if (hdr) { + u16 offset =3D le16_to_cpu(hdr->csum_offset); + u16 start =3D le16_to_cpu(hdr->csum_start); u16 flags =3D le16_to_cpu(hdr->flags); =20 skb_pull(skb, hdr_len); - if (flags) + if (flags & ~NTB_NETDEV_HDR_F_CSUM) goto rx_drop; + + if (flags & NTB_NETDEV_HDR_F_CSUM) { + if (!(ndev->features & NETIF_F_RXCSUM)) { + ntb_netdev_rx_stats_add(ndev, len); + DEV_STATS_INC(ndev, rx_dropped); + goto rx_free; + } + + if (start < ETH_HLEN || + !skb_partial_csum_set(skb, start, offset)) + goto rx_drop; + } } =20 ntb_netdev_rx_stats_add(ndev, len); skb->protocol =3D eth_type_trans(skb, ndev); - skb->ip_summed =3D CHECKSUM_NONE; skb_record_rx_queue(skb, q->qid); =20 netif_rx(skb); @@ -216,6 +239,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport_= qp *qp, void *qp_data, =20 rx_drop: DEV_STATS_INC(ndev, rx_errors); +rx_free: dev_kfree_skb_any(skb); skb =3D new_skb; goto enqueue_again; @@ -316,6 +340,8 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff= *skb, struct ntb_netdev *dev =3D netdev_priv(ndev); u16 qid =3D skb_get_queue_mapping(skb); struct ntb_netdev_queue *q; + unsigned int hdr_len =3D 0; + unsigned int meta =3D 0; int rc; =20 q =3D &dev->queues[qid]; @@ -323,7 +349,29 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buf= f *skb, if (unlikely(ntb_netdev_maybe_stop_tx(ndev, q, tx_stop))) return NETDEV_TX_BUSY; =20 - rc =3D ntb_transport_tx_enqueue(q->qp, skb, skb->data, skb->len, 0); + if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL) { + if (READ_ONCE(q->peer_csum)) { + struct ntb_netdev_hdr hdr =3D { + .len =3D cpu_to_le16(sizeof(hdr)), + .flags =3D cpu_to_le16(NTB_NETDEV_HDR_F_CSUM), + }; + + if (skb_cow_head(skb, sizeof(hdr))) + goto drop; + + hdr.csum_start =3D cpu_to_le16(skb_checksum_start_offset(skb)); + hdr.csum_offset =3D cpu_to_le16(skb->csum_offset); + hdr_len =3D sizeof(hdr); + /* Keep skb->len unchanged for retries and byte accounting. */ + memcpy(skb->data - hdr_len, &hdr, hdr_len); + meta =3D NTB_NETDEV_META_HDR; + } else if (skb_checksum_help(skb)) { + goto drop; + } + } + + rc =3D ntb_transport_tx_enqueue(q->qp, skb, skb->data - hdr_len, + skb->len + hdr_len, meta); if (rc) { if (rc =3D=3D -EAGAIN || rc =3D=3D -EBUSY) { netif_stop_subqueue(ndev, q->qid); @@ -346,6 +394,28 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buf= f *skb, return NETDEV_TX_OK; } =20 +static netdev_features_t ntb_netdev_features_check(struct sk_buff *skb, + struct net_device *ndev, + netdev_features_t features) +{ + if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && + skb_checksum_start_offset(skb) < ETH_HLEN) + features &=3D ~NETIF_F_CSUM_MASK; + + return vlan_features_check(skb, features); +} + +static netdev_features_t ntb_netdev_fix_features(struct net_device *ndev, + netdev_features_t features) +{ + /* RX checksum support is exchanged at link-up. */ + if (netif_running(ndev)) + features =3D (features & ~NETIF_F_RXCSUM) | + (ndev->features & NETIF_F_RXCSUM); + + return features; +} + static void ntb_netdev_tx_timer(struct timer_list *t) { struct ntb_netdev_queue *q =3D timer_container_of(q, t, tx_timer); @@ -369,6 +439,16 @@ static void ntb_netdev_tx_timer(struct timer_list *t) } } =20 +static void ntb_netdev_link_up(struct ntb_netdev_queue *q) +{ + u32 caps =3D 0; + + WRITE_ONCE(q->peer_csum, false); + if (q->ntdev->ndev->features & NETIF_F_RXCSUM) + caps =3D NTB_NETDEV_CAP_CSUM; + ntb_transport_link_up(q->qp, caps); +} + static int ntb_netdev_open(struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); @@ -391,7 +471,7 @@ static int ntb_netdev_open(struct net_device *ndev) netif_tx_stop_all_queues(ndev); =20 for (q =3D 0; q < dev->num_queues; q++) - ntb_transport_link_up(dev->queues[q].qp, 0); + ntb_netdev_link_up(&dev->queues[q]); =20 return 0; =20 @@ -420,6 +500,9 @@ static int ntb_netdev_close(struct net_device *ndev) timer_delete_sync(&queue->tx_timer); } =20 + /* Apply RX checksum changes deferred while the interface was up. */ + netdev_update_features(ndev); + return 0; } =20 @@ -475,7 +558,7 @@ static int ntb_netdev_change_mtu(struct net_device *nde= v, int new_mtu) WRITE_ONCE(ndev->mtu, new_mtu); =20 for (q =3D 0; q < dev->num_queues; q++) - ntb_transport_link_up(dev->queues[q].qp, 0); + ntb_netdev_link_up(&dev->queues[q]); =20 return 0; =20 @@ -496,6 +579,8 @@ static const struct net_device_ops ntb_netdev_ops =3D { .ndo_open =3D ntb_netdev_open, .ndo_stop =3D ntb_netdev_close, .ndo_start_xmit =3D ntb_netdev_start_xmit, + .ndo_features_check =3D ntb_netdev_features_check, + .ndo_fix_features =3D ntb_netdev_fix_features, .ndo_change_mtu =3D ntb_netdev_change_mtu, .ndo_set_mac_address =3D eth_mac_addr, }; @@ -583,7 +668,7 @@ static int ntb_inc_channels(struct net_device *ndev, =20 if (running) for (q =3D old; q < new; q++) - ntb_transport_link_up(dev->queues[q].qp, 0); + ntb_netdev_link_up(&dev->queues[q]); =20 return 0; =20 @@ -716,7 +801,8 @@ static int ntb_netdev_probe(struct device *client_dev) =20 ndev->priv_flags |=3D IFF_LIVE_ADDR_CHANGE; =20 - ndev->hw_features =3D ndev->features; + /* Checksum bypass assumes a trusted NTB link, so keep it opt-in. */ + ndev->hw_features =3D ndev->features | NETIF_F_HW_CSUM | NETIF_F_RXCSUM; ndev->watchdog_timeo =3D msecs_to_jiffies(NTB_TX_TIMEOUT_MS); =20 eth_random_addr(ndev->perm_addr); --=20 2.51.0