From nobody Mon Feb 9 10:39:10 2026 Received: from OS0P286CU011.outbound.protection.outlook.com (mail-japanwestazon11010068.outbound.protection.outlook.com [52.101.228.68]) (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 87DD230216B for ; Mon, 27 Oct 2025 00:43:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.228.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525823; cv=fail; b=Y89/2kCjJUA8F/hwvmVAnlmPY593L8WflbpGvhlwh5fTKlxTkt0iHaCY7ZrljRduJMHnFHG7KTIHXWX1Egt7Tz5WjFgxrRvwnzq1Z363SCZSgxt0wstlN6YXsaAoh2dWZV3vMAIaLN+mbocsbrldw2u6t+XJG85d+X0jR6UAwxg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525823; c=relaxed/simple; bh=f1DcVD4FVGgEc67x2e7AiFEuJMuqJQAwHbMFLxCKrls=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=JRk5DE9mHE3pJlqfbyDPW9Izn3AdWma8EGoPoa2+ovWwl25uOvOfSbqwORi1lqWQQssLCXHYxcGtqv83QFj5hL4GEoWFLOSkKJ21ZiFVxAvlisEDX2EVBzkkgtrUR4nw90fPWuou/moHE02ha5EN3Sy9ng8b53dI03gJSuwJMv8= 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=C/sDx4Vv; arc=fail smtp.client-ip=52.101.228.68 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="C/sDx4Vv" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EHfq7iAWV+PrdoGNuaJKOSI9lAl4z57NbEgCGE5IrnIMOQxlbW5GmX51iypYSfXRlBw1bKMGl2+mePm19G0ef4v8tBm5TTScsM4yFdOGVwAOh1bTWRz8npYpjz83jfBy5lzfG4r1174Fmg6Wlg1l/r1VXP9MtIUXwWfRkaS4a/KnYYy5AJjLRsOh7FnGuJtMZUtYN1KTyLGsutEMKEBq79f4ATVaLoMa//rGv/17saYeOkomiZBSVCK1wc/8wC+gsSCY95dLtdUbdU5sOnw5IHCcqMeiMglVlKG8F81ZCGZsRzY3p5VCjnlwEpeUbg7oAkJiI7F70+JGbQJ+uFQXZQ== 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=bqmBZ0b0KEzsxlw7JhqwVDPbN773yjB0HnGZDg42r54=; b=IzLmZy9YttAyB/Hi8pt+tJrGPkWLQO9oiBpGFsX26JienIC6RQ2Od05wr8ceTULFd6z5Fn2MZr5BCM06V/NBdsLr+AlmW9zaNuFF3jbIbKCtMkE/gi00yXjFsKavX6hjoHg/hhkqGvrR10XuZZWYaAYx4iAwW3OnfUMSzzGG0LlKEzJ0aWdEGj86fvg3yaX8QAf74MxLgfncB9n1yyydGQCC3iTKuIVhDH5/j4IpoqlSj7WQ5s4z1oZzA+EwctJ3A2EotdZm/0A40hlEg5+sqGSJekKtMukoUSsMTl5+3dhzYcFXFdoUPJrWrRmxVXPat5umGvwtfYxF+N/4upietg== 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=bqmBZ0b0KEzsxlw7JhqwVDPbN773yjB0HnGZDg42r54=; b=C/sDx4Vv3ks+DB+j9zWU+ychFrfGwGOgCvUrP3+kMgXVFe1NcSny0TUiEsN4ltKYBCKUsH1wiLGgVhDxzJqDsCE8xHN2ha9TSWsDl+Oc/zvYu96aE9Y5YDizCvsLAd0EHihMz8AmR5+BpASUnRkOoYRLNgJLgGTL80lpKrSTfEI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) by TYCP286MB1588.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:185::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9253.17; Mon, 27 Oct 2025 00:43:37 +0000 Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a]) by OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a%5]) with mapi id 15.20.9253.017; Mon, 27 Oct 2025 00:43:37 +0000 From: Koichiro Den To: ntb@lists.linux.dev, linux-kernel@vger.kernel.org Cc: jdmason@kudzu.us, dave.jiang@intel.com, allenbh@gmail.com Subject: [PATCH 1/4] NTB: ntb_transport: Handle remapped contiguous region in vmalloc space Date: Mon, 27 Oct 2025 09:43:28 +0900 Message-ID: <20251027004331.562345-2-den@valinux.co.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251027004331.562345-1-den@valinux.co.jp> References: <20251027004331.562345-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0026.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:2b1::6) To OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) 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: OS3P286MB0979:EE_|TYCP286MB1588:EE_ X-MS-Office365-Filtering-Correlation-Id: e130982f-e37f-47f2-a7ca-08de14f1dd75 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|366016|1800799024|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?BrbwlFtQzYLeFXln96xLRsOMDxpu8yRhOG5JBNydJnLcaXWl1w+RzT4jwwcm?= =?us-ascii?Q?GMX1GBNxYb0xTDImBocQ25ru/uk5QYvtsWtnOIg8bTXhZy/n4hsKlKcRh+FW?= =?us-ascii?Q?7idI/unMqkOZM8Ys3yyrp2Aa6sqHGX3XUThp7QISqKKk/ZCcfs4rJLt33EiF?= =?us-ascii?Q?9OcK/PuF52EkcY3vnHZKitt9bx600CXkjodfZnlyJ4S22g4KiPVwuoR5b7d7?= =?us-ascii?Q?e/m/IlS1nVzzEz6hzcEd4L1jfr63VyD5+ca8suzXodDVwdghMSJzHNsjfOZx?= =?us-ascii?Q?dJz/2+1OPXX7TW0zfhOTABU3iQcGiL3va6gf0hI/Dlu8R3K+VGMRGWhFzZXj?= =?us-ascii?Q?B8WhhH8zdjq/ZwEH5cDpLXz/urtIk93xOaF41jgFKywr6VL6xcbwrD04TGNz?= =?us-ascii?Q?/diLSe+Co9n1lQuseAPEZBbUPM+ZmhkV1e0xZ5U7vzKwnRWwv9NIvwslYW1K?= =?us-ascii?Q?xq7ICqxq7djLl4AzxoNb/dBEY33xOEOlirYDNIX9UuiFIvyGWoRo/WwWu8IC?= =?us-ascii?Q?NhBGPopZ0pL+VQPAYK+ExhI+D8pZVgY5hfdWQoAEjwAS8q1NVHhqZd8cImmf?= =?us-ascii?Q?KLcr6SQWJ12cjDl898pXrX5FDVQAXeBGy67vWrkhdKnmOvR+FvSJO+QpVQ5c?= =?us-ascii?Q?cHw8REZ4TUs1R4y6Ho/IJ1xciOqtc6UuOb9eeKQptMSdw8OAApNQAusMbWzA?= =?us-ascii?Q?QmtnP7fCgzsW/KfSTpL2kf28OY0BVJie2tq0hann9+B2x6zPqZF6AJpcOqYm?= =?us-ascii?Q?a1f1GEXEmzz9qLadHZdQbUjLZxUdupOW4OCZ7gqG10QT7Tg+DHEwQpqdhKWC?= =?us-ascii?Q?8yYYE8+0KLsPhRsPtjG+AmtxQvbKf0EErbssKEwVR3aLAqDgPoa0/OrfYj/p?= =?us-ascii?Q?XVmKYSP8E0LmnSU828Dd+Y5inHGniV0UN0MIN2StqhpKXdN6VV3D6UhA0PdN?= =?us-ascii?Q?RAZoEbZ9xaXzTpQi2EicMiqXDoO2gfPhJQNkVRHLgmBiwvV827bdbscij6+w?= =?us-ascii?Q?8TP2NG23aQxRi62mpa4BKSLOt5RBQ139iVcoQAM1L6Wql2d0mDyCI+BrRGHe?= =?us-ascii?Q?KAN0g/k67nowRCRwkpgDeuQEtBXQc4k82NRgLWWYg6VJINHyFvm/P/3A41Jc?= =?us-ascii?Q?e3nQtS2/24bQjDYT7IPFo9qc71TlljeNrXmAQ63KMGqpdY9OSQqbTgqt8n92?= =?us-ascii?Q?ew4tR4hd1KezRza0i74tFQsZM6OmgivxryqkIglcSQFAjrenq8515PcXj3+Y?= =?us-ascii?Q?DIA3YgCy07leMXwA+uN6xrfDvI5aLa88n/6gRgHmWU+Slpcr169+YTYHarfl?= =?us-ascii?Q?xlthVIiQDI/8NvvmMi+v8fFtJiMjlz5obcUDpefZ+BkoioiNHqsBnXN5MLLu?= =?us-ascii?Q?Vk+/+d59Y22iZPAW3Zy17a9PHpMC5keq+1v9+Wc3ZPKUrcfOifMsimy4mBZF?= =?us-ascii?Q?jFkuvjz3NDy9wmPZALHpC3eJJcJp3fqK?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(366016)(1800799024)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?p6wcjgpbm+lgfR13hFJsKGpQpOyBspMpn8RAt0olwDVc8B+4mXbsLz+kghqq?= =?us-ascii?Q?8oWjnqBT6bUPNiBz4Wdh9tIw/oM6HINBqwijQ4Jfc032RjN7xdlZPeyrddX/?= =?us-ascii?Q?HutIX0vMc14qYkwPT5ZaorFytsQr3ko3hWRa5LytjVhA6EoWFoP+xeTHjOXW?= =?us-ascii?Q?8rgQdXguIAwzv1/pwz328vhDzo3TpAaT4pFGRyV3M7prA4c4rymSHAOPJ/Hx?= =?us-ascii?Q?nAA7nVdq1hTXeJRyagvAhCWONMSSJUyq47AnPuRo9hcuaemXj7ek3N+cfYkI?= =?us-ascii?Q?M3DHtghaiEg1L7vuq6i3NVrNOTQYLdQ8nnADetTmPkk+GDrE5lIen26OtQl2?= =?us-ascii?Q?eC5tN3TE9aLpUmIyS4Bpy3+Xfg5tS1FCOQYuURzn1l8ZRNcP4hqfjj3lIM8u?= =?us-ascii?Q?5DahL53WIOqw5m7rQlrWg+hAcXinXiE+YChpW20Ycm1P7J+V8q/aoVL4S8a4?= =?us-ascii?Q?/3G9qkEt3Qv77Ri+sDkamLAX0FHDh/ezFVedJU1tBzeEAQqRqUiUCOv9EFzs?= =?us-ascii?Q?73rEUzlrNfJSAt7YapJAmYAXEY4uu2F2CuKkjMdQalBcrG38fxlOCvO3pYVi?= =?us-ascii?Q?Pi0zMzGyITDazAS1xquDIsHK19BzSVCo46dHV28lf3YkGo9RW9hC2BAfc241?= =?us-ascii?Q?Lvw9cyy+sWsYOYm7eH++JCk58kMMipU3NgQLNobKvz/IIwA1Ga9k9vjOmKtj?= =?us-ascii?Q?LOGQ3fNNvRB7vD1wLvUiTrwiQxT50lqoTvarH6/zynOlL9MboT1HYzZjipUL?= =?us-ascii?Q?tpt5+SprEwzJx1C0HxIQuBBs9lJwZozGBBA+wuzGW+2R3tPsIH9aMpe7FAe3?= =?us-ascii?Q?Vr/WKSn1izh14wBDWt1DpKcfbC61+nJQaYHlYA5/90DoCgkiiB/hbVe2zIPu?= =?us-ascii?Q?uYFOwoqPbyMX6mIKtz31m7u0RnWy171knk3nZ6TP4XbdA/NqeBOK8TDfIZu3?= =?us-ascii?Q?tyBPwuVozZpb3AepNY0TLWb/Yn8Q7SKkg9h2A8ZkJocFoHy/oVn6oIoN5LKP?= =?us-ascii?Q?72OeZ5zdD+rkm6HJiDJPkNtCjtYlUhNAoV1JgiwNwfURx0MBAkbn7KLV8q3s?= =?us-ascii?Q?gc0oP54+XZVakVNcXaQoFB9giw5u0nlIZe9Nz6wkhGfUaQ3FfyHOHdjAirJI?= =?us-ascii?Q?s4kp4awW0Yu3RWTuycBE+EDRIV10Ou5hR7o0e4AXm3VKGRiAAUquBOIhdxQQ?= =?us-ascii?Q?7ujdxtU0liPvEt1mwOD3uky6Ue5tTGIS3inWbrQ4HRzhppMBoq1g0Tjs9Q7W?= =?us-ascii?Q?iipbc86zgZfZ+JSD8lA36/HAhv9HLE+1Sr3MX8X2Uafym6aGStw9WrylUXvn?= =?us-ascii?Q?DVzL3XOwMrzscLrp7UjbVvVoz4FFp+yFUQHBDz5Ps/lphzx7L5UrgEf3RN4h?= =?us-ascii?Q?o6QKD6cXZYiKjJtJ4IGGVg7l3g5TlnuM+UlVx8u/Nj6ko3gKxHsfSehso3qk?= =?us-ascii?Q?1vb7R+//YDxk3guu1E4zfuSBEcOJgXniwGJAUM85OJm2T+vk8260aVgryQ8A?= =?us-ascii?Q?S+4u0Ax5GEUowjREgSrO8HLlVTKmq6UG01dRnXRQyleqnjx2CR03nhYunjAC?= =?us-ascii?Q?yQ8Gx/lDAF7njOAvHSqocdgdC/KGhk9R/JUNJRl0BDQz4uhPSMaQ7xHxmpc/?= =?us-ascii?Q?6U/gsaYuSOBS1R1pGsugSMk=3D?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: e130982f-e37f-47f2-a7ca-08de14f1dd75 X-MS-Exchange-CrossTenant-AuthSource: OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2025 00:43:37.3377 (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: EV9K8K7sXYitaHMjdlo1gumm/A+c72jXBknfp+1x5SpzG/7y/dikhNPa5qdpi0jeU6TmpUSW+HeE07AKoA3Bkg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB1588 Content-Type: text/plain; charset="utf-8" The RX buffer virtual address may reside in vmalloc space depending on the allocation path, where virt_to_page() is invalid. Use a helper that chooses vmalloc_to_page() or virt_to_page() as appropriate. This is safe since the buffer is guaranteed to be physically contiguous. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index eb875e3db2e3..b9f9d2e0feb3 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -1546,6 +1546,11 @@ static void ntb_memcpy_rx(struct ntb_queue_entry *en= try, void *offset) ntb_rx_copy_callback(entry, NULL); } =20 +static inline struct page *ntb_vaddr_to_page(const void *addr) +{ + return is_vmalloc_addr(addr) ? vmalloc_to_page(addr) : virt_to_page(addr); +} + static int ntb_async_rx_submit(struct ntb_queue_entry *entry, void *offset) { struct dma_async_tx_descriptor *txd; @@ -1570,7 +1575,7 @@ static int ntb_async_rx_submit(struct ntb_queue_entry= *entry, void *offset) goto err; =20 unmap->len =3D len; - unmap->addr[0] =3D dma_map_page(device->dev, virt_to_page(offset), + unmap->addr[0] =3D dma_map_page(device->dev, ntb_vaddr_to_page(offset), pay_off, len, DMA_TO_DEVICE); if (dma_mapping_error(device->dev, unmap->addr[0])) goto err_get_unmap; --=20 2.48.1 From nobody Mon Feb 9 10:39:10 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11011008.outbound.protection.outlook.com [52.101.125.8]) (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 E8A2930E0E0 for ; Mon, 27 Oct 2025 00:43:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525824; cv=fail; b=rqrlN57be6LtsXPAabjaOmBUOezpFqAjBG7Nrgo9En44pHXX6PrVs8NAG0wRwWV+GudBoJekJEv0tez/yP6BCPbYXQ0bFVWE/HZA3Dnn7ySXfoUrmEazGkcsQFDMKXQGXzhdPJ/RxoPdg3kZfIfW1PGkbnNLHSgcD2DZXgYN3O4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525824; c=relaxed/simple; bh=W38PhgoS7uPLwVb/qcb4qzJ5B9MH7l8ib7uACT3AQWc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=IycUHaN/vK6Qqmwy+1VM2iYD8Dh75ARMoSyOUBR7rzgYWa9T7nf3t9QlG7nVXlBF3BqrpgD+yplSOxmcOm/zEnukPNG+EBpqG0EVT9B+fGtMl4BgI9EgJtx7S/qUeJVOzTuoIFaYRgF2+ooEfNwf4xkTTdapvsUmZiucnJONPtI= 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=r5yGRWay; arc=fail smtp.client-ip=52.101.125.8 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="r5yGRWay" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fmGbq1J+STjSseDDtePIf4GR89Rlccs7vaI2pa4OPVphLq4diDaOqx3RS2vMQd+yds/M5j0L5lwHpxJZAjbFZ5U8n1cZQ6N/t9wOqdfwZOqKoCx/7Nc4Nf+FS3JeITukhnkWfzEiK8dn3lb6EaFjFVJh8Qwnsd6HERPzuPALnOFc0nPhd4/fd21Do+Rqb+eJIUVfEw96F22Byzg2npswD0Eq74FrHHJXCyggWoSXBQg3Cd9Oy/VNnpjjKRbmtIPkmLMJYQRtMGLxzuJhgLELE5zEm+cyxFDUDtTBAXXiALbQ95P8Rsq0cbmfUTEI0KBpQbO/ouEdrLB4FJ+p29wP8A== 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=G8aP1OkHraJPd9pyLmS5msj0JExDdKyzQ0ug2My4kKA=; b=LQlNt9vjGtVjwDpxhJYqqRTpJ+Y9BrXIQma9x2Hv2KYbQAVdazeCYf9UIYDIoxVhYtt47477iNQCTr4Hx63HEQRN6K8gkffGmVp3GGuF2GO1/osHtTAPYeKXGhUCkTUBbLFQMYhgypOU1oZho0pIQAaLk/BXG9z5a9B9tKz6iKsTINLlaqJTxwhyLfgNhrCnffc06VZVeQeO/+AlKm/PuCErMlFZpmyRJdieEpWkO0QKZiZ7gTr3FquvEGia8c60ITmCggDyQQzAki4LluyHOwmb17goNGzRqN165Uc5DX4cQTJS6Qqx+V9ix3rgluuqI8KB63V0kv04MJtubT4O3w== 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=G8aP1OkHraJPd9pyLmS5msj0JExDdKyzQ0ug2My4kKA=; b=r5yGRWaya+yS7+TOtJ9iLdAith1cpzHcUoYLKombLUyUMjE20kEEC46/zKGMQPZP4KZDVQ2tdb+mS/CRtbFcJRYXZ0j5Zl9F5zBsDA69+dwfo1Y9Fk+nl2DpUHw9xRrKfTIdr+PDdzjMFOoYSoF6ySefPgnJRcDKjXyNh3gbHR0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) by TYTP286MB3461.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:39f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9253.18; Mon, 27 Oct 2025 00:43:38 +0000 Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a]) by OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a%5]) with mapi id 15.20.9253.017; Mon, 27 Oct 2025 00:43:38 +0000 From: Koichiro Den To: ntb@lists.linux.dev, linux-kernel@vger.kernel.org Cc: jdmason@kudzu.us, dave.jiang@intel.com, allenbh@gmail.com Subject: [PATCH 2/4] NTB: ntb_transport: Ack DMA memcpy descriptors to avoid wait-list growth Date: Mon, 27 Oct 2025 09:43:29 +0900 Message-ID: <20251027004331.562345-3-den@valinux.co.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251027004331.562345-1-den@valinux.co.jp> References: <20251027004331.562345-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0080.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:36d::12) To OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) 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: OS3P286MB0979:EE_|TYTP286MB3461:EE_ X-MS-Office365-Filtering-Correlation-Id: 33186b7b-60cf-4736-1a43-08de14f1de83 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?SPLQsJohazRkh2E4PkNANrn2HfGwXOsDmke4azDeqPxJQa2nvywjcntgbt57?= =?us-ascii?Q?QaX4VmiB+ocSOKMKnEu9lQTyFw2tzpLvg8v5H1tA/yZTVeYLnNO8+xv5ZSIU?= =?us-ascii?Q?tqDWo+uLPtRaIXPmrCk8SVvLboPyoN1/0XN+gIbsyTGUa7Z2pfsso08lDbxR?= =?us-ascii?Q?xNGvYqtzGue7RbA7T/5tV34l0inHJ+crlSK370PL1c1YfCl+FqOb++iNot+u?= =?us-ascii?Q?PE9xhYFXkVTm/gu2CNmXojPW3zHTNvrEO9BxTi+rA12dvqu9APvk/WtrZb5p?= =?us-ascii?Q?K5cpHNHOQi+H11dPNDrpWCRU6bO1qNBzBTKmvE3+JPVatNdPFZoQg3/xnEAW?= =?us-ascii?Q?HNs4YoF2NR6cDoCLUgvxQ5hGhy0wVx5kHoWlZUwFzjAWlK0QzzuXuEv6XPW2?= =?us-ascii?Q?1DRtiazcndCFY3NpWkHRQIDalKoDEo7NQ4mYZuTdlA+Gk/pG0O8fHgAoi5m8?= =?us-ascii?Q?ZBjO0bCvD7C8Iw4pEsObQyze1fXggAuXH9daGUGYTUkR2htMaFMmJi0ixgIg?= =?us-ascii?Q?3l6UentgL8NXrsmHWNOV+MCh/UPWzaoPv0oCYbuqHCmW5BbNUzpXTsckwL4g?= =?us-ascii?Q?mY4s2dkFbpS18SoaILzawQWBBJL1YkwDoy43zX7zY9qXUC6ju3/5BXXactyF?= =?us-ascii?Q?XxJS8htiYRAZbP7loDdvNUhdtlxJz4STfHO3oyFc8ka9ThqVzcJokqjr31Ir?= =?us-ascii?Q?Rsr1yuQqNginEbkPzDsl3J7D1w4nUpQ9aVpui44MED2wVly0EWRYdf91CasT?= =?us-ascii?Q?elfeLcKosdqrie4ri3e2t6xRK2g/uF0lVKX+fy/AbnnHX/ZXsWyslXgT6pjf?= =?us-ascii?Q?gFnD2wDat/oQ6nvsqvABRPjJ2p4r8poc50Ps4OmSDy7JVkZYrM+/yRCwifAh?= =?us-ascii?Q?5K44nGJtO2UYxpQhJ/URNncnXnmzFGRi5HPSa/zIBHQt35Xq+N4bqNzOAOF/?= =?us-ascii?Q?BlRrsy33dUbk4mHwWOMsRHoq1LAcqMqnyRR87Zpzk1K/pvE7hpgYKOvYkIJV?= =?us-ascii?Q?t8XF9cBP0MsuwObUiSBbTS7JX3rTdyV6YtSvQJ8zcp8XLA7rwCyH4Sv1BSCq?= =?us-ascii?Q?V1j0MSTeGAj0TUETlkWBJRIj/ZuC2OuHcEGbOKjhtjD6lBXLQPtVSjYDKehG?= =?us-ascii?Q?tkP2j7cR0AH45AEMAdG/Ugxw+PVsKErL40KW2BZIKQsUMx4levf1wKXxPDGT?= =?us-ascii?Q?11d+b/4V11iSPOxWmL6aMQJM3V5tbONMIhWDMa8OWZ9S5ZMgksfGNxLhUlpd?= =?us-ascii?Q?ElFs+t1tjQAG9bmqP+umNERhrRwK0mO018k3i20ldVkQonNfS47GPFXXL+Jv?= =?us-ascii?Q?FVMBwj0HlP6XNanVg1ylhgZrNWeTXcgZ9oKfrxEEVjH7X9kr6SBPRT/1hVRB?= =?us-ascii?Q?DPjrBrFO97s9sFa3yx8ikg2xqZfgb5T72Os/5JiJR8GJPqxwfom4p7kmowE8?= =?us-ascii?Q?3W4beJYh+9I4udmpyFhuRFxud5kZuy4j?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?jVRlPT0kEvc7YkITr5/AwArPVurZhvBPIeRMmN7J8HOV26h9/0sRqm00smwh?= =?us-ascii?Q?PSrgTD/sXgZZlLPBJHk4j8wfSoL4Ild7inF6WRAOaMNeO6yxkp98k0Y9m8iy?= =?us-ascii?Q?8AMGpZuz24Ex/4lIrvqNHGxOXmlzuEwJ80DCnKGi8SxJLVTGWa9yqgdmBdLz?= =?us-ascii?Q?r0SAOHDvW1HhxJOK5ZxOBlY/yiPLyMVfGgQ7sQCIJk0Y/9SOSHtlqRQj4jx1?= =?us-ascii?Q?5xj5YjS+lQQieouU5xHtdlWi0TEGna/frL4r/4Fe+Oz6YdH92mestT6V2h5o?= =?us-ascii?Q?cEfJs3bIPyQVav4VT5PmVsImjblUvTZ38qkHJJpOJa56Ahfi+IqLNd7TnwMe?= =?us-ascii?Q?r0Pnd4p0I3kAbeV5mPnic5pfneyfqf9VB92FNIawBia4J5rHWhVQO6IN0IUI?= =?us-ascii?Q?t345piqK8sgUu5kM2oSNf2IFRrNNEoObTsDXD1lk304alRG+tRR7P8nmKkqP?= =?us-ascii?Q?YCqMmvEeb/n/UV+kZ5cOCvo8PrgLaBZ6tdbth7o/keo61zstqwTG56ulel0a?= =?us-ascii?Q?UaQdJI1BVCg2xWTlYp8LWCFezNHXTug+dt652iROTr8bYKWU5afxbnn/hURq?= =?us-ascii?Q?el0AESKy3fwZTvT2+Ml1Co+fXOlWzj3Wx+ug4guUz1YCCZbnRU476Ak3ZBb2?= =?us-ascii?Q?s5Y4NkPFfD8mmFy4ZnoWGhltsejda5nvQWpXYg+7hbXMO4XIt/AgyMqbmEQk?= =?us-ascii?Q?VWJu0iUA+0dh0SNPBHTMkwtJK4gaCtOZnabAuZcCKy1qQZm2OSaHr1v6ja6r?= =?us-ascii?Q?mDHnN0CW/j6xVxUoq1P276ztrkjv91+Uv3lyNaAQ3+cMD0Nve6YGh2FFFGUQ?= =?us-ascii?Q?Bk23ZpQC5vDeWOQ+kpZ4HormQ2hGj7gthkmpZX6c62L7i30FZwISllYG0i/y?= =?us-ascii?Q?LRw3AgTispfSYjw6czL4dnY1mvKD4cFg5df5aiLHoFf84LKQ6xZhYTvXEfIO?= =?us-ascii?Q?R+LycNv4LCcTrPs1V3chIH9OkgpxVPU2E3pQTCIn3ddoZVuym9Iwz20tvaGG?= =?us-ascii?Q?E5f7LFBNLNI6rZxNnSyzv8HElpguVX3bx8tvjpxtCJnVJo8mtenXgsMD+Qs6?= =?us-ascii?Q?WMy3qCTrRF5nEiLjXO+bvzGOZqKa2pPX9JkVmnGjCRlFdq2c3GnxmY91DUUb?= =?us-ascii?Q?oePDobRxG00ZT9B6emj3cDGgNBYoZbyBBmd+CcfVzfCrZEvIStYpF+AUTSyd?= =?us-ascii?Q?wXu7EOkIrO0vIhOzJ78BV1z+5ye01t3uffNaNQjK8QRbiIBm+SbrkacN909t?= =?us-ascii?Q?/PGsmuA3vsgXzVGcFOXrZ2MXKoaPIGVrvLeVQhrCVFegNGZ1gbnjSfRvbLpq?= =?us-ascii?Q?CfefVUB1G8SJQfZD2ldQk3GQpWYgaJr4cVslssvayzoI8iH5U6WvtZ1sjTNh?= =?us-ascii?Q?OfhvNwdVZvG2bKKNQ3ul5KyNCrfVwqsIHHH3ak5YY0W14IShlM+oa6gl4EuQ?= =?us-ascii?Q?gfpSzUcjEHdlxkl0Hmkdv5U07DGEFl9EYQu4woi4oBfNzI410om1tSH4mVHU?= =?us-ascii?Q?Bxwf/rBQwPq2e3+8Nvbl12X6r3lzVaUxsgC5S4zMF0AvRVycI2KylNGI085Z?= =?us-ascii?Q?rvwOikezhklTbvw9RbkXHlHKeOIOX/bPHDYv+neM+jUOpQuKrg1TFhzCt1Q8?= =?us-ascii?Q?rPN00/JiD8LxZsTTsz3lSR0=3D?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 33186b7b-60cf-4736-1a43-08de14f1de83 X-MS-Exchange-CrossTenant-AuthSource: OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2025 00:43:38.7076 (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: W3p5wI0fKIFWZRPeJd/YCkNdJbh6/WbAaRbiUQ79lIsok2BQsRo4U1MwDKhahZTLGerC6XIb/UCtFvqimwx1aQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB3461 Content-Type: text/plain; charset="utf-8" ntb_transport prepares DMA memcpy transactions but never acks the descriptors afterwards. On dmaengines that honor the ACK semantics (e.g. rcar-dmac), completed descriptors are moved to the 'wait' list and only recycled once they are ACK-ed. Since ntb_transport does not chain, inspect residue, or retain transaction descriptors after completion, we can mark them as ACK-ed at prep time. Set DMA_CTRL_ACK when preparing RX/TX memcpy transfers so that the engine can immediately recycle descriptors after completion. This prevents unbounded growth of the wait list, which was observed on R-Car S4 (rcar-dmac). Engines that ignore ACK or auto-recycle descriptors are unaffected. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index b9f9d2e0feb3..a447eca27d0f 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -1591,7 +1591,7 @@ static int ntb_async_rx_submit(struct ntb_queue_entry= *entry, void *offset) =20 txd =3D device->device_prep_dma_memcpy(chan, unmap->addr[1], unmap->addr[0], len, - DMA_PREP_INTERRUPT); + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!txd) goto err_get_unmap; =20 @@ -1864,7 +1864,7 @@ static int ntb_async_tx_submit(struct ntb_transport_q= p *qp, unmap->to_cnt =3D 1; =20 txd =3D device->device_prep_dma_memcpy(chan, dest, unmap->addr[0], len, - DMA_PREP_INTERRUPT); + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!txd) goto err_get_unmap; =20 --=20 2.48.1 From nobody Mon Feb 9 10:39:10 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11011008.outbound.protection.outlook.com [52.101.125.8]) (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 A7A0E30E854 for ; Mon, 27 Oct 2025 00:43:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525826; cv=fail; b=dnwa0Vz64hLcSRr+124zlNMU+rzSW4yR6wshD03CP8sJt2My51rBofrZwYqRr+OM+TdrY0YZYHb6Fx0Kw7BQ88SEC6+GS0e35PN1KAm/jaxaECBpZzH83NZ+ZznuYg0GDEG5DAElM6d2XqO99rG6nkAk3YA5HS0kPNaV+ZD0+I4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525826; c=relaxed/simple; bh=zadNKUlkXnCyHgCtNGuLV+IrAYjQjD4WONOObgiQnn0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=BEVjyx5PoOcwhgGhg8qDQ7kIfmTJpxqQVgXFo5TGXLyAJHFgg0W5a0OmMLk2o/+mZ/QHvbwog88kjU7OYG4SlgslJZ2o8U62BFTzeRbYMmBjSFjlskCVIvA0RukvijCH4T5hh88kH1jzhpvPxVlzYp4FxGRi4tWozLgtmQ3Bko8= 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=rTps8Mb4; arc=fail smtp.client-ip=52.101.125.8 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="rTps8Mb4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JCFAGkYJ4XmFAGAsBzDh6L8x2UIKitMJvMd3KqHourUwh1I5bpniU7pXTyR5kUXBxuOMnatUu32Kx+fhWG+DeYm6r2Bn5BOxozqkUfZ5/9z8yd/82ow2LU4qjXLkW0AxuPGETvopbg/7MaRXWt6x4jJ6cOuVTb00uWMcsGbu3nDQbQ2+nVckRyJaP4nc8ghUdOdnHhFKpNIaWtO2ySmiZXlEiP3dMbZk4JbxzTBUj4j70fyUH9mR8E9Amt4Z/d49A8Q0zppEU7d2+rUBZvRSx7pCE7NTFp4Euwv5gWKUjZDK36DEo7simVHbmJsohRb+5v3znm/GWSGIV+mwuxs0gQ== 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=RQO43BLZLVUeTCWJQE4IGlJ+u/bzb1xmx2HOgJqO+oc=; b=T41H2KMVI5Y28edy7NdwdSSezoiYCjiEwAC1JeR/b7WEU2t2tasXEFnkJa8XEUXATTOvHGovVrMlsDMurPMwGYuqxZrGFClJEYt0XsLAle+yLQovYFWuE56OOGnJFSZA2Phj7rgyTwbQ56wGV6OYF4w3OeqHjqGzLOYTc5TCckBprPuS8mphCAz9ev7EvFw135RvLvPL4EUq8ZSwyR9xYU27COEsTJn90ruPV69Mc0kYrDvd6eXTzRhoOmUoOqmTLKTP3b+V/kjHL1YYxHoKr7E7XoEtKm6/hG8K6fxYKrM4A0y0xHibD1yT5Ky/gQniceO1hHZVCfkXJ5uyahU/cQ== 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=RQO43BLZLVUeTCWJQE4IGlJ+u/bzb1xmx2HOgJqO+oc=; b=rTps8Mb4UjJgjF01vJN22ZUrC/3CYGuYNvoJODG6mUw4lOG8STOJ3Fr3IGhT1CEPBox+QKoLlv4YDG0jxHy7UsjGgezK6452eU6jRNwBQF4xzc1e98ahGVxavpdNao59Rk0GY2UbYdAHK7xrSqrhAssisiHBW2P0QS69IGl2Y4Y= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) by TYTP286MB3461.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:39f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9253.18; Mon, 27 Oct 2025 00:43:40 +0000 Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a]) by OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a%5]) with mapi id 15.20.9253.017; Mon, 27 Oct 2025 00:43:40 +0000 From: Koichiro Den To: ntb@lists.linux.dev, linux-kernel@vger.kernel.org Cc: jdmason@kudzu.us, dave.jiang@intel.com, allenbh@gmail.com Subject: [PATCH 3/4] NTB: ntb_transport: Add module parameters use_tx_dma/use_rx_dma Date: Mon, 27 Oct 2025 09:43:30 +0900 Message-ID: <20251027004331.562345-4-den@valinux.co.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251027004331.562345-1-den@valinux.co.jp> References: <20251027004331.562345-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0073.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:36f::7) To OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) 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: OS3P286MB0979:EE_|TYTP286MB3461:EE_ X-MS-Office365-Filtering-Correlation-Id: d88a21c7-33a6-4620-51d0-08de14f1df78 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?YX8RKR17PlEUqWtEhsxl/+QiaoUSnlMmVz173/id5R+LeSJJfgx5y0dFvXTk?= =?us-ascii?Q?DB0jVHtxnk/CN2wisZDlNdmjmAKf2yV32gDdaMXmXbVkMOp+S+gJch0Xy7z9?= =?us-ascii?Q?MHvDxe0tEdlzVEH6xgjLqw7LV7+nYf2wTcdHd8gwaEww9lNSm9gWk6WpjrZ0?= =?us-ascii?Q?gyq0ifD08iXfBOkcN+KhOlTY4VRrKvqWxaGuHPa3k/mwvfxhYKt/uDzJ9TQ2?= =?us-ascii?Q?l2oadUYtOEsmJ0xU8oBhZeJQh8dROpHzTkyJ7uIVS7hg8NTmsNu/Vv++f9Cc?= =?us-ascii?Q?KT9hR0ykMQFNrkCgRuw9RuCfmuUzvLIxaEyJ2ECfz6/p1FWQcywYRYU66kY2?= =?us-ascii?Q?FI9FF9gQjDA3Yfcr6d9kYG7DQfhp63Rv/tG8cLkW6sXgSXUInVxg+EdRlnCw?= =?us-ascii?Q?ESxm3U3Q+5Ah6lKWIUimoZgrkR0rZe2lTYgTfXs+Wmwtdy1e5HbKQJC0wGaS?= =?us-ascii?Q?5ANsg55KpddlSukRipsIDTiwFQRxyocplcwwKVwAggkk2aW86zKz2IXEmEtW?= =?us-ascii?Q?LWWBPXRJRAGdgpmUb/hJChQjumuHhfULjPQyT2hp7VXBG6Sp3VIoSPidCjLE?= =?us-ascii?Q?KdaTtDqDnN3gIBh4qi6votQypIaS7TtkgxcO9j5xQPqtZAl+CKfZYeKm/Ei5?= =?us-ascii?Q?nMpuaaE5RQLxUI/QkABsh5GGAS4iQ3reFqOFhOkjCFoglqFlIp+oz0nAalGS?= =?us-ascii?Q?xP0qGD6rj0c+kC8CFz/C93J8P1pVeRAEiI4Fc8M5snEvlZCMEHO7F8L+QYWE?= =?us-ascii?Q?6M8eyFgUWdODufMTUClfeCLypiWiiSNp06ikZDgV8GpfXx//PFu5uVMSeoBN?= =?us-ascii?Q?iKwvQJsNnbNuP5kp5fvx1xr4bu9JKYj/piciVO0VkunpUGfb5fC00n7XAT+o?= =?us-ascii?Q?RzVmih/q2BTCgr4SFez9EId0oxwBiL1bWNMBpv0EI8rlNA8vBJIZZk9TZDdH?= =?us-ascii?Q?825L5qaaIJI84MNF62JciuyW+DlEE5NShWbhTqYcPtfyg3Es0LFAV5lstBa9?= =?us-ascii?Q?U84JTaEi5LyMAQ8z8ySP+8hPMREzL0+uQOlNGAjTaaq1gB5Y0LgiVTCMh9EE?= =?us-ascii?Q?AJeSXw4gxXcoisxgXkkJuLn3Mb0i+8+0hEKBVr7wNa1v7lAYaazHkKI34JAA?= =?us-ascii?Q?38vgfQNdZQcdUh5f6wK4rRU08VAz6VrQKUvbT3+DuGUzuvEW26n/l+VVRXxL?= =?us-ascii?Q?aUDpVN+Tbyu61cQVXfl6Vua+yZequ7bMH1WskY5UEauVrgE8cw+w85dlXHjb?= =?us-ascii?Q?oKuz/lEIZOwAVOEqGSu4uClYZEtkGFYoPe6kVfI9jJTGOrQB/pLobCSjcJ5U?= =?us-ascii?Q?l96WVkN16eYP+Ibd6XZOOW6Q6F6OIVdvzk+l49cgiyHaZPRpHqMvFBGBXtOh?= =?us-ascii?Q?gXYq3HelNCju+B1gt045F9t8On4dMWUHtwBKzELO1QZhECcJN1YSzyEFmYH/?= =?us-ascii?Q?M4hjUtmW9u2+wA5l38afINFUD0kIHVI5?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?kXqcNpDiP3pI9k74Du6jrYGWTw3Uu2s5vQzk8PXmJO9hvoTxLYsH+2LbwCWp?= =?us-ascii?Q?vE9ZGeu1ocsLJMxl8aio9HNVDMBwwrQ9fyqtxc9vtnEupyDdWzUA2hGGjbBP?= =?us-ascii?Q?7Rrog4K/0H4pSC9d+k4C77hv/hIc43wiUX1Sa0ydqTfjVR2KoRc1Hc+LiTlF?= =?us-ascii?Q?3FrpfxGVBWGIOecAlIBbj677oJC8GSor4aYv3YnhvbmFP4Mupc0UTJ/7/jCx?= =?us-ascii?Q?92kc1kJ6ju8/trbDOzj01v7IHaxjfpadsovuBck7ymrHWbbeyBvfJFq1nd8Q?= =?us-ascii?Q?vzH/5xAxBBrZll7htvk9sppSlgFW136dWr05bVrPMGoxituMwhPpSWfNl9yX?= =?us-ascii?Q?F8cS4HC5yl6qJ0XJ6a9PG8/PaUoX/ZX4mIi4Xa5A45o5dISvPVSpj0jjOh4e?= =?us-ascii?Q?6PnSabzjJYZ3ZKwt8cA/AgP6muGHIQpMoJFjX7oaXTmWruMFH6+LqA5kQifN?= =?us-ascii?Q?IwtcE2oGozbvwlIF8ojdkPOtgf7/HZkTiQdUX9Ho6RtFjIhhOSqNM+fmw0UD?= =?us-ascii?Q?oJjtDe6ylcsEz1KvpQ2qKLQTkrmH5OKW0o+vCH4ZKkeVWvNdwjbtm+O7kZ/D?= =?us-ascii?Q?tVhIqmLJNXQVyMiGutgMVUbWgs10YbPCiYlNqFfdpVSEvHELyBFaV5jldZcq?= =?us-ascii?Q?NUEklHBaWwHP3jdke1bGeuDjWisdSG3A5A5TLgqoluUmEQuZ6LznH02B1/kO?= =?us-ascii?Q?rn+WV4Yl1btT0stccOyQDVR1FYGpFNkuouyFzUNuiQZixyYKX3XG2iCjNEQI?= =?us-ascii?Q?r/ldiMVvqTwEtRAKIRM/+GRKRCppcgE1//HDogqpPqJnBwzclaaHoz+uGI7f?= =?us-ascii?Q?PYny0Ewzn6nknBr6Rx71iySxBuBc5OK8CCDwg2Vo7eB8eTc2FLsjqYvN//j1?= =?us-ascii?Q?CyFqXgYaxShs8vvMHYbNjgUDjg9vurVABCp98FepjbFsDm4WkRS4h3UWIwMx?= =?us-ascii?Q?tN7EZLzIiZQuKGtaLjGk+mBDRRNEJH/qjRG5WHMApGpFHaNtshg8UvkdvHkS?= =?us-ascii?Q?31epIzmERVvc6R97jU2fNpybBYNfJ95n8tgFnDyAHuee7Dkd0N9lVMhwiVss?= =?us-ascii?Q?Kyz9oL6CADtYe7iIRxj+BDdtJwHZqfS26o7HF5aui/mVW58iuURrCMepT+7A?= =?us-ascii?Q?wiefMe6KFM2dAOog2GHrmqxBslihlxYJFoLyLm65M/5ZfJVt1t34AksTYsSB?= =?us-ascii?Q?lEQosMf+PPdl1BtGCwNvtVtfwkr67jHkaHxehJ5YV8GPQKqZmeAyNLZmuHVq?= =?us-ascii?Q?F2QHSa3sjRRcpC+rq6tKBP2yedytsexNxColHqldtAkvxp5xCTlckLw28vAB?= =?us-ascii?Q?L7LUAyIIVgF+bIJ9nHa0dTWi+uy7CX3q5LyCLNv/eVhNcfYA038Q87EVU2jl?= =?us-ascii?Q?f08DsiYkm/S7WIWOKyHAKrrWz5xvPnw5GY2OmfjznrWPavJk5Osb14yavvAN?= =?us-ascii?Q?BRWh09TX9o0MjllPnB75mVolfdWJRkTz76xK7WvuEcjq91h+WnKGLAy7tP3U?= =?us-ascii?Q?4YyRKFtjY9qNLDp7dGUgmkhr4Ztl4tZQNHeP/46rQ3w9xtin4LeAH7tqgBDa?= =?us-ascii?Q?3spmXLfrkRNwrP+5UFMyM1vPFReVyld8Nw/vSIfCVwCIntiG1ZSBMKSsA10h?= =?us-ascii?Q?56CCB7wNmKVKmkBQwgpAVP0=3D?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: d88a21c7-33a6-4620-51d0-08de14f1df78 X-MS-Exchange-CrossTenant-AuthSource: OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2025 00:43:40.3317 (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: QTxvXCxN+24IpC4cv7LAKin9j2Oh8OTlk5dZ6iN2RVBRhG8110EeyrySMKwnTSDVJ7FVi8w6CjowxQ1JCAedUA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB3461 Content-Type: text/plain; charset="utf-8" Allow enabling or disabling DMA separately for TX and RX to optimize performance depending on the environment. The existing use_dma option is retained for backward compatibility. Setting it to 1 enables DMA for both directions. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index a447eca27d0f..aee6793812bc 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -92,7 +92,15 @@ MODULE_PARM_DESC(copy_bytes, "Threshold under which NTB = will use the CPU to copy =20 static bool use_dma; module_param(use_dma, bool, 0644); -MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large data copy"); +MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large data copy on bo= th TX and RX"); + +static bool use_tx_dma; +module_param(use_tx_dma, bool, 0644); +MODULE_PARM_DESC(use_tx_dma, "Use DMA engine to perform large data copy on= TX"); + +static bool use_rx_dma; +module_param(use_rx_dma, bool, 0644); +MODULE_PARM_DESC(use_rx_dma, "Use DMA engine to perform large data copy on= RX"); =20 static bool use_msi; #ifdef CONFIG_NTB_MSI @@ -2047,21 +2055,26 @@ ntb_transport_create_queue(void *data, struct devic= e *client_dev, dma_cap_set(DMA_MEMCPY, dma_mask); =20 if (use_dma) { + use_tx_dma =3D true; + use_rx_dma =3D true; + } + if (use_tx_dma) { qp->tx_dma_chan =3D dma_request_channel(dma_mask, ntb_dma_filter_fn, (void *)(unsigned long)node); if (!qp->tx_dma_chan) dev_info(&pdev->dev, "Unable to allocate TX DMA channel\n"); + } else + qp->tx_dma_chan =3D NULL; =20 + if (use_rx_dma) { qp->rx_dma_chan =3D dma_request_channel(dma_mask, ntb_dma_filter_fn, (void *)(unsigned long)node); if (!qp->rx_dma_chan) dev_info(&pdev->dev, "Unable to allocate RX DMA channel\n"); - } else { - qp->tx_dma_chan =3D NULL; + } else qp->rx_dma_chan =3D NULL; - } =20 qp->tx_mw_dma_addr =3D 0; if (qp->tx_dma_chan) { --=20 2.48.1 From nobody Mon Feb 9 10:39:10 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11010050.outbound.protection.outlook.com [52.101.229.50]) (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 5634430F532 for ; Mon, 27 Oct 2025 00:43:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.50 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525830; cv=fail; b=VZ/iftpJ3Bpdjyxp0OBc95NC45OuBD7AO2f5WSCxHDFYQcsrthYcYiTqGKH9IVxw3akHjIXRXKfYIfXhxV33vhubB5GYUqI2NY6e3Z2HMe7sLMcBUzhZGbRhuw7ISmtEIeCy2BnIHWbscx8u1ugO0H8mSQcFi+LiB+ekxG7J0Bo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761525830; c=relaxed/simple; bh=/nJVpHokSVj0cqTBExRjwLlBLGdVD/gzFHLqZkp/iHA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=bxLkNMM9aNGmPG1e4Ep60QBzfN0sPAa8ctp7NyIDZjtImp59yEtwkxFrLfmlCihcG/0O8nlIWApaXupXuJlyX6BPZHRIqOnde61BoV5IU5ryeDuDydfRTZxVSCBhu7VYmgi/0iSvd60hng46xbZTVljLzgDuGBIHfO1uhiBff5c= 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=n/0jZyRS; arc=fail smtp.client-ip=52.101.229.50 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="n/0jZyRS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OGrmTyN8vOQmVNezzkt1wP8JnbdEtvbevcjK6oJ7PiB4v1jdvEHEiHZhW+et2WAYPGb4nyyLKJ+FSNVh8qjF8lnGf06uXo7zz3swHWBN/e2gpiHaAQVwMTCHLPM6SFCZyamPErvwURmD5o50HoXMEO8w6tES+m0mssa9tSmAWCSLYM1+eylKblQcryXTobrhlOJRE8wMY4UOKQuF4N6qXdO9dMAnQp3VTNAq1UeR1fdocvuvZHPWmAwxG6MktdNSuYgw2YDf9+xpMdifzqV9scjwxArrZuPR6BGC7uHfRZpYOVbpwrM9rPja6I0yD+H06ysh7MJ3Zn6vuFsDJ+LQvA== 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=9yt7k7Ibn+5Y8zD76bXKJDdvZAjPBv5vIsS87eeDl9A=; b=lVeZm+l5UDwReGQdwp0ABfF5TUN1DwODw1etbmrBKWwQI/wKCzuY/NhKmNNh5kLjmilDEyesnF5JAyuYuiwebcJCeAm8EHoVOP7NAPEdJvq/+JfAcgkT/5ngpCkKcMfpOZOz1faKBPUZPZS9/pDrr3DlDiCafvJTv1KBCPTEuwJtWRWBeJzNfloXNGOk68UpjSPibe0E4gyUKsTyztkN5GizSLTiqJvec8BT78LXUsj6ZKOGtkrdJUJEoscgIt1eit7q0C8pijsFoMuoAiVfRiV+TFZwtQ4ccwDQLEgUGX0UW6re6lOm2DtYT0X2U2OPzjYpK8iIzmRUXIQDNcsw8A== 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=9yt7k7Ibn+5Y8zD76bXKJDdvZAjPBv5vIsS87eeDl9A=; b=n/0jZyRSyxPf3WSbvAdUbSqEEVd/d5Y8Ck8YyCT3RvHjv6yFlgm/byMWslxHkdmaKChvdUVdGiosZfmuE+CqeUnaSL32XLbVHFdpfS69ay2ATnqkzTwu1SjH4kMmR75NWu8CWBSNjUw0qNhgf9wUD8Ivqh1BVV3vuOL0ueBGboY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) by TYTP286MB3461.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:39f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9253.18; Mon, 27 Oct 2025 00:43:42 +0000 Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a]) by OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a%5]) with mapi id 15.20.9253.017; Mon, 27 Oct 2025 00:43:41 +0000 From: Koichiro Den To: ntb@lists.linux.dev, linux-kernel@vger.kernel.org Cc: jdmason@kudzu.us, dave.jiang@intel.com, allenbh@gmail.com Subject: [PATCH 4/4] NTB: ntb_transport: Support multi-channel DMA via module parameters Date: Mon, 27 Oct 2025 09:43:31 +0900 Message-ID: <20251027004331.562345-5-den@valinux.co.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251027004331.562345-1-den@valinux.co.jp> References: <20251027004331.562345-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0160.jpnprd01.prod.outlook.com (2603:1096:400:2b1::13) To OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) 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: OS3P286MB0979:EE_|TYTP286MB3461:EE_ X-MS-Office365-Filtering-Correlation-Id: f05d52ea-a865-490e-0c5d-08de14f1e055 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?6Rfnysu2lxtunQiTilpzsDiXfnQlj4XT2j9WP1DQX0cnHhh3nc4ZsUSaxTOI?= =?us-ascii?Q?OJbtT5XWFe31b0v4XP3wanO83JClWlHAQQH0+xv2WzSQNTuXa+9Fe/Ep+Sgl?= =?us-ascii?Q?ytMtjBhKMLu+ZprapgqG96f1gOmf4dfHJbwYZjyW6+EsIGhh1Nt6NENMSNim?= =?us-ascii?Q?cPxectzf8hWwM5gfnlPRVVSa1RhGoux7+/Yi/f8C1bz5C+gZ9HX+g2qnWw6+?= =?us-ascii?Q?qmgvNg+TbVe6HxX9t1aYpcq1+gkVaJiuGsMgCEuiO5NiEaVS5goK3pp7lj/l?= =?us-ascii?Q?kElsO0rbwm25tGF5Gzb51ESNy0zdUhHZQkfMcZfSvjHBg2mxfM5dFPLTXway?= =?us-ascii?Q?k6h6punD433pHao1RbgBfp9XU1TtQPs2R5KDdL35QNOIgswDGDEFO9hgmxqy?= =?us-ascii?Q?Vx9tPfX8tIfaRRsjZxt0pZK8Z9HmlglecF5oM1WgIAZxnog81TKfRfXIG0pE?= =?us-ascii?Q?ElFBM1rCZfw6J9QkUAu1WT+BFPONCi0c4chY5cmxWEGBrOMciK9lHNBtgDcK?= =?us-ascii?Q?+MmIJcQuPuvOXfSMqwUUFC7IHCgjG54n1idgc+z0VOXaOIVpw418oRXBRLC6?= =?us-ascii?Q?y7rRW3yz2lFF6jx9zvfX/PClSqYm6JRo09iQls5ITEObkXDZsNBiufgCHgIj?= =?us-ascii?Q?eeUQIMhtaZ8uDnox6z3udZLHKQy59CvrvxX4pFtkPeGT9dtipnqdhXQkYk/2?= =?us-ascii?Q?YYAuehp+f8Yl3OMQbpKruMz8yNFxUMvxRdELioN+7GjkJZPe7P8ffkX8h8kb?= =?us-ascii?Q?Lw87Oaz18FFSlqho+JYFMwjbSL8BCaRlAr3F1fe0W4MGm+no4kGHGK4PSc/E?= =?us-ascii?Q?9qkT3oN+GYKiRVHIhpQ0C3Hl1GCRQkU6i2600sxw1+ETI3/pVx6y7zaGJpeh?= =?us-ascii?Q?ZSzc381xM0FXjiAibg4ry8g4BfGNvavkzsVhhQmedA36WmWDyrADy0YW4oZ2?= =?us-ascii?Q?RwXMuOEx/bBnaqbPl3PLegm98B2/G2G2gG5VFxvvCNC+Gtuk3SW7lsJeCj+7?= =?us-ascii?Q?l8ovLWbLWeG1ro4btB3vwtgibsmr47h6WYqD4tmgFhMLg6qwr3BOn2dipGvR?= =?us-ascii?Q?+Nl4+Ft+h+kAZkFiWDhT6dBrMyEP6z6OHlywJd7aZ6beHiObBbbD7exgcv8w?= =?us-ascii?Q?osHTRMVyKsgogMybm5qDv4m4Tu4kiq2y1jF2nXiDoN8F3ybkUjruJXRdUwsZ?= =?us-ascii?Q?JYFlPDXhiq70i4vKOj2ozrd/V7l/SRngQD3McSBCrOhXOFfCsYStNzl3XpQL?= =?us-ascii?Q?AEw5f8Ew4Cmr4QrHa1ie8tzaEzFfq7Xq/vjJMWRFGyb+HtFWWI1s2RV8843y?= =?us-ascii?Q?eWv7CamOkspha73SoXRH7bdsQppuAxBXthl7caA/qMezSkFZi/PabIhnnzNu?= =?us-ascii?Q?1vH6sM1FSK0YzbJEdj40O2tSXOYl66beRnQ40bp2jEgfVAOkrrYViHhK4M55?= =?us-ascii?Q?z2uxVHTOsKG7qJ4M+H/X2g0IHRQvP7wT?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?c7Ub5LYyZp2YE07bS9ktUTXqt8vn3QS7OHFTrXrP5akT1fCWtl4ZBelr+7HF?= =?us-ascii?Q?vWGCc4lEBfHNHhlYhEqDGux/5NAs9+aMxZXZww9o4yYuOQBiGz+9EToYCjaX?= =?us-ascii?Q?Z4gPKhlkE4JblQv5NUP3hv3P3JFK/Dki1T28nfzz1jd0Ja3GZ0unYMCitPDN?= =?us-ascii?Q?qWdcjrMZfxsLuuAr589AeM3pad+47tbDcvu2HIOiA2d7tq5g/Agmm9wK/nM5?= =?us-ascii?Q?wTUzc8I6HkV3uaCbJ/JurtDbfh9luymxtNqG8IMAozCLUdJ0vCYEv9heb5Ew?= =?us-ascii?Q?9pzkHnw3x5/E0Uvj1wfMv2sqJ9hQj4kkyZd0oigsqMqeKu5pTV3JIc8P1Lia?= =?us-ascii?Q?XeBSDZNAaUjKmXDzyIis6/Vhq2RV08VjRUpQrjV+GmNCqNBfiq8+sdU/pR42?= =?us-ascii?Q?eSOlRbEucMoI5sNAyJ+DJWKxmTdVg/BoE86GZ5nLvYAZIUIrkDDEokR2xUW+?= =?us-ascii?Q?Qyc7IVQevoQ8lWBaQNvivjf/PYuecq6F2O8gs0/a6DO7yamOAypG9Ke7xtwT?= =?us-ascii?Q?Lja2kDWMCusXyYznrmmexkbpnpi0fIgbIa48OMa70+jwj/D2XT14CL+tKBsN?= =?us-ascii?Q?bGt+Cd/8vhSGrsEl76kAUTGZfT/dF/gKAdXP0OWoFLHQKw/rLTYnjO2j59xf?= =?us-ascii?Q?WIDTm3dBrnLt/fJHJXwF82DGH3Q4HkWa2xBEHEJliMYH9pAeymmxTHHZvDS1?= =?us-ascii?Q?txdN9aKJMkUoqX0SworOt98+csPhNMLmm/wnEaLPK16iMJiyG5/AcCx+pMUf?= =?us-ascii?Q?RoCtB3nLyUMhnUgdjvORHnccbO4r1+8sb9JgRjDm6kbDIRUw7AsT7zZDzah1?= =?us-ascii?Q?jpuvFoMF6JxSO4mqj25a8/a8qdzyMgY8v71fNX6POffiRCFOqCaYdqE745iE?= =?us-ascii?Q?zf6TXErlj0G9iDN2+eGb1sZ/guGy7oQfKHvmtKhb5wfgd3mSQlHaSXjGMxRj?= =?us-ascii?Q?Ejuu5j4DindrVIYwGIA/RtSJD0yhwlLeDpsXXyfeZs7Xaligz8jzRJO0PVyN?= =?us-ascii?Q?OloB0Ow2ZPplNgWo0MBrP5/iiHtbFUKl1D731QRez98kc9UrtsMoqUK8DwGI?= =?us-ascii?Q?ula3qXsclltODRmoQjz6nTfJww80s95cHroHryAZYnjG/qvmEGrTVoOxW6kt?= =?us-ascii?Q?14ndfAMC8KF+pcS6gq2qvgRoAlDfCCleCyUk+MHSsbvq0kJAxooVvzG5m5yx?= =?us-ascii?Q?VyvtyqvMfP9QoEMuNi51F63YlIInOd/OGZGtPLnsjwZaa2rnS0KnPf36BENo?= =?us-ascii?Q?+C6aoDeUYvV/5uNw15cPv2WN/hWkM+cA1D1ym7KoLvKrMv/4grf1ZBix/iCQ?= =?us-ascii?Q?YkCaxyS6pSACmtIHpfXIcwSVGBsTnd2szTOe9L6mM0bg7I2sNhe2KbC43P+J?= =?us-ascii?Q?8vjLwJySpXhPW6/DoyXVbHmT/3TbKy/1MopG2x3sbliSlk9TcryGL89JZ+S7?= =?us-ascii?Q?4g0aKvwMy/dWMyVEWEHpG2Ct6V3ycnNCenrEnjC0MYQB5snXKDGp7yqemQCM?= =?us-ascii?Q?XtQCztmTKckKTpSQsWjHsMaODnfUN+mmKK8ZcNuKn+fP4Qzy4V4xwUC1rjpB?= =?us-ascii?Q?ylXkPg0rcLfQXyFNglfEAzqCJX59ypzQENzDLqNYSpeDY7rBdZSAFN5BUeHj?= =?us-ascii?Q?YkGoN5my70bVVWhhcU9dzn8=3D?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: f05d52ea-a865-490e-0c5d-08de14f1e055 X-MS-Exchange-CrossTenant-AuthSource: OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2025 00:43:41.8942 (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: Zjyx99NyCIvAi0631Bi8LJIPq2kgqg4KKlSQrBpVK52y1Gt1HobhlvV513bwI1t3Gt5FU0QE3DC+IYiHtU4+cw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYTP286MB3461 Content-Type: text/plain; charset="utf-8" The reclamation delay of ntb_queue_entry can be a key performance limiter and the MEMCPY portion often accounts for a large part of the round-trip latency when DMA MEMCPY is used. Distributing work across multiple channels can improve overall throughput on busy systems by increasing the average service rate of the MEMCPY part, as observed on R-Car S4. Allow ntb_transport to use multiple DMA engine channels per queue to better utilize hardware under load with the new module parameters: - num_tx_dma_chan: TX DMA channels per queue (default 1) - num_rx_dma_chan: RX DMA channels per queue (default 1) Channel selection is a simple round-robin driven by an atomic counter. A least-used policy was also tested on R-Car S4, but showed not much benefit, so the simpler round-robin approach is chosen. Behavior is unchanged when DMA is disabled or only one channel is used, and the CPU memcpy fallback remains. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport.c | 368 ++++++++++++++++++++++++------------ 1 file changed, 252 insertions(+), 116 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index aee6793812bc..1860e15295b3 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 @@ -102,6 +103,14 @@ static bool use_rx_dma; module_param(use_rx_dma, bool, 0644); MODULE_PARM_DESC(use_rx_dma, "Use DMA engine to perform large data copy on= RX"); =20 +static unsigned int num_tx_dma_chan =3D 1; +module_param(num_tx_dma_chan, uint, 0644); +MODULE_PARM_DESC(num_tx_dma_chan, "Number of TX DMA channels per queue (ro= und-robin). 1 by default"); + +static unsigned int num_rx_dma_chan =3D 1; +module_param(num_rx_dma_chan, uint, 0644); +MODULE_PARM_DESC(num_rx_dma_chan, "Number of RX DMA channels per queue (ro= und-robin). 1 by default"); + static bool use_msi; #ifdef CONFIG_NTB_MSI module_param(use_msi, bool, 0644); @@ -137,12 +146,21 @@ struct ntb_rx_info { unsigned int entry; }; =20 +struct ntb_transport_dma { + struct dma_chan **chan; + unsigned int num_chan; + atomic_t cur_chan; + /* cache for graceful teardown */ + dma_cookie_t *last_cookie; +}; + struct ntb_transport_qp { struct ntb_transport_ctx *transport; struct ntb_dev *ndev; void *cb_data; - struct dma_chan *tx_dma_chan; - struct dma_chan *rx_dma_chan; + + struct ntb_transport_dma tx_dma; + struct ntb_transport_dma rx_dma; =20 bool client_ready; bool link_is_up; @@ -161,7 +179,7 @@ struct ntb_transport_qp { void __iomem *tx_mw; phys_addr_t tx_mw_phys; size_t tx_mw_size; - dma_addr_t tx_mw_dma_addr; + dma_addr_t *tx_mw_dma_addr; unsigned int tx_index; unsigned int tx_max_entry; unsigned int tx_max_frame; @@ -178,7 +196,6 @@ struct ntb_transport_qp { unsigned int rx_max_entry; unsigned int rx_max_frame; unsigned int rx_alloc_entry; - dma_cookie_t last_cookie; struct tasklet_struct rxc_db_work; =20 void (*event_handler)(void *data, int status); @@ -549,10 +566,10 @@ static ssize_t debugfs_read(struct file *filp, char _= _user *ubuf, size_t count, "\n"); out_offset +=3D scnprintf(buf + out_offset, out_count - out_offset, "Using TX DMA - \t%s\n", - qp->tx_dma_chan ? "Yes" : "No"); + qp->tx_dma.num_chan > 0 ? "Yes" : "No"); out_offset +=3D scnprintf(buf + out_offset, out_count - out_offset, "Using RX DMA - \t%s\n", - qp->rx_dma_chan ? "Yes" : "No"); + qp->rx_dma.num_chan > 0 ? "Yes" : "No"); out_offset +=3D scnprintf(buf + out_offset, out_count - out_offset, "QP Link - \t%s\n", qp->link_is_up ? "Up" : "Down"); @@ -1559,16 +1576,43 @@ static inline struct page *ntb_vaddr_to_page(const = void *addr) return is_vmalloc_addr(addr) ? vmalloc_to_page(addr) : virt_to_page(addr); } =20 +static inline struct dma_chan * +ntb_pick_dma_chan(struct ntb_transport_dma *dma, unsigned int *idx_out) +{ + unsigned int n =3D dma->num_chan; + unsigned int cur, idx; + + if (unlikely(!n)) + return NULL; + + if (n =3D=3D 1) { + if (idx_out) + *idx_out =3D 0; + return dma->chan[0]; + } + + cur =3D (unsigned int)atomic_inc_return(&dma->cur_chan) - 1; + idx =3D cur % n; + if (idx_out) + *idx_out =3D idx; + return dma->chan[idx]; +} + static int ntb_async_rx_submit(struct ntb_queue_entry *entry, void *offset) { - struct dma_async_tx_descriptor *txd; struct ntb_transport_qp *qp =3D entry->qp; - struct dma_chan *chan =3D qp->rx_dma_chan; - struct dma_device *device; - size_t pay_off, buff_off, len; + struct dma_async_tx_descriptor *txd; struct dmaengine_unmap_data *unmap; - dma_cookie_t cookie; + size_t pay_off, buff_off, len; + struct dma_device *device; void *buf =3D entry->buf; + struct dma_chan *chan; + unsigned int cidx =3D 0; + dma_cookie_t cookie; + + chan =3D ntb_pick_dma_chan(&qp->rx_dma, &cidx); + if (unlikely(!chan)) + return -ENODEV; =20 len =3D entry->len; device =3D chan->device; @@ -1613,7 +1657,9 @@ static int ntb_async_rx_submit(struct ntb_queue_entry= *entry, void *offset) =20 dmaengine_unmap_put(unmap); =20 - qp->last_cookie =3D cookie; + dma_async_issue_pending(chan); + + qp->rx_dma.last_cookie[cidx] =3D cookie; =20 qp->rx_async++; =20 @@ -1630,10 +1676,9 @@ static int ntb_async_rx_submit(struct ntb_queue_entr= y *entry, void *offset) static void ntb_async_rx(struct ntb_queue_entry *entry, void *offset) { struct ntb_transport_qp *qp =3D entry->qp; - struct dma_chan *chan =3D qp->rx_dma_chan; int res; =20 - if (!chan) + if (!qp->rx_dma.chan) goto err; =20 if (entry->len < copy_bytes) @@ -1742,9 +1787,6 @@ static void ntb_transport_rxc_db(unsigned long data) break; } =20 - if (i && qp->rx_dma_chan) - dma_async_issue_pending(qp->rx_dma_chan); - if (i =3D=3D qp->rx_max_entry) { /* there is more work to do */ if (qp->active) @@ -1842,17 +1884,22 @@ static int ntb_async_tx_submit(struct ntb_transport= _qp *qp, struct ntb_queue_entry *entry) { struct dma_async_tx_descriptor *txd; - struct dma_chan *chan =3D qp->tx_dma_chan; + struct dmaengine_unmap_data *unmap; struct dma_device *device; + size_t dest_off, buff_off; size_t len =3D entry->len; void *buf =3D entry->buf; - size_t dest_off, buff_off; - struct dmaengine_unmap_data *unmap; - dma_addr_t dest; + struct dma_chan *chan; + unsigned int cidx =3D 0; dma_cookie_t cookie; + dma_addr_t dest; + + chan =3D ntb_pick_dma_chan(&qp->tx_dma, &cidx); + if (unlikely(!chan)) + return -ENODEV; =20 device =3D chan->device; - dest =3D qp->tx_mw_dma_addr + qp->tx_max_frame * entry->tx_index; + dest =3D qp->tx_mw_dma_addr[cidx] + qp->tx_max_frame * entry->tx_index; buff_off =3D (size_t)buf & ~PAGE_MASK; dest_off =3D (size_t)dest & ~PAGE_MASK; =20 @@ -1901,7 +1948,6 @@ static void ntb_async_tx(struct ntb_transport_qp *qp, struct ntb_queue_entry *entry) { struct ntb_payload_header __iomem *hdr; - struct dma_chan *chan =3D qp->tx_dma_chan; void __iomem *offset; int res; =20 @@ -1913,7 +1959,7 @@ static void ntb_async_tx(struct ntb_transport_qp *qp, iowrite32(entry->len, &hdr->len); iowrite32((u32)qp->tx_pkts, &hdr->ver); =20 - if (!chan) + if (!qp->tx_dma.chan) goto err; =20 if (entry->len < copy_bytes) @@ -1999,8 +2045,99 @@ static bool ntb_dma_filter_fn(struct dma_chan *chan,= void *node) return dev_to_node(&chan->dev->device) =3D=3D (int)(unsigned long)node; } =20 +static void ntb_transport_teardown_dma(struct ntb_transport_dma *dma, + dma_addr_t *mem, size_t size) +{ + struct dma_chan *chan; + unsigned int i; + + if (!dma) + return; + + if (!dma->chan) { + kfree(dma->last_cookie); + dma->last_cookie =3D NULL; + return; + } + + for (i =3D 0; i < dma->num_chan; i++) { + chan =3D dma->chan[i]; + if (!chan) + continue; + + if (dma->last_cookie) + /* Try to be nice and wait for any queued DMA engine + * transactions to process before smashing it with a rock + */ + dma_sync_wait(chan, dma->last_cookie[i]); + + dmaengine_terminate_all(chan); + if (mem && mem[i]) + dma_unmap_resource(chan->device->dev, mem[i], size, + DMA_FROM_DEVICE, 0); + dma_release_channel(chan); + dma->chan[i] =3D NULL; + } + + kfree(dma->chan); + kfree(dma->last_cookie); + dma->chan =3D NULL; + dma->num_chan =3D 0; + dma->last_cookie =3D NULL; +} + +static unsigned int ntb_transport_setup_dma(struct pci_dev *pdev, + struct ntb_transport_dma *dma, + unsigned int req, int node) +{ + dma_cap_mask_t dma_mask; + struct dma_chan *c; + unsigned int i =3D 0; + + dma_cap_zero(dma_mask); + dma_cap_set(DMA_MEMCPY, dma_mask); + + dma->last_cookie =3D NULL; + dma->num_chan =3D 0; + dma->chan =3D kcalloc_node(req, sizeof(*dma->chan), GFP_KERNEL, node); + if (!dma->chan) { + dev_info(&pdev->dev, "Unable to alloc DMA arrays\n"); + return 0; + } + + atomic_set(&dma->cur_chan, 0); + for (i =3D 0; i < req; i++) { + c =3D dma_request_channel(dma_mask, ntb_dma_filter_fn, + (void *)(unsigned long)node); + if (!c) { + if (!i) + dev_info(&pdev->dev, + "Unable to allocate DMA channel(s)\n"); + break; + } + dma->chan[i] =3D c; + dma->num_chan++; + } + if (!dma->num_chan) + goto err_out; + + dma->last_cookie =3D kcalloc_node(dma->num_chan, sizeof(dma_cookie_t), + GFP_KERNEL, node); + if (!dma->last_cookie) + goto err_out; + + return dma->num_chan; + +err_out: + for (i =3D 0; i < dma->num_chan; i++) + dma_release_channel(dma->chan[i]); + kfree(dma->chan); + dma->chan =3D NULL; + dma->num_chan =3D 0; + return 0; +} + /** - * ntb_transport_create_queue - Create a new NTB transport layer queue * @data: pointer for callback data * @client_dev: &struct device pointer * @handlers: pointer to various ntb queue (callback) handlers @@ -2024,7 +2161,8 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, struct ntb_transport_qp *qp; u64 qp_bit; unsigned int free_queue; - dma_cap_mask_t dma_mask; + struct dma_chan *c; + dma_addr_t mw_dma; int node; int i; =20 @@ -2036,7 +2174,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, =20 free_queue =3D ffs(nt->qp_bitmap_free); if (!free_queue) - goto err; + return NULL; =20 /* decrement free_queue to make it zero based */ free_queue--; @@ -2051,54 +2189,70 @@ ntb_transport_create_queue(void *data, struct devic= e *client_dev, qp->tx_handler =3D handlers->tx_handler; qp->event_handler =3D handlers->event_handler; =20 - dma_cap_zero(dma_mask); - dma_cap_set(DMA_MEMCPY, dma_mask); - if (use_dma) { use_tx_dma =3D true; use_rx_dma =3D true; } - if (use_tx_dma) { - qp->tx_dma_chan =3D - dma_request_channel(dma_mask, ntb_dma_filter_fn, - (void *)(unsigned long)node); - if (!qp->tx_dma_chan) - dev_info(&pdev->dev, "Unable to allocate TX DMA channel\n"); - } else - qp->tx_dma_chan =3D NULL; - - if (use_rx_dma) { - qp->rx_dma_chan =3D - dma_request_channel(dma_mask, ntb_dma_filter_fn, - (void *)(unsigned long)node); - if (!qp->rx_dma_chan) - dev_info(&pdev->dev, "Unable to allocate RX DMA channel\n"); - } else - qp->rx_dma_chan =3D NULL; - - qp->tx_mw_dma_addr =3D 0; - if (qp->tx_dma_chan) { - qp->tx_mw_dma_addr =3D - dma_map_resource(qp->tx_dma_chan->device->dev, - qp->tx_mw_phys, qp->tx_mw_size, - DMA_FROM_DEVICE, 0); - if (dma_mapping_error(qp->tx_dma_chan->device->dev, - qp->tx_mw_dma_addr)) { - qp->tx_mw_dma_addr =3D 0; - goto err1; + + /* setup TX dma if requested */ + qp->tx_dma.chan =3D NULL; + qp->tx_dma.num_chan =3D 0; + if (use_tx_dma) + ntb_transport_setup_dma(pdev, &qp->tx_dma, num_tx_dma_chan ?: 1, + node); + + /* setup RX dma if requested */ + qp->rx_dma.chan =3D NULL; + qp->rx_dma.num_chan =3D 0; + if (use_rx_dma) + ntb_transport_setup_dma(pdev, &qp->rx_dma, num_rx_dma_chan ?: 1, + node); + + /* setup TX dma dest map */ + if (qp->tx_dma.num_chan > 0) { + qp->tx_mw_dma_addr =3D kcalloc_node(qp->tx_dma.num_chan, + sizeof(*qp->tx_mw_dma_addr), GFP_KERNEL, node); + if (!qp->tx_mw_dma_addr) + /* this sets qp->tx_dma.num_chan back to 0 */ + ntb_transport_teardown_dma(&qp->tx_dma, NULL, 0); + + for (i =3D 0; i < qp->tx_dma.num_chan; i++) { + c =3D qp->tx_dma.chan[i]; + mw_dma =3D dma_map_resource(c->device->dev, + qp->tx_mw_phys, + qp->tx_mw_size, + DMA_FROM_DEVICE, 0); + if (dma_mapping_error(c->device->dev, mw_dma)) { + dev_info(&pdev->dev, + "TX MW dma_map_resource failed for channel %u\n", i); + break; + } + qp->tx_mw_dma_addr[i] =3D mw_dma; } + if (qp->tx_dma.num_chan > 0 && i < qp->tx_dma.num_chan) + /* this sets qp->tx_dma.num_chan back to 0 */ + ntb_transport_teardown_dma(&qp->tx_dma, + qp->tx_mw_dma_addr, + qp->tx_mw_size); } =20 - dev_dbg(&pdev->dev, "Using %s memcpy for TX\n", - qp->tx_dma_chan ? "DMA" : "CPU"); + if (qp->tx_dma.num_chan > 0) + dev_dbg(&pdev->dev, "Using DMA memcpy for TX (num_chan =3D %u)\n", + qp->tx_dma.num_chan); + else + dev_dbg(&pdev->dev, "Using CPU memcpy for TX\n"); =20 - dev_dbg(&pdev->dev, "Using %s memcpy for RX\n", - qp->rx_dma_chan ? "DMA" : "CPU"); + if (qp->rx_dma.num_chan > 0) + dev_dbg(&pdev->dev, "Using DMA memcpy for RX (num_chan =3D %u)\n", + qp->rx_dma.num_chan); + else + dev_dbg(&pdev->dev, "Using CPU memcpy for RX\n"); =20 + /* alloc and link entries */ for (i =3D 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) { entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); if (!entry) - goto err1; + goto err; =20 entry->qp =3D qp; ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, @@ -2109,7 +2263,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, for (i =3D 0; i < qp->tx_max_entry; i++) { entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); if (!entry) - goto err2; + goto err; =20 entry->qp =3D qp; ntb_list_add(&qp->ntb_tx_free_q_lock, &entry->entry, @@ -2123,23 +2277,20 @@ ntb_transport_create_queue(void *data, struct devic= e *client_dev, =20 return qp; =20 -err2: +err: while ((entry =3D ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q))) kfree(entry); -err1: - qp->rx_alloc_entry =3D 0; while ((entry =3D ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q))) kfree(entry); - if (qp->tx_mw_dma_addr) - dma_unmap_resource(qp->tx_dma_chan->device->dev, - qp->tx_mw_dma_addr, qp->tx_mw_size, - DMA_FROM_DEVICE, 0); - if (qp->tx_dma_chan) - dma_release_channel(qp->tx_dma_chan); - if (qp->rx_dma_chan) - dma_release_channel(qp->rx_dma_chan); + qp->rx_alloc_entry =3D 0; + + ntb_transport_teardown_dma(&qp->rx_dma, NULL, 0); + ntb_transport_teardown_dma(&qp->tx_dma, qp->tx_mw_dma_addr, + qp->tx_mw_size); + kfree(qp->tx_mw_dma_addr); + qp->tx_mw_dma_addr =3D NULL; + nt->qp_bitmap_free |=3D qp_bit; -err: return NULL; } EXPORT_SYMBOL_GPL(ntb_transport_create_queue); @@ -2163,40 +2314,11 @@ void ntb_transport_free_queue(struct ntb_transport_= qp *qp) =20 qp->active =3D false; =20 - if (qp->tx_dma_chan) { - struct dma_chan *chan =3D qp->tx_dma_chan; - /* Putting the dma_chan to NULL will force any new traffic to be - * processed by the CPU instead of the DAM engine - */ - qp->tx_dma_chan =3D NULL; - - /* Try to be nice and wait for any queued DMA engine - * transactions to process before smashing it with a rock - */ - dma_sync_wait(chan, qp->last_cookie); - dmaengine_terminate_all(chan); - - dma_unmap_resource(chan->device->dev, - qp->tx_mw_dma_addr, qp->tx_mw_size, - DMA_FROM_DEVICE, 0); - - dma_release_channel(chan); - } - - if (qp->rx_dma_chan) { - struct dma_chan *chan =3D qp->rx_dma_chan; - /* Putting the dma_chan to NULL will force any new traffic to be - * processed by the CPU instead of the DAM engine - */ - qp->rx_dma_chan =3D NULL; - - /* Try to be nice and wait for any queued DMA engine - * transactions to process before smashing it with a rock - */ - dma_sync_wait(chan, qp->last_cookie); - dmaengine_terminate_all(chan); - dma_release_channel(chan); - } + ntb_transport_teardown_dma(&qp->rx_dma, NULL, 0); + ntb_transport_teardown_dma(&qp->tx_dma, qp->tx_mw_dma_addr, + qp->tx_mw_size); + kfree(qp->tx_mw_dma_addr); + qp->tx_mw_dma_addr =3D NULL; =20 qp_bit =3D BIT_ULL(qp->qp_num); =20 @@ -2444,17 +2566,31 @@ EXPORT_SYMBOL_GPL(ntb_transport_qp_num); unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp) { unsigned int max_size; - unsigned int copy_align; + unsigned int copy_align =3D 0; struct dma_chan *rx_chan, *tx_chan; + unsigned int i; =20 if (!qp) return 0; =20 - rx_chan =3D qp->rx_dma_chan; - tx_chan =3D qp->tx_dma_chan; - - copy_align =3D max(rx_chan ? rx_chan->device->copy_align : 0, - tx_chan ? tx_chan->device->copy_align : 0); + if (qp->rx_dma.chan) { + for (i =3D 0; i < qp->rx_dma.num_chan; i++) { + rx_chan =3D qp->rx_dma.chan[i]; + if (!rx_chan) + continue; + copy_align =3D max(copy_align, + rx_chan->device->copy_align); + } + } + if (qp->tx_dma.chan) { + for (i =3D 0; i < qp->tx_dma.num_chan; i++) { + tx_chan =3D qp->tx_dma.chan[i]; + if (!tx_chan) + continue; + copy_align =3D max(copy_align, + tx_chan->device->copy_align); + } + } =20 /* If DMA engine usage is possible, try to find the max size for that */ max_size =3D qp->tx_max_frame - sizeof(struct ntb_payload_header); --=20 2.48.1