From nobody Sat Sep 26 13:18:34 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013023.outbound.protection.outlook.com [52.101.83.23]) (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 8CDA647CA68; Tue, 1 Sep 2026 10:41:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.23 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788259277; cv=fail; b=rLSgcJpiXGjKDEP5nLe8SaJnVE/EhmuzHCdhf1PY+++G2D/gagmXfhKUSls4IYuQwL73zNsoGUGVCU4r5V+odGgbDzo7S7UsX8mCI5yYwgzJAzNmGWMtabiutxItAecn6XfPQNG8yFoqjzGUEor7MfYpJ/hLVjPnHWc05v858N0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788259277; c=relaxed/simple; bh=nH2wEEh/huxut2zRVhEmUvOUsDgaNqWzQ7kG58N0nxw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=dy6BShDPLM0gDohaeBM15Q8GtnsLHafacw7shltRJP1hmiZe9k0a54k1W0df2z6MRuXGw1JbDEIScswjz97jUD5fSECutLBMcGuyACyMarVmbeitBEwHtbE6pShKjM6baJ4bo4KU/oUMMHuELrZqWItmyDMZTHbS0gnTRm86eCk= 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=ZnHKr0UL; arc=fail smtp.client-ip=52.101.83.23 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="ZnHKr0UL" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XjdXmtVA2P+fCwqVyD2dtTbdd48Yq+L4vxqyOublt0NtxssttwPGQdCdStssfb7R8Yw4LhgoSvmBD6TwbD3VaMzM6CCe5QNd5XjpyTBaqTf6RI4tXrKv3N6OtC2fRyay48gotCiPorgFWSmLYs5TaR0l0EaG5Zd9dVD6k+WcK4XVglYC7za8Y8h6Ad0kWhAII/mKkXmIgWjTzvcUMvxxin4m1vYFmEDjH624IcU88JEoiEga9iecdKyClQYPS5pzlzTX30LgH5Mvh0spFdP4dIMXrOIPHeQALfs/P8hVIDsZ/178uyGiZW9e5RYgJZuDpBEjJFVGj50OAHcTxOKh4A== 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=vu0XCXD+Ahy0SNguEELuvx6jk6DLFeg5Y5xCj+rHc0qIYQOVzVqnXS9fLL62Le8/BySnTJXA7DO2c1faVEVDgXOoElb8YmPije8WL94BAtVguYHV3GZ1qKiCTWDN3InSXQWRRauUMEKQJifUEwc0zngNzvEN/Nu9y/mwVzCMOMdYKrImpiyK2RniVNc+Su6Gw7R5o57hDZc6kZf18Dgth65BmG79GnjH7qJZUq93lSZmpui3R9YYpLNWSsvMPnmEhZc0+mOdg/W6UypzIiX4ecEkdXMiwJyunyzBV9Ob9i8RQttptZEd0DfoKjgd85Skhlh5Z6vMDQ8DqFKghqYHyQ== 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=ZnHKr0ULmESE7CnQkhFbbnmbA6EGHuIMIlyo5aP7HJ2u4ZRrUNtyhOMWk4EZo5TtOAToN25QobyUWfL7ytUYmfr2Vfh6hg77E+Kc0Zt2pi8kffZhJ7BeITSGoZqlkX9fAQ4pDOGKxRxHmkTPG5DTpgC1lC5Zz3MDlNs2oiBlERNHAOITAPlwXMfdUrCSWdwKH/7YX9HdNIPPG0bcxoyFEOr8WNL2VKkbOx9i/j+CvaBYdPayQDAmjU7xMJ923krmHHxJH0RJC6jGWc10YY7rs8M3koT8tYT0z2DtTEaCbKpa5ljsGc2uqkYoa57h/c9AvxYm3AQxTLhfjDlYd0RSUQ== 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 GV4PR04MB11942.eurprd04.prod.outlook.com (2603:10a6:150:2e7::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 10:41:08 +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 10:41:08 +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 v3 1/2] can: rx-offload: make skb_irq_queue per-CPU Date: Tue, 1 Sep 2026 12:41:02 +0200 Message-ID: <20260901104103.458619-2-ciprianmarian.costea@oss.nxp.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901104103.458619-1-ciprianmarian.costea@oss.nxp.com> References: <20260901104103.458619-1-ciprianmarian.costea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P309CA0008.EURP309.PROD.OUTLOOK.COM (2603:10a6:20b:28f::8) 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_|GV4PR04MB11942:EE_ X-MS-Office365-Filtering-Correlation-Id: fb7fcb39-1440-479f-3145-08df0815884d 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|366016|19092799006|1800799024|23010399003|7416014|376014|10067099003|56012099006|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: H7Yc8vrmmbvjzicoksz8FDUowdoPt9X8wjWTktgu1hcRDyCrGtHIKuz9QKapKRfd7RpXFLYEH8ymVJGllFcjW4vMP9WGww9nEzsGs6FOuGF0253knY6+WYsf0OvvlvCQE7rffhsIFGwfwksi47R3TV8ZmPL0dT5xhxpOlYh7eSE/3zrfNMFBvsYTRPYe3R1R4jdd1mtmLmea1GzjX71IzmlP7eilww07fniBbdilRXcpiFRM6Z5QmmcBF7k/uv75vJvQA6iPKcFUZzibdNhnSWjmH7dPa7H+3DpOSw/pLF5gpTlzhIuMsCL0SSvIJWD2lAJBKpGyevzIrtyM+18sRRg0mkPC/FUoMLEvB3kNSNRq6h/qF8XCnBu5QMV0JZw2Wn8vtbRtZH9yXPqoBh47P7hMRgkbJu2+Qr65rgeUix9qCn+UOVYYIWdmFJEhn1jPe18Hl4NvH+svHJExjhBrNscc4ERA5vljL5WafzC7G/cIlIBp4XrRwR/CmfUEpU/KyNw7D16Oqq6SUFTuxRE4x4XWpVXLwodOZ2+D9ZUPxJ4vCH/Clwo7JzuyRhgW/SlHfI26a4/K/JQpNFBWPpOX5IdkF0hdmH/eGxKswOaVoTxQBaSuHX+nISYMKrviRyBuXpSwVpthbBWslvc6TSGhCtXkE1OCz9FgU1m5zYQQhJE= 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)(366016)(19092799006)(1800799024)(23010399003)(7416014)(376014)(10067099003)(56012099006)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?N1FJMi9KRkdTTU1UUlhPcitoWUtwRklVaGZiZU5GZFdaSCsxNEpvTElHNFpM?= =?utf-8?B?NXFkTUY4VEpoWkpBbkJINEpkR2lOUXo4MjA3ZU1TYWZxUk4xc3Vad3owSUJo?= =?utf-8?B?ODZUNnpJNVQyYm45WUFGKzRDbzhJZzBxdllnd3hiOGN4KzRVMmoyQ21PRlVo?= =?utf-8?B?MHJPVGJCRG1HdXgxR044WGVhVkVWM21VU3dQUlB0SGZPcjZtSkVEeGVhRHEr?= =?utf-8?B?VkdIY3dPL3ZSRGNqT1dBS0YyK0hqOEJQWlI1cGtrTjBWcFovSWs5c3lCSlY2?= =?utf-8?B?MHB1MXJ1RFg5Z1JpcHZEYVlBbTFmZllvODEzeFdnU2pEbTJiWWpqMG5MbDE5?= =?utf-8?B?L3QwQVdEK1ZMdVF3VTNZTk9yY2pjekdJaWtSa25JbGtkNVkzQ3NxbTM2aUtu?= =?utf-8?B?R3Y4Y2ZhdXpQeTFSMUpNaEcwK3pJK2ZGWGJwSEowc3JhWStPUFhpUy8xOWhD?= =?utf-8?B?MzdUeTNGVXRXWGt1cU1zbzNwNVNtY0h1MittMXVsT1NIWkdOK21mRmlZUnFw?= =?utf-8?B?U1JVM1pRaHgyUE5iMUJuV2IrblhISlpGNzF4RURUMkFJWmFYZzUrOUhkR3RX?= =?utf-8?B?NEJBeGFyYWd0Z3JpWjZ0WVpJYURvdlFBMGRaNlo1UVBPYTNDUGVuS3M2eWg3?= =?utf-8?B?WHk2dzVKdTc4WUNXb2xsbGdvbWI4STJpNjBlOFZzbWJjWFhTcjJCR2YxNHpy?= =?utf-8?B?OHFNRGNHRzlpMEZNWUduSmVKMGFuQnppS3BlODB2ZnFCbG5sL2FsTmR2K0hu?= =?utf-8?B?REpMUS9HUFQzWmR0RXIrdnp5NHowN1AyT0UwV2NaK0tWd2RDN0h4cm5tZkZk?= =?utf-8?B?RjBKRGxnVHhIakhzbDEyeW5wRVpkbmFYdVpYS0NFekdjWlNzTXh2M0doSUlQ?= =?utf-8?B?VUVOQnVkNDZXeURtSElDQ2lpQlZkZHNxS2VxSFM3eVppUXZxejN4eFp3WWgy?= =?utf-8?B?VXlESWprc0F1aVNWWERZTktnM0UzUW1DdXlGb1hVOFRRNVdKU05wMS9kcG5D?= =?utf-8?B?cHNDaFhPUWU4NjhRWUZjSnpEdS9VM0pvclBFRTVueTFZVHhsVklSMHYxUC9G?= =?utf-8?B?N09wclhvcjlqK1FnR1ZWeTdXQmY5Z2ZVT2pCUU9Pa3ZSRmhYMnU3WXA5NUc5?= =?utf-8?B?S0N6dk5xVGxpaWUwUTlQd3hnTFdwQUt3U0IzajJHUnFQTklmejVYRER3S0h3?= =?utf-8?B?S1BYWlJYTjVET1dGOVdwYXp0VUNXdUV2eWxpOEs0MyszYUNxUFhCeUpsODVQ?= =?utf-8?B?QzBNRGRzbTQwaitQQWFUTUdZOENxeGdlN1BvblA0NWNYS3hHRDlzamNOd216?= =?utf-8?B?S2ZWOHVxN2s2RThxWFFMNUZsSXFMS3RpWDFHTDNsVnQrY0NmdE44bGJKK2F3?= =?utf-8?B?Z0hyaitYOG1MSjFKWlNvSHBiS1M2d2FKWkQ4Q1krTllEREVmUHF5Tmp2ZW10?= =?utf-8?B?N0RVUHNkN3ptWjB0dGd6amJXOVUvQ0dCeGlsL25wUisrYnZNSzBFcWhvLzBL?= =?utf-8?B?MjlsYjNidmwrWjVjVWp3bUVZaFAzcnE5ZmsxR3U3NzJ0Q3g4aHBwQkdpVmVz?= =?utf-8?B?NFU0ZXNNYzJzcDlpK2FtejdsNFQxYWpORXQrNnFPaDEyZWJhUjUyK2JLTVpQ?= =?utf-8?B?WHFFK1lWZWxrUnMwZ3pDdVFMRXk4UWxacDdFMjg1eVBOMmtxa3U1R2t2R2VU?= =?utf-8?B?cjlpd3g5S1NqZkg3VmMyZE5nQnJDVThCdkE1OHUzNGswdzFIRktrL3c4amJt?= =?utf-8?B?LzNzM1FXWFR4MlpCQmhLM01waXZGK1FLNk9ERERCdGxidm5OMWpUK1VWaHpD?= =?utf-8?B?T3gyVm1sYjhTQVNuRnhJMHZYOWY2V2JuVzZMZWcyaEh5aldEVi9JeG9xRVps?= =?utf-8?B?WHpYc0pCa0cyQkVQTHVzSGNYam5VenZLN0VPQjcwRkhqbFdGc2tMZG1BZzBO?= =?utf-8?B?dmxlTElIOFNSVDduWllTK1NpRmIzbzFpUjZmbDA4aUhOb3p2TGMybWdpU25y?= =?utf-8?B?ZFNrRzh0ZmRud2xoUEJEUHF3VE5zSTNFL3hUSU9NNDBUNEJpMUx1ZEtFSTM5?= =?utf-8?B?bU1IUSt5d21yNUFCMXRTVUlCNmpKVkJSZ1hML1VKbU9DcHdVcXc5WVU1ZmJO?= =?utf-8?B?a1orNUsvdDNTTHhuUzMrUmJzZHZXaVNleUhZN1M5dEx2UU9WVW9KakpERG5C?= =?utf-8?B?elIzVWRraTlsSmRtTFk0cytRSEdKK0YzYjk1WlEzQkZrdnBmV3ozNkM0QTRZ?= =?utf-8?B?cExzRUF4cm1vd2VCOHdHUVpCY2NRdk9TY1JrZkNFWUE1d3NjS3MyNDYxRTlz?= =?utf-8?B?UHd3czNyZ1MrRFlCV3M4QXd4UE1QWERXQzZjZHVFVzdjeVpNUlp1eVlWc1Jh?= =?utf-8?Q?0dIpLnd/YWkGJ/4w=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: fb7fcb39-1440-479f-3145-08df0815884d X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5858.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 10:41:08.7813 (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: +drWUL27YYt8sa3xXOr/UypJa4VbaUBkPHbFgv67t1uvuxsPMg1FA8hpmLjRwBqyF8gMuNECbzyFmGIc3955oNT7oags09bLN2D4qw6diW0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV4PR04MB11942 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 --- 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 13:18:34 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013023.outbound.protection.outlook.com [52.101.83.23]) (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 A3D2747CA94; Tue, 1 Sep 2026 10:41:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.23 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788259279; cv=fail; b=LPOYgwqTjx9QskP6Gmd9BYP8HL7RZ9A81mxsTLCO7TCTOZUN+YFJ3qHpptAH5/FR0V6fy9iPm8YSotVWAyv1ZNLtlqwsNAv5xIev3vxFBjyDyaGjc71GBzy4i2QdeuKBdh+ZI5iUcmszwUDAXH9Ran1fZ1O0Fy9jNkHHS9kMBrY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788259279; c=relaxed/simple; bh=LsMMtqRj3M0OWc3uEs6GojWNGvi7dfMNwtUn9xBZoDw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ZZXQSZV7clhKjdV04kbFBFO14RKgsTlbgzT90TfOLkr1//UMB4C8xlO2KEVk5dJ/u9di+Su/9GQyR5AnSxKF60Lyl1MDgv+PUjgqyYhLapp2U5Ljyk5mgWkP2yMaAsU9LNZ/u4yr/G/TqSq8O8a1Tuio8mPH8F/lpA+FTQZMZyM= 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=iP85eXsH; arc=fail smtp.client-ip=52.101.83.23 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="iP85eXsH" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Zu/bq/0wxVFq4pRWhyD5kf5LlINS7/TOS3FkQjTwkrVZTjBxX8Ceko/sxt8Kj5q4hHStF0/cWh+pYFT2QT0L/BOlLU6P0xGXipTmk3bWUoNz1HbDUivJQb0czdEzrp2BpwZodAuzKG6cTW3Dg0r2mxnB9TzmFLNRUNgQn/4XBgydexx5r13LE896fT5uKOvx0tV8QLGlsB970GzW36/fascpQz3he3i9KLec0+jzjiv9TypI+MWAb8jSXAMFlPavpZyo5dPfFHJg+KXjizF1benA4chfL911mNyzd8xM82sKsaZHTFinBNeonXAtl1cTnChCg0d0Rq4+9OxV7cZJPw== 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=UeTk7tad/JvYq0vgRfP+p0nvevU5/9pR/Mxn+sBRADtkRN3qX4gU0WH/sbwYiA7uoHQJwf2rXbXE9s6bnycPjeahC5vBUSGEkcknsqXTzKggcyeUfFJ+on3yd98fK5vuXeR+Cq/qXuSEB8eYpWhjDW3acnUhHX6WCwyVjBbVk5axm4w38vTfOdVXL8hTp1UaEFC/VTh7PHyIJlzK/iVZLZO9T7Xw4M+6GaGzq0n0ftvv0jc2JHIqpBZvLGG1NqIOqgdnsMWIg3ToRtdDxa0xyOXpaN17BgjVuwXTmz288xLQZy2K5CUMN8qR3bCb9P9EujYJwQzKA5OS8ik5p+wBKA== 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=iP85eXsHJ5RXlbo/qnXhvLZkwj8xbg2Ch8KtUK5TiXXM70ecNwyip7BhA6ohnNlUUfVa5g3m4D3RoNBznkuB291HhU7txMyXWpxuM/1uGWYHyBO2SiY00cUXHAO07uXO9x3kTYPFqcKlqijqgl2ZakX5XCQ+soTo5AzQgiPg9z5LmFW83WR9yXHE2SBKX/L3BfT5P6igeIUhvUkCV6Mk7L5CYA06d1F6aJKzQF210T1MLQeSlcc/LmAggbaWkRGH3/bHm91kovRV1ALoskzCK8U4MJpAwacqAC8u3TSHALXkzwo0UbSgIENwNyQyurwDmW4WxeCBDm3/Lh1LcnlnKg== 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 GV4PR04MB11942.eurprd04.prod.outlook.com (2603:10a6:150:2e7::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 10:41:10 +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 10:41:10 +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 v3 2/2] can: at91_can: fix rx-offload cleanup on unbind and probe errors Date: Tue, 1 Sep 2026 12:41:03 +0200 Message-ID: <20260901104103.458619-3-ciprianmarian.costea@oss.nxp.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901104103.458619-1-ciprianmarian.costea@oss.nxp.com> References: <20260901104103.458619-1-ciprianmarian.costea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P309CA0017.EURP309.PROD.OUTLOOK.COM (2603:10a6:20b:28f::21) 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_|GV4PR04MB11942:EE_ X-MS-Office365-Filtering-Correlation-Id: 66fee8cb-3e64-4b78-1ad5-08df08158954 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|366016|19092799006|1800799024|23010399003|7416014|376014|10067099003|56012099006|11063799006|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: Q8wML10nfOoQgq7yZNgcQH/pFAIAxFx5xjWfapGMN5/hKkMJf1buGkaLA+wLSMwzVGsbmRzMQbmmuqhZ3pjfV44c5XM+RScaj62nA+yvDIcDGbhy9QpPCfuPLUmELM+JM6Uck7RFEJ+vO12bg+WxKwSKHMFtyONcT5FCj9RiCf6ZKhgUNxGl0zrssJa0NT4mUfy00kzR+o5o4v6IOb2FekTJ+uwa9b+ZBm2h7skOtFcsBBN4raw2QrYV1b2R0Nvm1H4svfqbGxz+mWMj+87X3hysuekUWrsMsx4RsftVWSQ465rxnINxlA7XyBmEJAP9YU3aZFbcuQLJVyiZ1joz5EItGjheaNa3gYR2IhlUYuh5+ucJT1RRqxTIIGK+epg1jdcLZCdE1xfONl7X1imar2xmjoxVvp/jq+T/gq0l5gH+tsYO0siDz4vZ8frMhhxhr8cxK2OZpUeP9JC+Jbe9gMNl31AamDZ1sZVEaLqlLdPL1oQi1PI4MoyrkOHGU9RCOo2KHfSM5lLDI9QtSgR/jJMPuYfQQ/h3hGPe4tblGbbbz75wvoFPgoJHsk1syUcIN8MFVwKe0+a47+vt5f4SrY+wycP5T7alM35tjh3Kf78jzet/z4AWaW5+/HT8CQbxqzZwHMzmJgcpx8B+nbokmIWsQyxnRc4vqR+/2vQXOZk= 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)(366016)(19092799006)(1800799024)(23010399003)(7416014)(376014)(10067099003)(56012099006)(11063799006)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bUxyU1dzVWJ3ZkljbFJEVDkxK0NiOUxTbHp0UjZGNFBjY0JBa2hPRllodjRj?= =?utf-8?B?RUpraU01Z0wrU3NjNEFUQ2JVaVJDUFI4S0w2YnRscHN6dlRPZ0praU9peURi?= =?utf-8?B?Y1NQU2htQ3kraHo1SUpqejBoRnhVOTBuNFk2Y3ZCTi9aQkp3ZWU4ei8vWXFY?= =?utf-8?B?MlhsME1acHNOV0lQZ1piSFlrUEpDd3AvUnBnM0R1VkN3dHozMnNhOFJCaWVi?= =?utf-8?B?cFgyVDhHM1MxOXJrSkQwZDhVZHFsYkg2Y1dIWFhWZk15ZW53QUF0VzRqaGJv?= =?utf-8?B?VGJ3ck1NOHdQY2s5OU5ZbG5tU1JpYVpOY2xWeUpKbzVWbWk1WTdPOEZjd2ZQ?= =?utf-8?B?VXAzdHB0bzBHa1lZS1loNXBybk9BdXhhcmZJYVdvSmZOcksraXRVTTlmcUND?= =?utf-8?B?VS9Ia1BkQmZIYWZwMFVMZStEQ3lweHZBblJmZTVQU1M2YStqOXNiSGoxY3Ju?= =?utf-8?B?S2F0N1paT1hlVDBxeVdzUmc5Wks0L1ViMU9nK3pEQ3o5SC9SSjBHRWZKUUdu?= =?utf-8?B?cFl5bWtwNFZ5UngrV21uVGpWQjJXQ3pabVpFaktTSktXdVFVRFp1Z09lOHph?= =?utf-8?B?c3JVUXh0czNyQ2lva1IxbkpsR2x2SnlIMzJlZzJGSktKeUpVYVVQRDFLK2Vx?= =?utf-8?B?eEk5RWpYZ09kZEVjemVQNE5lS3orUko4bFNhdjZYM1IzSi9aSGhkeUJSY1k1?= =?utf-8?B?Z2lBU09xb3pYeVJSZWZ1aHhEYTRKc1VzUGVmN05GZkl2R3YwYW5TUmFCZTNN?= =?utf-8?B?SkNQNDFia0NEcldwM0tQUWgwcEIwdnBwbkt0Q0NJY2xBdFBLdWpXb1dVMDZv?= =?utf-8?B?L1ExMS95d3VpcUxWalV0M2s1R2tBVytMVU9HS2FIT1BiVWpvZVZ0OVk3bmY5?= =?utf-8?B?VzIwY2JTemc2Z1picmh1dUxiMG42Tm5YczVoRW1LWUh0dk9PMzVIYWRFaFc5?= =?utf-8?B?TXVHOThpdGlPdnF3MlRpTDhReXBjeUpmVHpYMS9tdU5jRHNFVEtwZ2ZVKysz?= =?utf-8?B?Ym00aEpaZStTR1BDNkFmVlNtcmxoNDlyekY3Wkx1SFRNM040OWx2TERoSEor?= =?utf-8?B?VEJkVmRENlUwZzh5ZWFLbkVJS2hETnREaG1GT1JPblNRWTQ0U2VGSG4zeEtx?= =?utf-8?B?OTRzd3NPWEt3MVU1YmlSYXc5b0VJK0w0R1A1T3RDTFl2THh0cU9Kb1JDZWU0?= =?utf-8?B?Z0F1MnZjZFJvYzlqMDE2R3FhbGFtYnVJVjAvTmQvSXpZdkxjTWpEVUhvS3N0?= =?utf-8?B?eDl0WVAwNDcvYzYxZ1dKZTlNZndKcHpCN0RQak5jSXVHVlJGQVg3VFNQRkRt?= =?utf-8?B?RklaWnpnbmx2b0RFTHUxL29MR2Z1T3Q3SmJvN1kzdklSdHd2dGJkTUtaZnRD?= =?utf-8?B?eWZVT0h5RGMveXhPZjhZdGF0Q0dKaHgxZDUrYUQ4TVdmc3podElpdHVXS3cx?= =?utf-8?B?aUhRdWVGTCtDSFZZMXA1Y1F6dWlWYUxxcnVyYmVGbnlDSm8zcE41SCszQWla?= =?utf-8?B?VWZ2VlF4VWRIYWRkMlljbFgyN0VvSmtjb0FpM2NQdFlrWkZnRWVmdlpteE1v?= =?utf-8?B?dXBoUjZIKzg3L3NnelJ4WUI5REdlbE5vaU1EMktLZm5YK3pjWGR1RkgzcUx3?= =?utf-8?B?UVhMT05uMk1NenhqbDI3Q3QrZnVGNmpLZTlleWhHNnRSOUNVZmZqd0xXVTRo?= =?utf-8?B?ZzlMNGd4MjloRVZ4Um83V1RrME8xRW9raEg1WGJrbVZ6bHBjc2lycUhBT00w?= =?utf-8?B?eE0xTkl1b29pR1pra0JiK2VlK3M3a1BUY011NEZ2MEZ6b1NLVStrdEQ0dEJx?= =?utf-8?B?TkdTRVFGWFZFVnB0d0FEVVpXaC9UejJDaEUvTFBOY0tLMmZKbGF1VDR6dzM4?= =?utf-8?B?U29HZ2N6ZHNxdUxJVXJvWUVSa1dXZkVZam9SbUZZZ0VFRmIwcFFPYnc0bTVa?= =?utf-8?B?YnpPQWk4Rlg0RHQ2UEJlL0w3TlRxQTZZb1c2ekRURFZWbEJmYjluNjBqMklE?= =?utf-8?B?cHJONndDWVExV0RsWXErK1ordStSTW5tTHVMSWVSQ0FDbEF3Ynk1ZHNrTmt1?= =?utf-8?B?UTRya3p2VksvVlcxVTY4aUswd0xxdkd6cnFOVlJkbytvY1I3YURycHFhWlBU?= =?utf-8?B?cTZCcDl6OExGVnhQWU9lMFVuTUJqZmN3UmZEdjRBKy9VRFZkMUtNaGU2VTI4?= =?utf-8?B?eURLWjJDdHIxNFB5THZFanpDdTZEVHQzc083OG82bXk1c0lNNzA3Z1hZdUQx?= =?utf-8?B?Sjh0T1FhbkU3ZnNVeG93eFNhQ3FVaEZxd0JzQi9GMi9hTDBFdkFyVklZblhN?= =?utf-8?B?azJRd0N3NzhtWXZvSnl1NUc4czZJY1J1ZzJhREVaTHJlMjAzUzVUWk93eldT?= =?utf-8?Q?HuS1FcCF8LMQ2gBM=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 66fee8cb-3e64-4b78-1ad5-08df08158954 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5858.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 10:41:10.2238 (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: nfxSQnJ+ByxR+nksH8txfsodZIECLiSZxMcmGJZSbJof0Duj1i0LnLZrGwyLcAVX1LEW5zcld2x4kAExHlpgtAk6xzYC25bbquQfNgSSbw8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV4PR04MB11942 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