[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250924172720.028102e4@kernel.org>
Date: Wed, 24 Sep 2025 17:27:20 -0700
From: Jakub Kicinski <kuba@...nel.org>
To: Stefan Mätje <stefan.maetje@....eu>
Cc: Frank Jungclaus <frank.jungclaus@....eu>, Marc Kleine-Budde
<mkl@...gutronix.de>, Vincent Mailhol <mailhol@...nel.org>,
linux-can@...r.kernel.org, socketcan@....eu, "David S . Miller"
<davem@...emloft.net>, Oliver Hartkopp <socketcan@...tkopp.net>, Simon
Horman <horms@...nel.org>, Wolfgang Grandegger <wg@...ndegger.com>,
netdev@...r.kernel.org
Subject: Re: [PATCH v3 3/3] can: esd_usb: Add watermark handling for TX jobs
On Wed, 24 Sep 2025 19:30:35 +0200 Stefan Mätje wrote:
> The driver tried to keep as much CAN frames as possible submitted to the
> USB device (ESD_USB_MAX_TX_URBS). This has led to occasional "No free
> context" error messages in high load situations like with
> "cangen -g 0 -p 10 canX".
I grepped for "No free context" :) perhaps use the old message from
before the previous patch, so that users who see those in the logs
can correlate with this patch better?
> Now call netif_stop_queue() already if the number of active jobs
> reaches ESD_USB_TX_URBS_HI_WM which is < ESD_USB_MAX_TX_URBS. The
> netif_start_queue() is called in esd_usb_tx_done_msg() only if the
> number of active jobs is <= ESD_USB_TX_URBS_LO_WM.
>
> This change eliminates the occasional error messages and significantly
> reduces the number of calls to netif_start_queue() and
> netif_stop_queue().
>
> The watermark limits have been chosen with the CAN-USB/Micro in mind to
> not to compromise its TX throughput. This device is running on USB 1.1
> only with its 1ms USB polling cycle where a ESD_USB_TX_URBS_LO_WM
> value below 9 decreases the TX throughput.
> - netif_wake_queue(netdev);
> + if (atomic_read(&priv->active_tx_jobs) <= ESD_USB_TX_URBS_LO_WM)
> + netif_wake_queue(netdev);
> }
> - /* Slow down tx path */
> - if (atomic_read(&priv->active_tx_jobs) >= ESD_USB_MAX_TX_URBS)
> + /* Slow down TX path */
> + if (atomic_read(&priv->active_tx_jobs) >= ESD_USB_TX_URBS_HI_WM)
> netif_stop_queue(netdev);
>
> err = usb_submit_urb(urb, GFP_ATOMIC);
I don't know much about USB. Is there some locking that makes this not
racy? I recommend using the macros from net/netdev_queues.h like
netif_txq_maybe_stop() the re-checking on one side is key.
Powered by blists - more mailing lists