lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 30 Sep 2021 02:41:18 +0000 From: Hayes Wang <hayeswang@...ltek.com> To: Jason-ch Chen <jason-ch.chen@...iatek.com>, "matthias.bgg@...il.com" <matthias.bgg@...il.com> CC: "linux-usb@...r.kernel.org" <linux-usb@...r.kernel.org>, "netdev@...r.kernel.org" <netdev@...r.kernel.org>, "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>, "linux-arm-kernel@...ts.infradead.org" <linux-arm-kernel@...ts.infradead.org>, "linux-mediatek@...ts.infradead.org" <linux-mediatek@...ts.infradead.org>, "Project_Global_Chrome_Upstream_Group@...iatek.com" <Project_Global_Chrome_Upstream_Group@...iatek.com>, "hsinyi@...gle.com" <hsinyi@...gle.com>, nic_swsd <nic_swsd@...ltek.com> Subject: RE: [PATCH] r8152: stop submitting rx for -EPROTO Jason-ch Chen <jason-ch.chen@...iatek.com> > Sent: Wednesday, September 29, 2021 5:53 PM [...] > Hi Hayes, > > Sometimes Rx submits rapidly and the USB kernel driver of opensource > cannot receive any disconnect event due to CPU heavy loading, which > finally causes a system crash. > Do you have any suggestions to modify the r8152 driver to prevent this > situation happened? Do you mind to try the following patch? It avoids to re-submit RX immediately. diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 60ba9b734055..bfe00af8283f 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -767,6 +767,7 @@ enum rtl8152_flags { PHY_RESET, SCHEDULE_TASKLET, GREEN_ETHERNET, + SCHEDULE_NAPI, }; #define DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 0x3082 @@ -1770,6 +1771,14 @@ static void read_bulk_callback(struct urb *urb) rtl_set_unplug(tp); netif_device_detach(tp->netdev); return; + case -EPROTO: + urb->actual_length = 0; + spin_lock_irqsave(&tp->rx_lock, flags); + list_add_tail(&agg->list, &tp->rx_done); + spin_unlock_irqrestore(&tp->rx_lock, flags); + set_bit(SCHEDULE_NAPI, &tp->flags); + schedule_delayed_work(&tp->schedule, 1); + return; case -ENOENT: return; /* the urb is in unlink state */ case -ETIME: @@ -2425,6 +2434,7 @@ static int rx_bottom(struct r8152 *tp, int budget) if (list_empty(&tp->rx_done)) goto out1; + clear_bit(SCHEDULE_NAPI, &tp->flags); INIT_LIST_HEAD(&rx_queue); spin_lock_irqsave(&tp->rx_lock, flags); list_splice_init(&tp->rx_done, &rx_queue); @@ -2441,7 +2451,7 @@ static int rx_bottom(struct r8152 *tp, int budget) agg = list_entry(cursor, struct rx_agg, list); urb = agg->urb; - if (urb->actual_length < ETH_ZLEN) + if (urb->status != 0 || urb->actual_length < ETH_ZLEN) goto submit; agg_free = rtl_get_free_rx(tp, GFP_ATOMIC); @@ -6643,6 +6653,10 @@ static void rtl_work_func_t(struct work_struct *work) netif_carrier_ok(tp->netdev)) tasklet_schedule(&tp->tx_tl); + if (test_and_clear_bit(SCHEDULE_NAPI, &tp->flags) && + !list_empty(&tp->rx_done)) + napi_schedule(&tp->napi); + mutex_unlock(&tp->control); out1: Best Regards, Hayes
Powered by blists - more mailing lists