From nobody Sat Sep 26 12:28:39 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013039.outbound.protection.outlook.com [52.101.83.39]) (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 12CC73AE195; Tue, 1 Sep 2026 11:48:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788263339; cv=fail; b=B5W6a4ttjCHbl55S7/hKamSp9Bv+EYiTOyM/QRjaVSd7j8MKyOokztzKIAqwb7JTdOfGaCYp32mfyA1ZaFFpX+vB2UGVlWeB/UJLBfG49EGBca7OQ9A9PxVs9eE5PaY2oMjhx6WL6yQZU1E26koyr6GUsUg+QdobYABpFNyIe3w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788263339; c=relaxed/simple; bh=nH2wEEh/huxut2zRVhEmUvOUsDgaNqWzQ7kG58N0nxw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Xv0NxQ/Lq3G7Uz3AT44NzIan2427C+JxfpntRqNkpvBuWXrXs7grhUa9HDegm/Ax5aj/tC0vHcXEF4t1K/07U1NatoJ6uGPJ8zYzijK3FSeQVM5mD0ztg8ERoyejtUBQh15tZJ34H6+0Ee2ZoDIzRNa5AHd1znwRYIMm7imM4j0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=S1cXktB4; arc=fail smtp.client-ip=52.101.83.39 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="S1cXktB4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sTMa6sQk/SKc/jvHIOinRTgBdyINOIRSaWSa68sTfpRyWAemXLJ8GaCry2jOhKodYTRy95vjBBHOrUo3D/zc9QWoT+hQxrf8mvDYB/tBjQ0d8sNVI3EYkmQfJimrRUv8DOEzdG7CO9Z26H9unQ89r6XQm/sB0jYVr+tC5XO9aSlHm2uFs2ewaxQIJT/zJTLWodJWoqudg2/5sntHs4g+A/LiJIyUJgAsKZzC5f5APKxckYivFFLqfD9Njp4OU4Xp4zCim+11jQEL78GWtTKPIGnwKofsmcldN9iam5ViYa+Y97ge54ksLwGJnVuu2EKMK52a15VQNEIZSgAKCXrgdw== 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=7FBWJeS1MQOSdXBgxfttU7zMh63dJLVmgB54nZNbWEU=; b=sTL5PVX+Yi+YAtWIZpefxGs07IXj5N/YXU9vZs6oYjYKmyZT9qhPSfLis4cTwf7GtggrUXEMXQ3km4h3ZNRDwx60v5bAGQfgXCLUkbiQVUksA4bsOQCavOWddZmMPZYBs9w7ULXQz5yfivT9gZ7EkXWFIvk8uZ3A9MxEGqFS/PexTZayUnXfbIXjsKuO8GRjb5uOU3Qa+IldBkfWJBADlLvjDbFrqQrXgjP6ETUX2nHWfa94MWtc6B0x4VMOCT8FkMPmG/FehwXBzKPkbXX/IlAhXVD6RWgsUq7jl0MU1I+t9SJinlUPjEGvjuPHbtxvhi7Z+vi5QCoYWbqG2kkOzw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7FBWJeS1MQOSdXBgxfttU7zMh63dJLVmgB54nZNbWEU=; b=S1cXktB4brImSMUd1uhnV4JebSwjCg2PhftkfFnbpz5NW6324RjCqiAHWltAEVqNXKDD8cFwhfONBA5MlTwdNPuTMKE1vkh/E3Y8JK0e3/D7VjOg3YSvqZPAk8cK1r3IXqYqrFWjvUnxzXHHaXkUn4vMsOie3Pi33AIUPGb2OQXnZ91o9tUCuHywXLTXFP4FiJNTDU5C30xhyPI/hZhSZM60ty5aDNgWLDiK5uISFWhthfMOYp8CjkkrYq9QBa7c4Bqc+SQk/zk9taNC7N7A0Tl5YpS08cTZ21L5BpyBIYwF/e9Z1T3YWfSsOTA+nshn9dL5587Os20zV60Yk1Y76A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM0PR04MB5858.eurprd04.prod.outlook.com (2603:10a6:208:132::23) by DU4PR04MB10717.eurprd04.prod.outlook.com (2603:10a6:10:584::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Tue, 1 Sep 2026 11:48:53 +0000 Received: from AM0PR04MB5858.eurprd04.prod.outlook.com ([fe80::bdf4:c9d1:4e3f:68c6]) by AM0PR04MB5858.eurprd04.prod.outlook.com ([fe80::bdf4:c9d1:4e3f:68c6%3]) with mapi id 15.21.0360.008; Tue, 1 Sep 2026 11:48:52 +0000 From: Ciprian Costea To: Marc Kleine-Budde , Vincent Mailhol , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Kurt Van Dijck Cc: linux-can@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, s32@nxp.com, Ciprian Marian Costea Subject: [PATCH v4 1/3] can: rx-offload: make skb_irq_queue per-CPU Date: Tue, 1 Sep 2026 13:48:46 +0200 Message-ID: <20260901114848.500591-2-ciprianmarian.costea@oss.nxp.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901114848.500591-1-ciprianmarian.costea@oss.nxp.com> References: <20260901114848.500591-1-ciprianmarian.costea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0127.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:94::13) To AM0PR04MB5858.eurprd04.prod.outlook.com (2603:10a6:208:132::23) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5858:EE_|DU4PR04MB10717:EE_ X-MS-Office365-Filtering-Correlation-Id: 3dd6ca00-1e1b-4bb6-c239-08df081efe98 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|19092799006|23010399003|376014|7416014|22082099003|18002099003|56012099006|10067099003|11063799006; X-Microsoft-Antispam-Message-Info: U+I52vR1QjEclxKVK753g1TRBTZnj95a7jjAvwf3ePntCZJ2spshqWIwEWLF8KJopITZ1+vDkG3rR482v/19h5lxMjk0RUZTAe44uvbBGhc7XCzAW8N80boUQYeoYQ1x6MztGK+n8SvXNXY6xtMhOYFFNzP840l9m4IKzwnCtGguMpWvc/cjEwPDylHU6BZ0EYeICIYnWhov+XP2c2BAvA81ExxkLvhqjiInnyS0PlfXfnCyBOHq6DMowFouzO2sUB5eWDg8FbbBn84QYjt4J5lROzQ7k6nSSxd5cs5w6SMo09bCJgEufYxXobd4z7a9i9BHySRpLfwQegMWARLRS7ef8haJ9XAu1ZIWNc26XZP94gFEWqFMvW4Jn/v/RBDFSv86gL+c0p0wkGPW92NMvCFoh8teCeDVp9CgsDeborW/CtLq6ECkun5MBEWDJ33+DAeZlsFqGypmQg0QDCq4hn1ObnqVAVRjRgO+GQPIOsPOLP5qsEzAMFOkkU/fr4NWhxJqXQZ5ebU+szzKCWdZU98CShRsuX+0Y69nfkPMQnoRhMI2M6z6wrbVW0xyNtNXSsHLSumVfu2qFtIf1CA6Q6td0c2a26gOjoutAPMMqFgD3LwcF9HJ3DQbCpkEYJfz30reyYJb6zrDVLcRLokiPpQX7lZmDo3avuRnL6tq6Q4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5858.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(23010399003)(376014)(7416014)(22082099003)(18002099003)(56012099006)(10067099003)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cExOdU4xeXpRWE5SVmh5MGlIQjFDdHVIL2JwdzVDU0JjeUZOYnM0RnAweWk1?= =?utf-8?B?MENBN0RHZGRPUHlTUWpiUk5kN2k2cVVraThqN1REaXphbG1xdHNzbnBiSk5Q?= =?utf-8?B?ZTdHeklaeDBYWXAzODY2am5EcU1vVXNmWkVJS0U4ZUtTa3hOSWpHc0xKQlBD?= =?utf-8?B?c29LOHRjRnQrWjBTOFR3NHVhcWNFS0VMU1JaZUNmSFdYeDFaVklUNkowU21V?= =?utf-8?B?SnlJU2p2M2NHYlBDM3BLM25sUzliRHNCZnNRVkpqWTlEMzZramJpUFplZ0l2?= =?utf-8?B?d25BSXYvRDlvWS92djZENTlmV09lZ01aMllxNWxXcU9HNm5RS0V1RnFFVTNu?= =?utf-8?B?WlhsRE5PNS9QZStnc2FrOGMrdjl0VXp0bmErNjh5MUNTQ1BCN05WNTlVOUFu?= =?utf-8?B?am9Bd1lURFhIWXdQQmJjMi9DRE14TE5DbXltbE1hbUQ5MldZd3VtYnQyaGNM?= =?utf-8?B?Ri9pQ1h4S0dWQURNVlU2bHZHVlY1WkFCbERWdTZ3SEZRUWdqLzlxTVE1YVA1?= =?utf-8?B?aWlRb1U5K1JNTW1xWWF2OWEzYzBXZ3QveGp3d3p2NG5ab0oyWGRpZWc5bVZT?= =?utf-8?B?VlBkOE5rc1ZUYjQ2cWNKeEdvSjdMRHRTSzcwSlIvMGQrdjFZZmJ2TzNvNEF2?= =?utf-8?B?eXVudGg0RjRCZGl1YnMydWFBaWppY20wcmttbnJGNzlrN2NYUWFac25iL1ho?= =?utf-8?B?MjdYV09Hc1gybjFERHM2cnJEV0srRXowZzNJU0RFUU9ISlZGT29WU093WG5t?= =?utf-8?B?bFhUcmIxNHovaGUrVUYvdU1hVXVIWW51Y1F2Uy9NZjZpTGhxLzRwcFpadEkw?= =?utf-8?B?M29IMGFvdDl5TkZMMVIraUx1ODFnbCtKY1ZIZVV2OUp1SnV2V1k3NDZyU3FQ?= =?utf-8?B?RFRPb3NQYlZhZDBteVVRN0d6ZGRTMk9OczhUOWhXUE9DUlRhU3BlckU5eHRy?= =?utf-8?B?MWVvL29EOURWUFdSN0lSeDBodnNKbkszeFhVc1NZaEN0TittZXVmanNMWE90?= =?utf-8?B?cUU1YnIxN1V6b3V1bkVTK1BQNEJNeEJFT1NRM3paMDg4UFN5R1BZRSt4VzB4?= =?utf-8?B?NGRxZkhHQmlsTittUUxrSGg4a3VGNTNjUXBicVJCbUNRSmNyVXNFS2wvbVIx?= =?utf-8?B?KzRSR0ROVnJsQjhMMU9jcldFbThiVHlPYUY2YVNKdUwyNStyNENNb1pjQmwz?= =?utf-8?B?dVNVbmRRT2t5VXhtQVRMRlZWRlRGZUJmVHFzL3RKeEZsOVBPZHRoM3F5Nllx?= =?utf-8?B?eEsyMVZla2tjVm14Q3FtTWU5RGF5aWEvOHpUVzNmTGtYS2NNTkZJNzY1NGdr?= =?utf-8?B?VWhlSmZGTFhNK2h1ZjQxNHE0dTlOTnQ2VlhXeUJHdTJHdHBDNjd4NXVXa3ZK?= =?utf-8?B?QzliOGFnUHVnb1EvaEd1SGU5Y1FZT0N4L2ZiMTBsajV1T2lYVFdCQ3ZISkRU?= =?utf-8?B?S0NidnlheUoyTzg5cUtmTkJGWjF1eW9kcTB6cnMzbWFTeW9nRitIS0pHUFlW?= =?utf-8?B?U3dOQjVPZ0txWEpiYXU0RlhXbnZsaWRPOTZGd0tRMzExek1CMnpLSVB5TFJK?= =?utf-8?B?WGJ1UjY0RmJ5SGZtZjVrR1lpaDJZb3FpaE4waG9ITitBbXFtclBDTXgzb1V5?= =?utf-8?B?THRSb0FlYlQ5RnFUdnNMRjBCUVpTbGdVdW85eXh0L0VwaFJ4QW1jSEw4YnRl?= =?utf-8?B?enlySW96c0hzVUtEdW93TmRvK3gydDI1bjE5aFkxRm5MTzdadjJqOW8vSjJS?= =?utf-8?B?UVBPL2s2UlhSMnpiOXZ2c2FtbnBqeWcvM0hCZm1WQXdmKzhPaUVydHl3WG9X?= =?utf-8?B?a1l1cjBialJNQ3NPdSt4MzFZV2pZbUVzVG9jbzVQU0tVR01GNElVdTJvOUxp?= =?utf-8?B?YXpyQkd1VmZRc1lMTlFJdy9jWFNSTG93TFVrRS94SG1CMko3dkRsaXRwMkxw?= =?utf-8?B?L3JLQlh6WlBRbUZvWnE1YlJvU2UrWnBvNFFDM3R1QUF1ZnZ5a09aTkJuS25S?= =?utf-8?B?T0pIcU5GVXBXOExaelFnalZxVTkwLzlrZFRLLzZxYVFQa3ZrZHJZM0pmZFhX?= =?utf-8?B?SXlSVWVoTmlyeXg5MmMzcVZKOW1DejVMZ2tBbk04UzdGNFpVVGRNVmtYb3k3?= =?utf-8?B?UUYrYVc2NW1yZWNOOWhKL3VOYzBpVXRiU0NwK0NhbzNaZkFuYllOdklLRVk5?= =?utf-8?B?SnNYSHJPS2syT3VKY1d4bWo3d05aRGpHS2FCdEYxUEIvSVYvc3dOZXFhZy9r?= =?utf-8?B?M0lUWmNnb2t0NW5KamkrWU5PaVl1Ky9ONGNsQ1JFRnhqYWFnbiswWGVUQzBr?= =?utf-8?B?dWxnUzA0VERiem5jZ1NWUm16WnhxNGw0aUZtM2dpeHVvUVlyM2dzbFc0dk1R?= =?utf-8?Q?Tpnjb+AEFq/ZQ+ew=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3dd6ca00-1e1b-4bb6-c239-08df081efe98 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5858.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 11:48:52.5190 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: gQd9rB94SlULt4Xrp1yjoxoZJ+fH1jsI9rWQQDTXoFq/tDEAUpmltYK5K+wGUYFJy8JzqZ5vrnQN3WRRhT+p51sX4wGpkSAmQUxqzbF8dV8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR04MB10717 Content-Type: text/plain; charset="utf-8" From: Ciprian Marian Costea skb_irq_queue is filled by the IRQ handlers using the lockless __skb_queue_add_sort() / __skb_queue_tail() helpers and later spliced into skb_queue under skb_queue.lock by can_rx_offload_irq_finish() and can_rx_offload_threaded_irq_finish(). This is only safe while a single context fills skb_irq_queue. FlexCAN on NXP S32G2 (FLEXCAN_QUIRK_SECONDARY_MB_IRQ) uses two mailbox IRQ lines, one for MB0-7 and one for MB8-63; MCF5441X similarly splits its mailbox interrupt. When these lines are affined to different CPUs both handlers can run at the same time and enqueue into the same sk_buff_head concurrently, corrupting its list. Allocate skb_irq_queue per-CPU so the handlers no longer share a list, keeping the enqueue path lock-free. Access the per-CPU queue via get_cpu_ptr()/put_cpu_ptr() in the enqueue helpers: this disables preemption around the lockless __skb_queue_*() operation. can_rx_offload_irq_finish() runs in the same context as its enqueues and splices this_cpu_ptr(). can_rx_offload_threaded_irq_finish() may have been migrated after its enqueues, so it splices every possible CPU's queue; this is safe because each per-CPU queue has a single producer and that producer runs with preemption disabled, so it cannot race the splice. Cross-line frames are now sorted by timestamp only within a CPU's queue and appended across CPUs on splice; each skb keeps its own timestamp. Fixes: c757096ea103 ("can: rx-offload: add skb queue for use during ISR") Signed-off-by: Ciprian Marian Costea Reviewed-by: Haibo Chen --- drivers/net/can/dev/rx-offload.c | 83 ++++++++++++++++++++++++++------ include/linux/can/rx-offload.h | 2 +- 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/drivers/net/can/dev/rx-offload.c b/drivers/net/can/dev/rx-offl= oad.c index 46e7b6db4a1e..649bfda08b65 100644 --- a/drivers/net/can/dev/rx-offload.c +++ b/drivers/net/can/dev/rx-offload.c @@ -7,6 +7,7 @@ =20 #include #include +#include =20 struct can_rx_offload_cb { u32 timestamp; @@ -175,9 +176,18 @@ can_rx_offload_offload_one(struct can_rx_offload *offl= oad, unsigned int n) int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pending) { + struct sk_buff_head *irq_queue; unsigned int i; int received =3D 0; =20 + /* + * get_cpu_ptr() disables preemption so that the lockless + * __skb_queue_*() below operate on the current CPU's queue without + * racing a migration. This also keeps this_cpu_ptr() valid when a + * driver enqueues from a preemptible (threaded IRQ) context. + */ + irq_queue =3D get_cpu_ptr(offload->skb_irq_queue); + for (i =3D offload->mb_first; can_rx_offload_le(offload, i, offload->mb_last); can_rx_offload_inc(offload, &i)) { @@ -190,20 +200,25 @@ int can_rx_offload_irq_offload_timestamp(struct can_r= x_offload *offload, if (IS_ERR_OR_NULL(skb)) continue; =20 - __skb_queue_add_sort(&offload->skb_irq_queue, skb, + __skb_queue_add_sort(irq_queue, skb, can_rx_offload_compare); received++; } =20 + put_cpu_ptr(offload->skb_irq_queue); + return received; } EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_timestamp); =20 int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload) { + struct sk_buff_head *irq_queue; struct sk_buff *skb; int received =3D 0; =20 + irq_queue =3D get_cpu_ptr(offload->skb_irq_queue); + while (1) { skb =3D can_rx_offload_offload_one(offload, 0); if (IS_ERR(skb)) @@ -211,10 +226,12 @@ int can_rx_offload_irq_offload_fifo(struct can_rx_off= load *offload) if (!skb) break; =20 - __skb_queue_tail(&offload->skb_irq_queue, skb); + __skb_queue_tail(irq_queue, skb); received++; } =20 + put_cpu_ptr(offload->skb_irq_queue); + return received; } EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); @@ -222,6 +239,7 @@ EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); int can_rx_offload_queue_timestamp(struct can_rx_offload *offload, struct sk_buff *skb, u32 timestamp) { + struct sk_buff_head *irq_queue; struct can_rx_offload_cb *cb; =20 if (skb_queue_len(&offload->skb_queue) > @@ -233,8 +251,9 @@ int can_rx_offload_queue_timestamp(struct can_rx_offloa= d *offload, cb =3D can_rx_offload_get_cb(skb); cb->timestamp =3D timestamp; =20 - __skb_queue_add_sort(&offload->skb_irq_queue, skb, - can_rx_offload_compare); + irq_queue =3D get_cpu_ptr(offload->skb_irq_queue); + __skb_queue_add_sort(irq_queue, skb, can_rx_offload_compare); + put_cpu_ptr(offload->skb_irq_queue); =20 return 0; } @@ -268,13 +287,17 @@ EXPORT_SYMBOL_GPL(can_rx_offload_get_echo_skb_queue_t= imestamp); int can_rx_offload_queue_tail(struct can_rx_offload *offload, struct sk_buff *skb) { + struct sk_buff_head *irq_queue; + if (skb_queue_len(&offload->skb_queue) > offload->skb_queue_len_max) { dev_kfree_skb_any(skb); return -ENOBUFS; } =20 - __skb_queue_tail(&offload->skb_irq_queue, skb); + irq_queue =3D get_cpu_ptr(offload->skb_irq_queue); + __skb_queue_tail(irq_queue, skb); + put_cpu_ptr(offload->skb_irq_queue); =20 return 0; } @@ -307,14 +330,15 @@ EXPORT_SYMBOL_GPL(can_rx_offload_get_echo_skb_queue_t= ail); =20 void can_rx_offload_irq_finish(struct can_rx_offload *offload) { + struct sk_buff_head *irq_queue =3D this_cpu_ptr(offload->skb_irq_queue); unsigned long flags; int queue_len; =20 - if (skb_queue_empty_lockless(&offload->skb_irq_queue)) + if (skb_queue_empty_lockless(irq_queue)) return; =20 spin_lock_irqsave(&offload->skb_queue.lock, flags); - skb_queue_splice_tail_init(&offload->skb_irq_queue, &offload->skb_queue); + skb_queue_splice_tail_init(irq_queue, &offload->skb_queue); spin_unlock_irqrestore(&offload->skb_queue.lock, flags); =20 queue_len =3D skb_queue_len(&offload->skb_queue); @@ -330,15 +354,29 @@ void can_rx_offload_threaded_irq_finish(struct can_rx= _offload *offload) { unsigned long flags; int queue_len; - - if (skb_queue_empty_lockless(&offload->skb_irq_queue)) - return; - + int cpu; + + /* + * Splice every CPU's queue: unlike the non-threaded + * can_rx_offload_irq_finish(), a threaded handler may be migrated + * between the enqueue and this splice, so the frames may sit on a + * different CPU's queue. This is only safe because a given per-CPU + * queue has a single producer (the enqueue on that CPU is + * non-preemptible), so no producer can race this splice. + */ spin_lock_irqsave(&offload->skb_queue.lock, flags); - skb_queue_splice_tail_init(&offload->skb_irq_queue, &offload->skb_queue); + for_each_possible_cpu(cpu) { + struct sk_buff_head *irq_queue; + + irq_queue =3D per_cpu_ptr(offload->skb_irq_queue, cpu); + skb_queue_splice_tail_init(irq_queue, &offload->skb_queue); + } spin_unlock_irqrestore(&offload->skb_queue.lock, flags); =20 queue_len =3D skb_queue_len(&offload->skb_queue); + if (!queue_len) + return; + if (queue_len > offload->skb_queue_len_max / 8) netdev_dbg(offload->dev, "%s: queue_len=3D%d\n", __func__, queue_len); @@ -353,13 +391,21 @@ static int can_rx_offload_init_queue(struct net_devic= e *dev, struct can_rx_offload *offload, unsigned int weight) { + int cpu; + offload->dev =3D dev; =20 /* Limit queue len to 4x the weight (rounded to next power of two) */ offload->skb_queue_len_max =3D 2 << fls(weight); offload->skb_queue_len_max *=3D 4; skb_queue_head_init(&offload->skb_queue); - __skb_queue_head_init(&offload->skb_irq_queue); + + offload->skb_irq_queue =3D alloc_percpu(struct sk_buff_head); + if (!offload->skb_irq_queue) + return -ENOMEM; + + for_each_possible_cpu(cpu) + __skb_queue_head_init(per_cpu_ptr(offload->skb_irq_queue, cpu)); =20 netif_napi_add_weight(dev, &offload->napi, can_rx_offload_napi_poll, weight); @@ -420,8 +466,17 @@ EXPORT_SYMBOL_GPL(can_rx_offload_enable); =20 void can_rx_offload_del(struct can_rx_offload *offload) { + int cpu; + netif_napi_del(&offload->napi); skb_queue_purge(&offload->skb_queue); - __skb_queue_purge(&offload->skb_irq_queue); + + if (!offload->skb_irq_queue) + return; + + for_each_possible_cpu(cpu) + __skb_queue_purge(per_cpu_ptr(offload->skb_irq_queue, cpu)); + + free_percpu(offload->skb_irq_queue); } EXPORT_SYMBOL_GPL(can_rx_offload_del); diff --git a/include/linux/can/rx-offload.h b/include/linux/can/rx-offload.h index d29bb4521947..1b9e2a8ab39a 100644 --- a/include/linux/can/rx-offload.h +++ b/include/linux/can/rx-offload.h @@ -20,7 +20,7 @@ struct can_rx_offload { bool drop); =20 struct sk_buff_head skb_queue; - struct sk_buff_head skb_irq_queue; + struct sk_buff_head __percpu *skb_irq_queue; u32 skb_queue_len_max; =20 unsigned int mb_first; --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013039.outbound.protection.outlook.com [52.101.83.39]) (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 39C293C1F5B; Tue, 1 Sep 2026 11:49:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788263352; cv=fail; b=kPAXqrtv1H3ukOwW0iNsVxgv4B0Cxlm4MTGxngQVHseoKzPsvsoM/2a4YgeGTGrpmCWLMoac1z9H6iqd8uWjCC2Lh7GZiQBxDU0YoiGcdy+XSX08C8uUGFPQuJ2x7huh+wGmNLy9E7xKlmWsPr8heTKNtCEwF0Z/uN5hFVP+wO0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788263352; c=relaxed/simple; bh=LsMMtqRj3M0OWc3uEs6GojWNGvi7dfMNwtUn9xBZoDw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=c1IBqau0ChTyWV21L2sRiuaknSvNTxsSx0j+EpHwjii9bMb+1h65OE87KCvTnhp3x6DG3S+2TyaVRtjk+z+tv4CQPsk1pBhQZnKKcXm5Z0e/BuRCuZ2OJYghmOkia/ikeM56lnQk8xwwU6VYoICQolCN9OSAog+zbpHTCTRom3E= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=Ch/lMrpT; arc=fail smtp.client-ip=52.101.83.39 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="Ch/lMrpT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=d0GSApgRNI9GpKn7n5/lTk0r1oOtmiG2bRXvaqh9adwZEB+EpRmPPnuTZY8cetyW7RQYCoTprxKZOo6WJyJUgf8nmNpqLodzKi1GgZgT2kfnbefMVvaNvwRyjUwImW4Zwy1YjBCRJFNd8FeSNa0rrrWmIQ7uwE3AGu3wnKi4BxAvY5mJBKRwNo5Va2AUF2WckgtdaGUhWH2VCOOWmSpYjQMbIHz4R+u4iSw66eYmLKTpiBJ7HO91MvhF8ab+xL7sHa9gSKfzikyQpecYcUFmVye7AqDjYBt5ZNNAXJzMlN5TL/7NX8GAW4lIyyXHJeiKSV9yFVEZUB6B9USiS+lv2g== 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=uZMRLx2jnL+NjNb1tkWootG7u1lAvnyAwkpLwwFr6LY=; b=D/w0z4foMKRNziCjMIr14sNYg7dsIHekyf+ZC90rF40UcHd2Qzr/+r0GsLginRIbW569WHrs3iw/QKEat8RVrFVnXDJd/lZ9cyxAXHzDF/uJPEq5QwTy6H0NSyfRXsnDoQ+1PV99usyDWfZ6BJFyAn2w688lymgHqkV6gH2GhtsZB7z+lw0k7fd6TgJ1fb0zidBNvOH/eTwml30tFhnILvzKrLrcxbmU0nQoynIAFAFIdbyLavdBZM5uGQtUAR0pYeUvdEbAxfMDaHs77xI6nB93f+5n1iJGIi0mjQ9cAX9EwLKk3O2GRJ9KgNvVQWQg8Pl5xjgP3WkVftmX/m5apA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uZMRLx2jnL+NjNb1tkWootG7u1lAvnyAwkpLwwFr6LY=; b=Ch/lMrpT/1KVtv638Zw5ln6s77vPmcb/j6QC7UqwDJqEKtqXTlr3qpX0H4BnJnotPxZOblwSgUnhnG2s6JW4nPuADUtQEOEB4fzwMPrWr00m7zhAfh2aijTMyf8g9ehiZSmOz/L8qWzJNA7q/YgWZ+tX2BODTKqHRmjEPzJYawbgViRbbwzBUuRlawuNPrrs2DqnNI1iUtZAff9Znxrb06BBQOnyyBFSiXFinu/l9/HhXIdOBo6UX578q4nhonFzCM18du54oBVkJvx9yzd3p8bvyVQJbRcG1LH7XZMdb7CEsWF5jhvQ4I+4BlbRBpESeOmdYQlRz7JwhOrJHjD/4g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM0PR04MB5858.eurprd04.prod.outlook.com (2603:10a6:208:132::23) by DU4PR04MB10717.eurprd04.prod.outlook.com (2603:10a6:10:584::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Tue, 1 Sep 2026 11:48:53 +0000 Received: from AM0PR04MB5858.eurprd04.prod.outlook.com ([fe80::bdf4:c9d1:4e3f:68c6]) by AM0PR04MB5858.eurprd04.prod.outlook.com ([fe80::bdf4:c9d1:4e3f:68c6%3]) with mapi id 15.21.0360.008; Tue, 1 Sep 2026 11:48:53 +0000 From: Ciprian Costea To: Marc Kleine-Budde , Vincent Mailhol , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Kurt Van Dijck Cc: linux-can@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, s32@nxp.com, Ciprian Marian Costea Subject: [PATCH v4 2/3] can: at91_can: fix rx-offload cleanup on unbind and probe errors Date: Tue, 1 Sep 2026 13:48:47 +0200 Message-ID: <20260901114848.500591-3-ciprianmarian.costea@oss.nxp.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901114848.500591-1-ciprianmarian.costea@oss.nxp.com> References: <20260901114848.500591-1-ciprianmarian.costea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0135.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:94::19) To AM0PR04MB5858.eurprd04.prod.outlook.com (2603:10a6:208:132::23) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5858:EE_|DU4PR04MB10717:EE_ X-MS-Office365-Filtering-Correlation-Id: f8e2a212-a47c-43db-05dd-08df081eff64 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|19092799006|23010399003|376014|7416014|6133799003|22082099003|18002099003|56012099006|10067099003|11063799006; X-Microsoft-Antispam-Message-Info: Vn2hbWSNfaL6t2Z6cZK6BCh2j2iaRJkM5JOeLY13Vqo7hKubxCpXEcRMKjRLxTCBD+eFp4WZWKM5N94zSYnEttMT7xPAINKK4yvsShQqjcG3rZF7TGiW6pj1imENKHvyYpKcnPEaaiQlOylO0YJ1If210XGq1w+2cxfJYwL3VpCj6j5Xk7Dhi7W7NdXlKAewE/+4OfUb1lOX1K4ugR7bCFck2TzyB7ydTqDWMwOqJsCLrzLUMWMj9tJvCas2Y5NJh9SVuvxCr06nCYeMmavli/Btwdc98nwm2Rw7PTHpQl1QKECVWp+xI8XfT+ZLNKQr/ZL152ZGpJxaMS3nwIrh2a1+pH6E5/npqm8qKZluA/ST3Sk9h1nzIUDZo5gvlBRJeYQ1ROZA2gk05vTBew193soXRVgZe8tAPJkDCUW6DJ451ZCDE6qyRHD//2OZZtfzGoG5FYD44wT5lxwi5eQlXymlbVMFLXpkGGmDwQNTBk6V5oFD3YBAW6WBkq8vYAuOCF/V1mCGLm9O+fFesZD6aAQHA4sVN1I9+++7zJvAQnwImAsPCE6vyDIivZ1NNe4KhUpmRnXJNh7yVEGgUnaulPP4ImXmMYbnOHV8bn4IEgjOlJSQrWOHu11OxT3UeINSVzYexZi3leCv2Me2LLx0szPxIW36CId8g6NLGLyaB5Q= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5858.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(23010399003)(376014)(7416014)(6133799003)(22082099003)(18002099003)(56012099006)(10067099003)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ODhFcVphSi8zTVBET1NFb2lrTnRONVN4WEpyZUpLM25XRUwzcTVrVk9kSTVN?= =?utf-8?B?MlowZjVJbnpvVEthTXkyaUJaV25jREFGTXFmK3hMa09jS011THNSVVJiRjFG?= =?utf-8?B?L0Myd1VYYXJzaFNtUGFEQnUxbkhGd2xLektaZ3k0VVVMeklkeE83SGpJNzAr?= =?utf-8?B?UGxqcEZQYzFyaXdDRnRoMDB0emlxOXd2MDJFcmpZdVJXZHZyczJXS0o2QURG?= =?utf-8?B?R0R3dkpOT1pLZkt4cWM5dFVxNE5yR3dLdERVeWpPZ1B4dGNick1LNGZROE1j?= =?utf-8?B?MDZSd3J2VWN2aVJUVCtiRHBta2owbEFQOFJzMUpSL0lmQTdLbHdxNkxXUWNt?= =?utf-8?B?L01ZaHdKZDd3a2l1NWg3dXN3cDJOVWdKZTNCRHRRSmdmbGNudUpuSFdJMVBs?= =?utf-8?B?R2FFc2tVYWlYQW9iMXo2TGxKaGFwMmJYMm5pYTRpa1FGbVFkTnlqNkhmNXRT?= =?utf-8?B?dmlJeXR5UkQ4RkZPLzdNZWRzY0dUVFI5VkF1NEtlQ1UwRVNaM1BhSHNQVXBw?= =?utf-8?B?aEVzMmhocXVwVUpFM3ZmM1E3bnltRjd3d3NhYjJDWnd2SVViWHo2T1dXZ1hZ?= =?utf-8?B?WnlFMm1GRXBWT3VxRkZqa0Z4WmRlYUVtZCs2T2tXVlRnanhOSWVvM0RLVVNL?= =?utf-8?B?TzlNMVQ1YjhSYTBUa0t2UW9tNzBqK3Vpcm9PNWFwbG11c0Z6eWU2a0l0cjhq?= =?utf-8?B?V3liQXJBckllK3duaDdDQy9qNUswZG9VMTBJSXZ5ZDFOOWdBZWFhNWkvSFhG?= =?utf-8?B?QWpmb2UzaGxIYk1WUHZYeFlLMDl2L3kwUGZRZ1d4UlV4UkFZVzJCcXUwWjk0?= =?utf-8?B?Z1NoNmhtVXBFT0h5TWRFWU5UVDAwS3RzeWF5UWNJZk5Ka2F3N1RJZUg5YUhs?= =?utf-8?B?dGpYOWVXelhrMkt2VnpFbnpFb0YvUGRZaHUwc2ZrV1Q4bnVTOTlpQkVkakFZ?= =?utf-8?B?Rkttd1dXS1BxRStnT2xqQmFpdWIySUVUWlF5U0VGMVBBWFRvMTVIZ0xPWGVK?= =?utf-8?B?TXZrZjRaWVFPTk1MVURWQkxZakJ6MnZId1pjT0dxeENPd3VUdi9vWGFDNGpZ?= =?utf-8?B?TzB4U1o4YVNCbGxHbHZmUVUrTFVaRjVpd0Y4d1ZVZFdLd1krTVBBUHFKQ2s1?= =?utf-8?B?NUFsQUkrYTdVVXpEMmxsamJ5UHI5SDNOZjI1UVlTU0E1dGVLQm9yTWZ3NEp3?= =?utf-8?B?RVdEYmo4bisvK1kzVDQxenBUNk1OaW5sSlpBMkRxcGVxUW5pWUw0V0RmbEVL?= =?utf-8?B?UmswQ05QY3RWbkVNcmhudkVVbko0dDE4Ry92aDBnWmtBUExrNitxeHJveTFj?= =?utf-8?B?UjV5RWFVYW5VQk1Mb2toQ1RQUGVrclpOdkNGR08rSVZ3RTRyTnJKbmxUTmxl?= =?utf-8?B?amVOeEE2TzdKT2FvdEtZb0w3SHBJRnI2THVYSDJXR3gzYmdSN2xaVlZZSFo4?= =?utf-8?B?bVYwaTg4a0NsR3BqVFpuM04rQTFiMU5zQ0xudDNxRzU1aVgxZWNNNHI0WGdi?= =?utf-8?B?dDBPWUxuSlhsdDE4amtkbUg0Qzh1ZkpkeGZWRWZVWmttbzVsRVJWWXlsSG9O?= =?utf-8?B?MGJFd3Q3OTNNY3pVL0pGYjFVeklveWFEZnpDZzdaUzFZTGhDQW5waFFIa3Va?= =?utf-8?B?SjF2MkEvZmtFL3Arc2djZmY5YWdSeTB1cTAxUldnV3hlK3lDVnRaQXI2YkJh?= =?utf-8?B?dUpQTysra0EranQ2VEViYWtlbmdYYVJvbWp3SHU3YzhwaUU5NEhMa2dTS0xD?= =?utf-8?B?MzB2V0xnZjIvelJVd29hZUJjMVdtcTFXQkI2alN2T050c2cxQUIrL2MyMko3?= =?utf-8?B?OTZOSTVFNHY2N0ltbitIZHBIaXp5VUlJcnpsbURXUGRqRk85cmlUeWd0RXo4?= =?utf-8?B?cUZGKzlLY3NoR1lZMWFYYmRUV2JuVEdsNFpLU29KTEJ5c2xXWTFXN1E1M2lt?= =?utf-8?B?S21LV2NjUzY1SGdUVGlTYzlxUHRTRGdmcXZRZGtrUk1hbjNCRHRQU2ZhckNl?= =?utf-8?B?NFY4cGdzVDBMUUtSU1Y2MmsybDI3Wmd5Y09QWmlFMUNsbFU4MW9TMU41OS93?= =?utf-8?B?T1M5Vmw3VzhwaURocllqdnpONjgyWTlYVWZqQ2xvOG5VOE52U0w3KzVIUzlq?= =?utf-8?B?QTRHaUdkc3pJYzRoUjlpcStqc2l1UjNBMUpoL1I1VW5BZ1VOM3FHKzFTZXgx?= =?utf-8?B?OG9DVzJOd3FaQ1I0eE5aMWFLQlZoUFJCY3lmeTFhejIxaTU0eDRrY2NGMCt0?= =?utf-8?B?MDByb2h1R0ZyWGg0N1U3Tmh1K3U0NjZGY2p6d082Zng0a0l0SDJkc3dMN3U0?= =?utf-8?B?Z3JUektDbDZYT1Mvc3ZQbHlVc2Flcm5HQm5NeWcrRDR3VHNFYjIrenNjeVFY?= =?utf-8?Q?Xcw0j5RqdzOZABhE=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: f8e2a212-a47c-43db-05dd-08df081eff64 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5858.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 11:48:53.8502 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xMwgyArIhlgVAHxmRa9a4mvwznvubaHHHEog+WTnfQIfsqwkUA084py0vmQblyL5/6URHluZFh5awuHhU1fnauGjhvnMMk9chDXZA/GlcR0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR04MB10717 Content-Type: text/plain; charset="utf-8" From: Ciprian Marian Costea Making can_rx_offload's skb_irq_queue per-CPU (previous patch) adds an alloc_percpu() to can_rx_offload_add_*(). That allocation has to be freed on teardown and can fail with -ENOMEM, which exposes three problems in at91_can: - at91_can_remove() does not call can_rx_offload_del(), so the NAPI instance and the per-CPU queues are leaked on unbind and module removal. - The probe error path after a failed register_candev() jumps straight to free_candev() without can_rx_offload_del() and leaks the same objects. - The return value of can_rx_offload_add_timestamp() is ignored. It can now return -ENOMEM with offload->skb_irq_queue =3D=3D NULL, probe still succe= eds, and the first RX interrupt dereferences that NULL pointer in can_rx_offload_irq_offload_timestamp() via get_cpu_ptr(). Check the return value and call can_rx_offload_del() from at91_can_remove() and from a new error label taken when register_candev() fails. Fixes: 137f59d5dab4 ("can: at91_can: switch to rx-offload implementation") Signed-off-by: Ciprian Marian Costea --- drivers/net/can/at91_can.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index 58da323f14d7..3f6c5bb373d3 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c @@ -1123,7 +1123,9 @@ static int at91_can_probe(struct platform_device *pde= v) priv->offload.mb_first =3D devtype_data->rx_first; priv->offload.mb_last =3D devtype_data->rx_last; =20 - can_rx_offload_add_timestamp(dev, &priv->offload); + err =3D can_rx_offload_add_timestamp(dev, &priv->offload); + if (err) + goto exit_free; =20 if (transceiver) priv->can.bitrate_max =3D transceiver->attrs.max_link_rate; @@ -1137,7 +1139,7 @@ static int at91_can_probe(struct platform_device *pde= v) err =3D register_candev(dev); if (err) { dev_err(&pdev->dev, "registering netdev failed\n"); - goto exit_free; + goto exit_offload; } =20 dev_info(&pdev->dev, "device registered (reg_base=3D%p, irq=3D%d)\n", @@ -1145,6 +1147,8 @@ static int at91_can_probe(struct platform_device *pde= v) =20 return 0; =20 + exit_offload: + can_rx_offload_del(&priv->offload); exit_free: free_candev(dev); exit_iounmap: @@ -1165,6 +1169,8 @@ static void at91_can_remove(struct platform_device *p= dev) =20 unregister_netdev(dev); =20 + can_rx_offload_del(&priv->offload); + iounmap(priv->reg_base); =20 res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013039.outbound.protection.outlook.com [52.101.83.39]) (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 9455D39023A; Tue, 1 Sep 2026 11:49:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788263359; cv=fail; b=DYfoMZSTFORPEic74nKrajox8dw7ORbFPTJyXndou8rSZawubi/rP91A3C7/yfqHDE2+tHSY7NgUOodagXrOIEH2qg+aBw19rOp7lIn2R1XWmLIZdkRpJLPtRZdr+XKmpt7KAZqfa9OVnepZMrCwXRLK/UhpXpw3fK3Ho1oTT4w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788263359; c=relaxed/simple; bh=bQ0YpCqCtS05GiO3Zsae6jxSI6dq6iFoH7aSjBEUtpI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=byyF1MuUoH7jEjVGCvaTMmtp14tWhhM5Ac5FUorAwtOs1IOkB4kEm0fRF1oRLrFmX4zniM82HDp8B3hUlwNIzFcCVNV1Q97OWml4KVOC2jZsLAMlLlCKV929BZeeDXNpYgFaCxYibRITyCBfrsoQluwA2Ol/AOacAFTzh4NgHpI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=oe3Cu0HC; arc=fail smtp.client-ip=52.101.83.39 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="oe3Cu0HC" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YC/SDxuXiSnwPR961S82MDSdrsA/yvbGFpYDRo/UReLr1F2crlrf8Zks5oU74T/WBXPj0KJ6C0zyHHCQJNeeHHCAYkzAjHx/MPKAJ1BNikPuyWaV/4HmwCoLVbnFn7ZSm4Dz3XP8ZGwBomlOXE/puPf9yjSEVFJQhXyfHfPN7NxLrh2RCiKAEJKLCO5zpdQ4WEGCrPu84QLbG6ok7bd/vmd/iUAtp/Sa5mRhYNIn5aWXItLUtqLoqlDQyzVP5JAqpDmqFlIeGMqp98CG+ReBxvVgTrbZTIQ3WpZJUG6ZbYhpmNl6pn+RCVdca7UhG448+b9jZp1jPwObtKtiWkssUw== 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=q078mk27nv/IA37Knfv+c2HeolLnRl5HAWrW7WTYj0E=; b=LjzJGPQDrUfxaaOLKKEV1V4gO+Tp5UEbnVMrGAFQXlHJux0VTFAvVi0vQ2F1hgSqcv9SuNJdcs9+7CPLggFkJ5xUB4XWeHxWqssA5xphkNF3qXYZw++rkzFhhy019n+vqFuUO0H/rm/r1JJuAHAI3cRfyBzzPJlU//VZehpwPAo9I9dhbhhqXasvNf072tPA/SheW6EmqF1l/v4wl5gyb/h2vtwkSWyHkyrCaeq/wz6LD/SmvWPY0aeXilFbiNRIzbDS8/NT3ulpBriNSM/I+Q8IC3zWQMk3Cuncmcmb+dHA4Onv5TWQhpYGPm6Vk7RlsN2IKwnLEhoiL5G0WPe3OA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=q078mk27nv/IA37Knfv+c2HeolLnRl5HAWrW7WTYj0E=; b=oe3Cu0HCvYMuVzjolkQOL50RwR7g6AJgqqFvo6IbKgbyZhIXdYKxhlRfzMhNuxm3RNvoaLcRCcdWmTcBme5v1QnO8jJO65PlC6CarPLec+mVORgj1c3Dm/vZDcbsTUpKQIlFMc5U6VdHVMJwnD0DkIBBQ7eMnVvyBAz/ItI5blEh5fj2mJY+Yj5ludEd1oVosG5SbjciJ4Vted5JUvplNfU9omn9Qd7lr1PUDDn1XTF7NqjBEh4OZAUZjMLHjbfMdLT0hAIhuDk7AqPT7py1rIz71MswHuQG3xysfhXUsa1YPTNKGuGzdPKK1RUQWUUhACKqlqV81RE4tZGwO+Xqbg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM0PR04MB5858.eurprd04.prod.outlook.com (2603:10a6:208:132::23) by DU4PR04MB10717.eurprd04.prod.outlook.com (2603:10a6:10:584::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Tue, 1 Sep 2026 11:48:55 +0000 Received: from AM0PR04MB5858.eurprd04.prod.outlook.com ([fe80::bdf4:c9d1:4e3f:68c6]) by AM0PR04MB5858.eurprd04.prod.outlook.com ([fe80::bdf4:c9d1:4e3f:68c6%3]) with mapi id 15.21.0360.008; Tue, 1 Sep 2026 11:48:55 +0000 From: Ciprian Costea To: Marc Kleine-Budde , Vincent Mailhol , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Kurt Van Dijck Cc: linux-can@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, s32@nxp.com, Ciprian Marian Costea Subject: [PATCH v4 3/3] can: gs_usb: check can_rx_offload_add_manual() return value Date: Tue, 1 Sep 2026 13:48:48 +0200 Message-ID: <20260901114848.500591-4-ciprianmarian.costea@oss.nxp.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901114848.500591-1-ciprianmarian.costea@oss.nxp.com> References: <20260901114848.500591-1-ciprianmarian.costea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0124.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:94::15) To AM0PR04MB5858.eurprd04.prod.outlook.com (2603:10a6:208:132::23) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5858:EE_|DU4PR04MB10717:EE_ X-MS-Office365-Filtering-Correlation-Id: a5019a96-0f90-474b-f8ee-08df081f0035 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|19092799006|23010399003|376014|7416014|22082099003|18002099003|56012099006|10067099003|11063799006; X-Microsoft-Antispam-Message-Info: xUJ/cxILTIHyZ7x0stmSbivxOjz8fwZ0JIN5gpVV/Ym5CNvNy5ZPuuQjCM2CWNcWpFsloyKKHRldvgE3HxyW2CycT08ZdltrKKJHqjGKsuPWwwRFidCzENpDpLs8hipnupZ9yuCqSxwK5dFDLh0x34pNojKlEEYmjMQAyK5w64yGTIYZx6XcbRpeg7Qi0D6M5Dx7lMd48MabOZeNMVVKWNzO4hPNtiYxaWbfyxlr8sR5XoPbmaYip/+FP2MZ5E284E7hiIB7KmbmLfefloHUlwgkHb3lwHjrk8z2rTRn+zwCCXPZg+ZMegNNDU+4OA8Qq2w28dhgRgeyeOCMNok0VSBUm8vZsMjg8xjqQg2V8XGobbUs8vDS5XSBXYafCr4L7wOObnybojbTRoSvVg7xzStqQOYgP2kGuz3mmqSLklsOiSqGHFkuCnox/+TIl/SbnvFN85WsHf0jBF8iwoqycovtvmPubuZOw8GE1iHpf04DFHGYzfr7MZtuzl3M6la+wvpixKfmea+UBZC8Ufp+xlaf8+fByvFJxRM12movif602CWHIfuKU6ncgobo6FmZE7wovyGqgl7Gi1bn1I1Tzae/R/YPY7j2Y4CP3RuM6g08FrwftJfZGohxU8kdIjkQnzc8oX60cCuujW0pPgHt3o7GA0bggBuIkHOmNQo+SFg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5858.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(23010399003)(376014)(7416014)(22082099003)(18002099003)(56012099006)(10067099003)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NUlJZHJJYWl2RGsxNjBBZkV0RXQwWWdiK2xuRTRsUFd4cVJOS2dRY0QxZWhS?= =?utf-8?B?bVBEbWI0REZKQXY0bnRQTnh5WDhWMGtIZDZMUzhhNFdlajRDcHNsZUVFMitI?= =?utf-8?B?OHdjZTJVSEQrSTNyT1lqM2ViT1NjKzBmWWkzdHJhWHVXWGNZdzl4WjhNem4x?= =?utf-8?B?Z1RTVzZ4OUo4c2FueWEwNVVNVzMza1VveFJLS0JrY0w3VUxFVE5TeUQ5bU5s?= =?utf-8?B?aTY3ZlBrVVNtN2hPOW5iQ1Y1RVpwVXJ3b0RrTXlaRG9lZU9EYUxqelR0dXp0?= =?utf-8?B?ZkFGNlRjcmpZbmxoSG95WW85alR1T1BlT25XVWhQOXJBelNkcjM2MWpwUjJu?= =?utf-8?B?NE1EaU1FbmdGbTNwV3lFaWRSQTFKS1BmZlI4MXdBMVJVU2F3N2hWNXVEaTBU?= =?utf-8?B?Z2ZhTnlYRDZseCtUNWNObmc4QW0vVVVwWVpLeHArZm0yUWV0cktleVUwQjdW?= =?utf-8?B?V21rNFlrSSs0VWdJcEF5TEhIdXZQakdDVzBMQldUb1Y3b3pFNG5HbWdPWGpL?= =?utf-8?B?OHFYeEQ1N0FCUXF6N2pPQXh0RjM1L3V5RGZqcnk3SkM2QysvUWNKYjVvb3ky?= =?utf-8?B?b2t2Zm03cFd1T0R0UUtNRTUzMCsyQ1I1UnNUZjJTUkloQ3laZlV1Z3lLbExW?= =?utf-8?B?T1ZTUHNReGc3TTVzQ01MVVJLczBMcFBDN2xzNXNMUm11SWx5NlhRQ1YzNjdH?= =?utf-8?B?ajhjZHk1UHpYM25jN04rb3U3L2VXbUNJdlJEc1g0RDkrcWhVZzNteWRibFFC?= =?utf-8?B?aVoxNXR2Z1RnWlpmUjBxMFFZWXVaV0ZxOU9LUE5Ib2NHWngrUHlmWU9lNll1?= =?utf-8?B?aW5nUlRPNkQwUUlFMzc1aHRud0JBb0xLSkg2WVVFbEJTWkcydkpQSitrY3pa?= =?utf-8?B?RnJFcHRkei8yL3U4T1VCakZ0ZFMxejJ2S1IyUUtzY1Juc3ViaTdTRE9QOHZU?= =?utf-8?B?WWxiaFNuNFE4U0luVVp2ek56U2RzRmJ2MmQ2cjNvWTA4VHVoelRpVit6dk9W?= =?utf-8?B?akcrZm5aWkUyTHpmeXZCclZPV0w5UmczU1B5TEhDS2VwRW1HK3dwNSt0aWxC?= =?utf-8?B?d0NDdjkvcld2Y0d2Nk5RYlNPUThRQmJQOUdlTjZjdW0wbzNsenA0WFhiWS9T?= =?utf-8?B?Y1ExSUpFYTJ1NDhoeWJoclNiRkFLQ3hnY09KT1RuMWNrV3hQVUpCVGQxaTZt?= =?utf-8?B?WFNaQXVCOVJMVXRWcm9mNUtoRTlSclUxdzYzT2ZFUEpES05iMmo5UFpvRElk?= =?utf-8?B?Z0lqWnltY016eVF2eWdSaGc0U0g2RFI2SXBKMldQamhQS2oyRWNMWGxSTEhI?= =?utf-8?B?QktLMnN6OGZWZzhwTk5SZ2RicXl2QmxhVzRDTzZIUXhIb3ZJYXpuZUdnaUFF?= =?utf-8?B?dEN1L0xEc1VwRUVRdXRTU1BrSWZ2K2Z2K0NKL2lGUERFUjl6R20xUWVUYmRm?= =?utf-8?B?aHo0QXgxeGRvR0l2RTRqRUVVZFhSVWphRWdtSnhPaWJBemprLzlJUTlzT2Z5?= =?utf-8?B?YnM1RTBWN21BaWFrVDlWajg3UitMdjluMXUrYkNWOVpNYXYwSWUvQ21JbHlV?= =?utf-8?B?NEJXYUFBWWo1Y3lKTlVUVS81S24yTWZEUU9aY1RWQ0dhWDllc1lIVFd4USsz?= =?utf-8?B?WjA5d3I5YkFWc3gvRHE4Y0crQ3F1QWxZK2VGT2xSdXNSM3RRd3I3eWNSVWNh?= =?utf-8?B?UjhYdXNWclBqdE1mQU1QemZsRHUxQ1RzZFIwQndSUnNndGltSVJiM0RVTTRI?= =?utf-8?B?d1M3UFNUS0RIWmhhVTNNSGtZcWEvbGNDWUFTSlVYNXVFanJZS2FDbHNJV1gy?= =?utf-8?B?azg5SmpUM3FNZ1U4Qll5Vm1DVnZGTkpsZlgwUTQvYmE2dEtGbUduNFZxTkkv?= =?utf-8?B?ZUN1YkFrZkFKMmVjWmxFSU9Cdmo1L2FGTmU0REUxRDQxK2QrTHAyenRLNE44?= =?utf-8?B?L09aRTNKVi9DT25ydHFiQnZGZisxdit0blhGNmRqa3RtaGdubERpR3hjQ1VO?= =?utf-8?B?VS95RzVSR3E2UTcwc3lOdEhvcGxtNkNvVmhzVEVIVFNVelBBWEg0RE5YeS8w?= =?utf-8?B?eGtBQ254QmxUU2N0VEJ5SVhsMW9oNmVoaDNURzV5a2ZzbEFpVTB4UkJwUkpC?= =?utf-8?B?UWZKdG1WbjhsbStOMDJ4dUE5QThwcGJKeU83UjdDNXlLcUp1cFVvNG1GcHlR?= =?utf-8?B?Tk9jMVBjRHRBbmptRWZyREJNNVdvcGw2N000eWZvbUc3RmhsMUU1UWhOaUdV?= =?utf-8?B?TklzSU9pZjMvd1dyaHpiV1poeFN1cldqdlcwSjBvVm10L1J0ZElMeEhFRXFz?= =?utf-8?B?Q1lDTm9uWlY4YzlxV2RQcUdoS1o0WTdOSDRNQnFiQzFtVW9ucnJuVGFHZXF3?= =?utf-8?Q?i5cZR/iFDdLClW4Q=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: a5019a96-0f90-474b-f8ee-08df081f0035 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5858.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 11:48:55.1595 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 70ovyQhqxNHovgP+A398wkyWhI8MhuTvV9rkwPYMPtOsd9F4B1s4nzpXctWkYXFuK7tbYgsj1bGLH+9wNehGU1DZf8KPyc3S85iNJZjF2p0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR04MB10717 Content-Type: text/plain; charset="utf-8" From: Ciprian Marian Costea gs_make_candev() ignores the return value of can_rx_offload_add_manual(). Once can_rx_offload's skb_irq_queue is made per-CPU, that call allocates a per-CPU queue and can fail with -ENOMEM, leaving offload->skb_irq_queue =3D= =3D NULL. Check the return value and exit via the existing free_candev() on error path. Fixes: 24bc41b45583 ("can: gs_usb: convert to NAPI/rx-offload to avoid OoO = reception") Signed-off-by: Ciprian Marian Costea --- drivers/net/can/usb/gs_usb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 3b9b2f104d86..cac4ce323a1d 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -1487,7 +1487,10 @@ static struct gs_can *gs_make_candev(unsigned int ch= annel, dev->can.fd.data_bittiming_const =3D &dev->data_bt_const; } =20 - can_rx_offload_add_manual(netdev, &dev->offload, GS_NAPI_WEIGHT); + rc =3D can_rx_offload_add_manual(netdev, &dev->offload, GS_NAPI_WEIGHT); + if (rc) + goto out_free_candev; + SET_NETDEV_DEV(netdev, &intf->dev); =20 rc =3D register_candev(dev->netdev); --=20 2.43.0