Re: [PATCH v2] USB: HCD: Fix URB giveback issue in tasklet function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2022/7/25 16:29, Sergei Shtylyov wrote:
Hello!

On 7/25/22 9:52 AM, Weitao Wang wrote:

Usb core introduce the mechanism of giveback of URB in tasklet context to
reduce hardware interrupt handling time. On some test situation(such as
FIO with 4KB block size), when tasklet callback function called to
giveback URB, interrupt handler add URB node to the bh->head list also.
If check bh->head list again after finish all URB giveback of local_list,
then it may introduce a "dynamic balance" between giveback URB and add URB
to bh->head list. This tasklet callback function may not exit for a long
time, which will cause other tasklet function calls to be delayed. Some
real-time applications(such as KB and Mouse) will see noticeable lag.

Fix this issue by taking new URBs giveback in next tasklet function call.
Add a member high_prio for structure giveback_urb_bh and replace the local
high_prio_bh variable with this structure member in usb_hcd_giveback_urb.

Fixes: 94dfd7edfd5c ("USB: HCD: support giveback of URB in tasklet context")
Signed-off-by: Weitao Wang <WeitaoWang-oc@xxxxxxxxxxx>
---
v1->v2:
  - Fix compile warning by remove label "restart".
  - Modify the patch description info.
  - Change structure member from hi_priority to high_prio.

  drivers/usb/core/hcd.c  | 25 ++++++++++++++-----------
  include/linux/usb/hcd.h |  1 +
  2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 06eea8848ccc..1feb9a604380 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
[...]
@@ -2959,6 +2961,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
/* initialize tasklets */
  	init_giveback_urb_bh(&hcd->high_prio_bh);
+	hcd->high_prio_bh.high_prio = 1;

    s/1/true/?
Okay,this Boolean variable should be initialized to ture.
Thanks for your suggestion.

weitao
  	init_giveback_urb_bh(&k->low_prio_bh);
/* enable irqs just before we start the controller,
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 2c1fc9212cf2..98d1921f02b1 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -66,6 +66,7 @@
struct giveback_urb_bh {
  	bool running;
+	bool high_prio;
  	spinlock_t lock;
  	struct list_head  head;
  	struct tasklet_struct bh;

MBR, Sergey
.



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux