From nobody Thu Oct 2 03:30:50 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 7F08930DD00; Tue, 23 Sep 2025 04:53:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603211; cv=none; b=F1XHRjXlp00zzanPQ3GU9GW8MZID+89203sn5u+1OWiYQzgnCRPeUBcFJYD75hkO3S5cllACtanmqRpPJXhgIDFWuPqxwAZIkVg2Jt3t5bw5Vgb4ZSNi4m2PWdto8goZfKIbilVgpPLFmgYxfBXZRvLaB8od8CsHqzr8zUAVb4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603211; c=relaxed/simple; bh=drdc6vhp0itUxR+RtAgDkGEMcboFw0v8IhKD5qU7Q48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TPJ91EyMyPUmnB2vMv0Pv2jv1iXU0xUYzKA7cVxPBCsVCRPWsXYgF/mGIBZU880VYv4xOtZDoqBffUxghrm0wvX5zdTGqetbc+nP3cm0yibc0cTpypPFjZYrZS8rH8tUfMqMFdIOGoTZgi8nUfHwvVuGpRPgGdCGLFQU3UlZlrs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VgGtwf7U; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VgGtwf7U" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1B7BFC113CF; Tue, 23 Sep 2025 04:53:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758603211; bh=drdc6vhp0itUxR+RtAgDkGEMcboFw0v8IhKD5qU7Q48=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VgGtwf7UDYJjsDitxTOtFDIcHl2EowhGFPsh8U06u/6XLJgrCh8et7OrTxE9deTsA idx6HIJJrXWYM4t1ZLRMyCmJKurYHPuhPqFj336B4aNTfkzzzxtnyB2p4725B8B7TR i2+OhhEh8t+FhVD2Uxr80D7pXpk26DmvIyaHEcR6ATRgapsNJ4ROQ3Z74GAj0oijJ8 9OFwAt7iW9kEAKwejnH4ttwnxaoKHO2Nf6sNF3HmtSkeuAlGib9ml9IIocdmfBjJLG fJtSpLwHbDgqt9TEBmzK0xbHLMeAYe6fetYa6AldaKgxXn4Ccd+0XhIkby0+bMHN27 sGdluinbQRNrg== From: Vincent Mailhol Date: Tue, 23 Sep 2025 13:52:41 +0900 Subject: [PATCH v2 1/4] can: annotate mtu accesses with READ_ONCE() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250923-can-fix-mtu-v2-1-984f9868db69@kernel.org> References: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> In-Reply-To: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> To: Oliver Hartkopp , Marc Kleine-Budde Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2365; i=mailhol@kernel.org; h=from:subject:message-id; bh=drdc6vhp0itUxR+RtAgDkGEMcboFw0v8IhKD5qU7Q48=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDBmX1PcfdH4jqCeitvJXQnTW/bvf6qbzOVaIfolPeO+Su Ppjg+G9jlIWBjEuBlkxRZZl5ZzcCh2F3mGH/lrCzGFlAhnCwMUpABMJvcbwT6WF+zxrx9rZcg9F NS9aLb/44LzpKundp8rbmQr2T1A81sXwPzHEx+RZa94EjaoqjcItG9V/Xao9Y+dw6Ylm3fXT55b kMwAA X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 As hinted in commit 501a90c94510 ("inet: protect against too small mtu values."), net_device->mtu is vulnerable to race conditions if it is written and read without holding the RTNL. At the moment, all the writes are done while the interface is down, either in the devices' probe() function or in can_changelink(). So there are no such issues yet. But upcoming changes will allow to modify the MTU while the CAN XL devices are up. In preparation to the introduction of CAN XL, annotate all the net_device->mtu accesses which are not yet guarded by the RTNL with a READ_ONCE(). Note that all the write accesses are already either guarded by the RTNL or are already annotated and thus need no changes. Signed-off-by: Vincent Mailhol --- net/can/af_can.c | 2 +- net/can/isotp.c | 2 +- net/can/raw.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/net/can/af_can.c b/net/can/af_can.c index b2387a46794a576973f3d865a5ca8e2ba696d167..770173d8db42813d5c085248d1b= cf5fbe717955b 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -221,7 +221,7 @@ int can_send(struct sk_buff *skb, int loop) } =20 /* Make sure the CAN frame can pass the selected CAN netdevice. */ - if (unlikely(skb->len > skb->dev->mtu)) { + if (unlikely(skb->len > READ_ONCE(skb->dev->mtu))) { err =3D -EMSGSIZE; goto inval_skb; } diff --git a/net/can/isotp.c b/net/can/isotp.c index dee1412b3c9c1ffcfc43a109b448701459fcf8b9..74ee1e52249b232813a06c5d2c6= e404a38dce990 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -1313,7 +1313,7 @@ static int isotp_bind(struct socket *sock, struct soc= kaddr *uaddr, int len) err =3D -ENODEV; goto out; } - if (dev->mtu < so->ll.mtu) { + if (READ_ONCE(dev->mtu) < so->ll.mtu) { dev_put(dev); err =3D -EINVAL; goto out; diff --git a/net/can/raw.c b/net/can/raw.c index 76b867d21def209f5c6d236604c0e434a1c55a4d..6cb959e3dcd3e54972628ee5957= 2a749009d1323 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -950,7 +950,7 @@ static int raw_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size) err =3D -EINVAL; =20 /* check for valid CAN (CC/FD/XL) frame content */ - txmtu =3D raw_check_txframe(ro, skb, dev->mtu); + txmtu =3D raw_check_txframe(ro, skb, READ_ONCE(dev->mtu)); if (!txmtu) goto free_skb; =20 --=20 2.49.1 From nobody Thu Oct 2 03:30:50 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8B5DB30E0DB; Tue, 23 Sep 2025 04:53:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603213; cv=none; b=WcAFKlDrQ+yeRjdB0aq8eLf4Z4YK4EYXmrU2DKmEw8IMv1xY9Xuo0cIDp7MIeIer+nSmW0DqYcJHwD+fpnv0fUYq6EGoCxfVJVXhCgDBo7ABIoyVSo7nLuMF9Bl+ucoyBic6ZQJIKwm7Rwy2K7QttOC1CzIa7jPKBwUcS3BMAtY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603213; c=relaxed/simple; bh=DneGXtD8h1Dl78Xv228aP26RFX4kDLuiIxklWvQi2F0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aPO948g82uHbbBcsmz/XN/CwucDOolHNGuQ3f+vi37CXPSlT/HknrZ6aPyu6l9yaWlPWxHKSH7spkcl5Eq8n3NsEebPCSGTD0CnuJXvOoX8J81vMDiZTrlWJNmO87ObI+dV/sntNgRWyPk46H1NdpkGwjz3KNoNBBJLAUtL7u+M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jSmE6Lcq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jSmE6Lcq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 789FBC4CEF5; Tue, 23 Sep 2025 04:53:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758603212; bh=DneGXtD8h1Dl78Xv228aP26RFX4kDLuiIxklWvQi2F0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jSmE6Lcq1I4jlaTl0gdU1MiSeQZaCWUd+i6vBbOLtE6HcvpJ4vZRfr1OLXzwmmVXQ OFTi1y6ZJdqgZs80Y1B7lzDh7dJkEGcojhENdisT0/4Bq60o2HuAXPcFZEetlMTVka Uzqo6iwEfbhqQVYMfH3i96npSNzQrNM/VHzc4jP/thLJu6kvg0dqkxrfvuTkses2C2 8Ruuai0PnrldTmve0V9DyEgXVjCu/3zAOjQHuLxLBynhtYq5zulWTHaSQdfgEX+DVy gk+tOqSGVWREedMYeKQ1kCgtkIhLiWstWGZ9Q4gWpdZ/0/5xoWMRMWwl5YXrIyVfbF evvN/zzOn9uCQ== From: Vincent Mailhol Date: Tue, 23 Sep 2025 13:52:42 +0900 Subject: [PATCH v2 2/4] can: dev: turn can_set_static_ctrlmode() into a non-inline function Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250923-can-fix-mtu-v2-2-984f9868db69@kernel.org> References: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> In-Reply-To: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> To: Oliver Hartkopp , Marc Kleine-Budde Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3911; i=mailhol@kernel.org; h=from:subject:message-id; bh=DneGXtD8h1Dl78Xv228aP26RFX4kDLuiIxklWvQi2F0=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDBmX1A/FHVCt9CqWTmX6siAlqU9msusch7SvcU/EdFudA rVYWaZ2lLIwiHExyIopsiwr5+RW6Cj0Djv01xJmDisTyBAGLk4BmEjYXIb/Vdef/BS89ZhTjEvs k/Vh5kR29gsxiptObzl5SU0k4/bGLkaGM5Yrr6nddOeJWFO/teGQ/Jk3ajL7XI5Pv7LjT5rEZp4 oLgA= X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 can_set_static_ctrlmode() is declared as a static inline. But it is only called in the probe function of the devices and so does not really benefit from any kind of optimization. Transform it into a "normal" function by moving it to drivers/net/can/dev/dev.c Signed-off-by: Vincent Mailhol --- This also serves as a preparation for the next patch in which we are adding can_set_default_mtu(). That function will only be used by the can_dev.ko module and so we do not need to export its GPL symbol. However, if can_set_static_ctrlmode() stays as a static inline, then the call to set_default_mtu(), which we plan to add in can_set_static_ctrlmode(), would also be inlined and thus would become visible to the users of can_set_static_ctrlmode(). Making can_set_static_ctrlmode() a non-inline function resolves this dependency. --- drivers/net/can/dev/dev.c | 21 +++++++++++++++++++++ include/linux/can/dev.h | 23 ++--------------------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c index 3913971125de0ab16b4ad9f36712954141014ddf..a0ae659beedcd1fa0979662c126= 14ae7846032c0 100644 --- a/drivers/net/can/dev/dev.c +++ b/drivers/net/can/dev/dev.c @@ -347,6 +347,27 @@ int can_change_mtu(struct net_device *dev, int new_mtu) } EXPORT_SYMBOL_GPL(can_change_mtu); =20 +/* helper to define static CAN controller features at device creation time= */ +int can_set_static_ctrlmode(struct net_device *dev, u32 static_mode) +{ + struct can_priv *priv =3D netdev_priv(dev); + + /* alloc_candev() succeeded =3D> netdev_priv() is valid at this point */ + if (priv->ctrlmode_supported & static_mode) { + netdev_warn(dev, + "Controller features can not be supported and static at the same ti= me\n"); + return -EINVAL; + } + priv->ctrlmode =3D static_mode; + + /* override MTU which was set by default in can_setup()? */ + if (static_mode & CAN_CTRLMODE_FD) + dev->mtu =3D CANFD_MTU; + + return 0; +} +EXPORT_SYMBOL_GPL(can_set_static_ctrlmode); + /* generic implementation of netdev_ops::ndo_eth_ioctl for CAN devices * supporting hardware timestamps */ diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 9a92cbe5b2cb7ccdfca3121718856d096e9ecfa6..5dc58360c2d74a1711d4e02d28f= e52ae20b146e0 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -125,27 +125,6 @@ static inline s32 can_get_relative_tdco(const struct c= an_priv *priv) return (s32)priv->fd.tdc.tdco - sample_point_in_tc; } =20 -/* helper to define static CAN controller features at device creation time= */ -static inline int __must_check can_set_static_ctrlmode(struct net_device *= dev, - u32 static_mode) -{ - struct can_priv *priv =3D netdev_priv(dev); - - /* alloc_candev() succeeded =3D> netdev_priv() is valid at this point */ - if (priv->ctrlmode_supported & static_mode) { - netdev_warn(dev, - "Controller features can not be supported and static at the same ti= me\n"); - return -EINVAL; - } - priv->ctrlmode =3D static_mode; - - /* override MTU which was set by default in can_setup()? */ - if (static_mode & CAN_CTRLMODE_FD) - dev->mtu =3D CANFD_MTU; - - return 0; -} - static inline u32 can_get_static_ctrlmode(struct can_priv *priv) { return priv->ctrlmode & ~priv->ctrlmode_supported; @@ -188,6 +167,8 @@ struct can_priv *safe_candev_priv(struct net_device *de= v); int open_candev(struct net_device *dev); void close_candev(struct net_device *dev); int can_change_mtu(struct net_device *dev, int new_mtu); +int __must_check can_set_static_ctrlmode(struct net_device *dev, + u32 static_mode); int can_eth_ioctl_hwts(struct net_device *netdev, struct ifreq *ifr, int c= md); int can_ethtool_op_get_ts_info_hwts(struct net_device *dev, struct kernel_ethtool_ts_info *info); --=20 2.49.1 From nobody Thu Oct 2 03:30:50 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8B65730E0DF; Tue, 23 Sep 2025 04:53:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603213; cv=none; b=NVavBoN1nj2AHqGWiPIOLP9XF32w3fTC3rEpHbNTKrD6tNpQApOF7zRIDgkifEU3KenZtzxzHyccp+w0yjjY4NeFhn8Z6AtXkHEQ/SMDDSnvRydTZYsrRCIz7iyuveqdypp8tXpnytzSK9Shp6kfvKxa554kPuwFM2SYJ91AW2A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603213; c=relaxed/simple; bh=Zj00qJ2G6wtMCMGxh6W71gJtBiAdkMplYJcXlpTDfLk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K13Fs2LzJdb9DMuhH75T30yhLZyKg649rkw2MnmifmZwz2aChPZNx1bg+y6alcRh9rTxfOz4tYOgMqqzXAbfGD6hjdCUpQ4t9ZIEA62bNGt7qxnJBnqBaHxxFLqT/lsAWJY99ixe+ShbcVMkyPsKhD6/RsDz72IhBmul6szHFEY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VDqFhMlF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VDqFhMlF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 85555C4AF09; Tue, 23 Sep 2025 04:53:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758603213; bh=Zj00qJ2G6wtMCMGxh6W71gJtBiAdkMplYJcXlpTDfLk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VDqFhMlFVfanjQYEqJJiWa9nvp3XsNP4b/bT6aQmlHDJy4mE3fyqVZ6UA05a+sCb1 HM4PRDZf0PQ69OieZtm5AYdFgJ0oS1urBe60SdOlJ4i71iMHvll8j+T+FPWedzW87U RTnK0+2Kx/JJU53jZtVOuGMdT93AV8imlVNMid0LYQLigh5/JbNsCQ3kssHNQxSoP8 Q22tYhg4+vqcxJ73S56sZqWBFAN2Z3d70SQilnpX2sBoqgPfDTRFsBfaiIBiAZoxiS 6m1LR8Id4IGrORiH6klnPngLrDuogXw+tYmLrwoji7v6OWfX5wiEkny8KUnkSmCxEA thvWIekg+Hq1w== From: Vincent Mailhol Date: Tue, 23 Sep 2025 13:52:43 +0900 Subject: [PATCH v2 3/4] can: populate the minimum and maximum MTU values Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250923-can-fix-mtu-v2-3-984f9868db69@kernel.org> References: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> In-Reply-To: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> To: Oliver Hartkopp , Marc Kleine-Budde Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5119; i=mailhol@kernel.org; h=from:subject:message-id; bh=Zj00qJ2G6wtMCMGxh6W71gJtBiAdkMplYJcXlpTDfLk=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDBmX1I+ceb+QOeDxRYsSjcNqO+xLrMuELxYdb09vvS3wJ MvtS9nmjlIWBjEuBlkxRZZl5ZzcCh2F3mGH/lrCzGFlAhnCwMUpABPRrWNkuBzM/jOq6GjFnx9f RF4LZaYEstiz654IWbHJ6eaxkOu/5zD8ZjtbtGPyqwMd1+t/PdTye3eQd5POqx37uzdHSfLoSG2 fxg4A X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 By populating: net_device->min_mtu and net_device->max_mtu the net core infrastructure will automatically: 1. validate that the user's inputs are in range. 2. report those min and max MTU values through the netlink interface. Add can_set_default_mtu() which sets the default mtu value as well as the minimum and maximum values. The logic for the default mtu value remains unchanged: - CANFD_MTU if the device has a static CAN_CTRLMODE_FD. - CAN_MTU otherwise. Call can_set_default_mtu() each time the CAN_CTRLMODE_FD is modified. This will guarantee that the MTU value is always consistent with the control mode flags. With this, the checks done in can_change_mtu() become fully redundant and will be removed in an upcoming change and it is now possible to confirm the minimum and maximum MTU values on a physical CAN interface by doing: $ ip --details link show can0 The virtual interfaces (vcan and vxcan) are not impacted by this change. Signed-off-by: Vincent Mailhol --- With this, when adding the CAN XL netlink interface, all we have to do is to add one if branch to can_set_default_mtu() like this: void can_set_default_mtu(struct net_device *dev) { struct can_priv *priv =3D netdev_priv(dev); if (priv->ctrlmode & CAN_CTRLMODE_XL) { if (can_is_canxl_dev_mtu(dev->mtu)) return; dev->mtu =3D CANXL_MTU; dev->min_mtu =3D CANXL_MIN_MTU; dev->max_mtu =3D CANXL_MAX_MTU; } else if (priv->ctrlmode & CAN_CTRLMODE_FD) { dev->mtu =3D CANFD_MTU; dev->min_mtu =3D CANFD_MTU; dev->max_mtu =3D CANFD_MTU; } else { dev->mtu =3D CAN_MTU; dev->min_mtu =3D CAN_MTU; dev->max_mtu =3D CAN_MTU; } } and we will be done! --- drivers/net/can/dev/dev.c | 21 ++++++++++++++++++--- drivers/net/can/dev/netlink.c | 9 ++++----- include/linux/can/dev.h | 1 + 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c index a0ae659beedcd1fa0979662c12614ae7846032c0..69c00720e9956cad986ea86fbba= 49285d76f51db 100644 --- a/drivers/net/can/dev/dev.c +++ b/drivers/net/can/dev/dev.c @@ -239,11 +239,12 @@ EXPORT_SYMBOL_GPL(can_bus_off); void can_setup(struct net_device *dev) { dev->type =3D ARPHRD_CAN; - dev->mtu =3D CAN_MTU; dev->hard_header_len =3D 0; dev->addr_len =3D 0; dev->tx_queue_len =3D 10; =20 + can_set_default_mtu(dev); + /* New-style flags. */ dev->flags =3D IFF_NOARP; dev->features =3D NETIF_F_HW_CSUM; @@ -309,6 +310,21 @@ void free_candev(struct net_device *dev) } EXPORT_SYMBOL_GPL(free_candev); =20 +void can_set_default_mtu(struct net_device *dev) +{ + struct can_priv *priv =3D netdev_priv(dev); + + if (priv->ctrlmode & CAN_CTRLMODE_FD) { + dev->mtu =3D CANFD_MTU; + dev->min_mtu =3D CANFD_MTU; + dev->max_mtu =3D CANFD_MTU; + } else { + dev->mtu =3D CAN_MTU; + dev->min_mtu =3D CAN_MTU; + dev->max_mtu =3D CAN_MTU; + } +} + /* changing MTU and control mode for CAN/CANFD devices */ int can_change_mtu(struct net_device *dev, int new_mtu) { @@ -361,8 +377,7 @@ int can_set_static_ctrlmode(struct net_device *dev, u32= static_mode) priv->ctrlmode =3D static_mode; =20 /* override MTU which was set by default in can_setup()? */ - if (static_mode & CAN_CTRLMODE_FD) - dev->mtu =3D CANFD_MTU; + can_set_default_mtu(dev); =20 return 0; } diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index d9f6ab3efb9767409c318b714f19df8a30e51137..248f607e3864ffbda6f0b8daf4e= 2484179cf9cd5 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -223,17 +223,16 @@ static int can_changelink(struct net_device *dev, str= uct nlattr *tb[], priv->ctrlmode &=3D ~cm->mask; priv->ctrlmode |=3D maskedflags; =20 - /* CAN_CTRLMODE_FD can only be set when driver supports FD */ - if (priv->ctrlmode & CAN_CTRLMODE_FD) { - dev->mtu =3D CANFD_MTU; - } else { - dev->mtu =3D CAN_MTU; + /* Wipe potential leftovers from previous CAN FD config */ + if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) { memset(&priv->fd.data_bittiming, 0, sizeof(priv->fd.data_bittiming)); priv->ctrlmode &=3D ~CAN_CTRLMODE_FD_TDC_MASK; memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc)); } =20 + can_set_default_mtu(dev); + fd_tdc_flag_provided =3D cm->mask & CAN_CTRLMODE_FD_TDC_MASK; /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually * exclusive: make sure to turn the other one off diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 5dc58360c2d74a1711d4e02d28fe52ae20b146e0..3354f70ed2c684d7d482549560d= 4cb5838cbebd5 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -166,6 +166,7 @@ struct can_priv *safe_candev_priv(struct net_device *de= v); =20 int open_candev(struct net_device *dev); void close_candev(struct net_device *dev); +void can_set_default_mtu(struct net_device *dev); int can_change_mtu(struct net_device *dev, int new_mtu); int __must_check can_set_static_ctrlmode(struct net_device *dev, u32 static_mode); --=20 2.49.1 From nobody Thu Oct 2 03:30:50 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B74CD30E85A; Tue, 23 Sep 2025 04:53:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603214; cv=none; b=tMhlqYvhNxhY7USYuBaJVM05eQJZd6RI9dUrLTGI43JQeM85FYJBzYBoth6x58KOtJteCVEhBSZbu1NuWapDOLDDXVRL5PzhZdHP7QytCflawtdPSyIgu26HmqSpSydHDOKC+lFJgm1WUKnNBVWfhEElH8ATkHMMBprRpY0wSEg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758603214; c=relaxed/simple; bh=2/MlNtQVs67BhcBQu3mBYH5/+H7qem0YfGtT2lPXmQw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RONgtBJdfjnWlRRqXyb7o7ywRJFmaHe7N/LafodZSjnpmeeYRmDu2Z4ZoiO0ok3eiu0RMgWNVsvGgkS8He3mIopzKYbKl2GnK/BIrvRz0sW2MB6dkArnGCoadIgPO/R9kb8bQztQEpSQ4aZwNKDYBKwgS8kmncqEFrtlntfOFVM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=p1e4VqdT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="p1e4VqdT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 91A14C116C6; Tue, 23 Sep 2025 04:53:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758603214; bh=2/MlNtQVs67BhcBQu3mBYH5/+H7qem0YfGtT2lPXmQw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=p1e4VqdTd1XpBlyJcpGd9iZpt3GYyG3z618tUvRHM1wZOhgAuIi4iBy54U5k5S12t d4Siuya0oLMgRQq0XiPbDObsR55JbRruFk1Hn7Qz/AHlINR33oxCwTanZBwS50Z1dR 2PY78YqeH+7q1t4wX+URXOTVgFp1NSPRuFlwOYEuSmReJzyhty4mwQhtGcNqa96Pjw wuM+DJPwuXchBaTP0f3LTvII5m/+jR4ARr7WpK62D1c/4vQH1KOVvV0UMMQm1DGtLz 5rD92kMIGlweLoRfYUYY/5moJAR+CIX26r8gEKZZJTaj/H8Ql3W5joH14kLDlnK7/c ic1Z5M7IDVC/g== From: Vincent Mailhol Date: Tue, 23 Sep 2025 13:52:44 +0900 Subject: [PATCH v2 4/4] can: enable CAN XL for virtual CAN devices by default Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250923-can-fix-mtu-v2-4-984f9868db69@kernel.org> References: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> In-Reply-To: <20250923-can-fix-mtu-v2-0-984f9868db69@kernel.org> To: Oliver Hartkopp , Marc Kleine-Budde Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1737; i=mailhol@kernel.org; h=from:subject:message-id; bh=2/MlNtQVs67BhcBQu3mBYH5/+H7qem0YfGtT2lPXmQw=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDBmX1I89vKDqmLLM3PhNUlPpoT6HrbLz/8x93RxhfZLJ8 rE/f8mEjlIWBjEuBlkxRZZl5ZzcCh2F3mGH/lrCzGFlAhnCwMUpABMJz2JkmB17+UfqqQvTEvXT csou1UanVH/4xu70WupN+V6WA2Fsixn+cHQp/A/8Mvvmv0Pu1f5szGvT2f/LP1i5MPDa0bw/q1c fZAQA X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 In commit 97edec3a11cf ("can: enable CAN FD for virtual CAN devices by default"), vcan and vxcan default MTU was set to CANFD_MTU by default. The reason was that users were confused on how to activate CAN FD on virtual interfaces. Following the introduction of CAN XL, the same logic should be applied. Set the MTU to CANXL_MTU by default. The users who really wish to use a Classical CAN only or a CAN FD virtual device can do respectively: $ ip link set vcan0 mtu 16 or $ ip link set vcan0 mtu 72 to force the old behaviour. Signed-off-by: Vincent Mailhol --- drivers/net/can/vcan.c | 2 +- drivers/net/can/vxcan.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index f67e858071007acd5f34fa00a76212f1a77997a6..fdc662aea2798125b3aa373f099= 58363b427ced2 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c @@ -156,7 +156,7 @@ static const struct ethtool_ops vcan_ethtool_ops =3D { static void vcan_setup(struct net_device *dev) { dev->type =3D ARPHRD_CAN; - dev->mtu =3D CANFD_MTU; + dev->mtu =3D CANXL_MTU; dev->hard_header_len =3D 0; dev->addr_len =3D 0; dev->tx_queue_len =3D 0; diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c index 99a78a75716749bf858cc78eadb41ca2588fcf94..b2c19f8c5f8e5101b8be343401a= fe9a4f388c4da 100644 --- a/drivers/net/can/vxcan.c +++ b/drivers/net/can/vxcan.c @@ -156,7 +156,7 @@ static void vxcan_setup(struct net_device *dev) struct can_ml_priv *can_ml; =20 dev->type =3D ARPHRD_CAN; - dev->mtu =3D CANFD_MTU; + dev->mtu =3D CANXL_MTU; dev->hard_header_len =3D 0; dev->addr_len =3D 0; dev->tx_queue_len =3D 0; --=20 2.49.1