]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
can: gs_usb: gs_usb_receive_bulk_callback(): resubmit URB on skb allocation failure
authorMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 9 Jul 2026 07:54:26 +0000 (09:54 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 29 Jul 2026 10:00:00 +0000 (12:00 +0200)
If the allocation of the SKB in gs_usb_receive_bulk_callback() fails, the
driver returns from the callback without resubmitting the URB in order to
receive further USB in URBs.

This results in a silent performance degradation which, if it occurs
repeatedly, results in starvation of USB in traffic.

Instead of returning immediately, try to resend the URB. If this also
fails, this is logged as an info message.

Fixes: d08e973a77d1 ("can: gs_usb: Added support for the GS_USB CAN devices")
Fixes: 26949ac935e3 ("can: gs_usb: add CAN-FD support")
Link: https://patch.msgid.link/20260709-gs_usb-resubmit-urb-v1-1-4dd40030cc84@pengutronix.de
Cc: stable@kernel.org
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/gs_usb.c

index ec9a7cbbbc6962076ed967c02b2676f3ba0a26b0..82508a865095915ad50aaffc2951c0bbbab5d65a 100644 (file)
@@ -674,7 +674,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
                if (hf->flags & GS_CAN_FLAG_FD) {
                        skb = alloc_canfd_skb(netdev, &cfd);
                        if (!skb)
-                               return;
+                               goto resubmit_urb;
 
                        cfd->can_id = le32_to_cpu(hf->can_id);
                        cfd->len = data_length;
@@ -687,7 +687,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
                } else {
                        skb = alloc_can_skb(netdev, &cf);
                        if (!skb)
-                               return;
+                               goto resubmit_urb;
 
                        cf->can_id = le32_to_cpu(hf->can_id);
                        can_frame_set_cc_len(cf, hf->can_dlc, dev->can.ctrlmode);