Re: About resume time optimization for bus resume routine

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

 



On Wed, Oct 17, 2012 at 05:28:22PM -0400, Alan Stern wrote:
> On Tue, 16 Oct 2012, Peter Chen wrote:
> 
> > I have tested it at Freescale i.mx6Q sabrelite board, your patch is ok.
> > Will you post a patch or I do it for you?
> 
> I decided to use a different approach.  The core should know which 
> ports are suspended without asking the HCD.  Can you test this patch in 
> place of the other one?
It shows below oops, you may not consider there is no device at port
condition.

Besides, how about using usleep_range instead of msleep? msleep is not
precise, and should not be used at (<20ms) condition, at my platform,
msleep 10 consumes about 19-20ms.

Unable to handle kernel NULL pointer dereference at virtual address 00000018
pgd = 80004000
[00000018] *pgd=00000000
Internal error: Oops: 5 [#1] SMP ARM
Modules linked in:
CPU: 3    Not tainted  (3.7.0-rc1+ #24)
	PC is at hcd_bus_resume+0x148/0x188
	LR is at hdev_to_hub+0x40/0x44
	pc : [<80366a9c>]    lr : [<8036084c>]    psr: 20000113
	sp : bf87bdb0  ip : bf87bd88  fp : bf87bdd4
	r10: 8072c30c  r9 : 00000000  r8 : bf80ec90
	r7 : 80739a28  r6 : 00000000  r5 : bf80f000  r4 : 00000001
	r3 : 00000000  r2 : 00000001  r1 : 00000001  r0 : 00000000
	Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
	Control: 10c53c7d  Table: 1000404a  DAC: 00000017
	Process kworker/u:0 (pid: 6, stack limit = 0xbf87a238)
	Stack: (0xbf87bdb0 to 0xbf87c000)
	bda0:                                     bf80f068 bf80f000 00000010 00000000
	bdc0: 8035ff98 00000000 bf87bde4 bf87bdd8 80373fb8 80366960 bf87be04 bf87bde8
	bde0: 8036cb6c 80373fa0 bf80f068 bf80f068 00000000 00000000 bf87be14 bf87be08
	be00: 8035ffac 8036ca00 bf87be4c bf87be18 802c9724 8035ffa4 00000000 8072c30c
	be20: 00000000 00000000 bf87be4c bf80f068 bf80f09c 00000010 8072c764 806e8d0c
	be40: bf87be6c bf87be50 802c99b8 802c96fc bf80f068 80737cc8 bf3cafc8 8072c764
	be60: bf87be84 bf87be70 802c9b3c 802c98ec bf3cafc0 806ba2dc bf87becc bf87be88
	be80: 8004a03c 802c9b28 8072c200 bf87a000 bf804800 bf3cafc8 00000000 8072c30c
	bea0: bf87bebc bf87beb0 bf826a40 8072c200 bf87a000 bf804800 bf3cafc8 00000000
	bec0: bf87bf14 bf87bed0 80039c80 80049fbc bf2a5b00 806a5240 812b5240 bf826a40
	bee0: bf804805 80049fb0 8072c314 bf826a40 8072c30c bf87a000 8072c314 bf826a50
	bf00: 00000000 00000089 bf87bf54 bf87bf18 8003a3d0 80039b0c 00000000 bf861e34
	bf20: bf826a50 8072c200 bf826a40 bf861e34 bf87bf5c 00000000 bf826a40 8003a2a0
	bf40: 00000000 00000000 bf87bfac bf87bf58 80041ad0 8003a2ac 00000000 00000000
	bf60: 00000000 bf826a40 00000000 00000000 bf87bf70 bf87bf70 00000000 00000000
	bf80: bf87bf80 bf87bf80 800508d4 bf861e34 80041a20 00000000 00000000 00000000
	bfa0: 00000000 bf87bfb0 8000ecd8 80041a2c 00000000 00000000 00000000 00000000
	bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
	bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
	Backtrace: 
	[<80366954>] (hcd_bus_resume+0x0/0x188) from [<80373fb8>] (generic_resume+0x24/0x28)
	 r9:00000000 r8:8035ff98 r7:00000000 r6:00000010 r5:bf80f000
	 r4:bf80f068
	 [<80373f94>] (generic_resume+0x0/0x28) from [<8036cb6c>] (usb_resume+0x178/0x198)
	[<8036c9f4>] (usb_resume+0x0/0x198) from [<8035ffac>] (usb_dev_resume+0x14/0x18)
	 r7:00000000 r6:00000000 r5:bf80f068 r4:bf80f068
	 [<8035ff98>] (usb_dev_resume+0x0/0x18) from [<802c9724>] (dpm_run_callback+0x34/0x7c)
	[<802c96f0>] (dpm_run_callback+0x0/0x7c) from [<802c99b8>] (device_resume+0xd8/0x23c)
	 r8:806e8d0c r7:8072c764 r6:00000010 r5:bf80f09c r4:bf80f068
	 [<802c98e0>] (device_resume+0x0/0x23c) from [<802c9b3c>] (async_resume+0x20/0x4c)
	 r7:8072c764 r6:bf3cafc8 r5:80737cc8 r4:bf80f068
	 [<802c9b1c>] (async_resume+0x0/0x4c) from [<8004a03c>] (async_run_entry_fn+0x8c/0x200)
	 r5:806ba2dc r4:bf3cafc0
	 [<80049fb0>] (async_run_entry_fn+0x0/0x200) from [<80039c80>] (process_one_work+0x180/0x428)
	 r9:00000000 r8:bf3cafc8 r7:bf804800 r6:bf87a000 r5:8072c200
	 r4:bf826a40
	 [<80039b00>] (process_one_work+0x0/0x428) from [<8003a3d0>] (worker_thread+0x130/0x528)
	[<8003a2a0>] (worker_thread+0x0/0x528) from [<80041ad0>] (kthread+0xb0/0xbc)
	[<80041a20>] (kthread+0x0/0xbc) from [<8000ecd8>] (ret_from_fork+0x14/0x3c)
	 r8:00000000 r7:00000000 r6:00000000 r5:80041a20 r4:bf861e34
	 Code: e5952214 e1520004 e1a03000 baffffb7 (e5932018) 
	---[ end trace 9ee8ab26298c73ee ]---
	Unable to handle kernel paging request at virtual address ffffffec
	pgd = 80004000
	[ffffffec] *pgd=4fffe821, *pte=00000000, *ppte=00000000
	Internal error: Oops: 17 [#2] SMP ARM
	Modules linked in:
	CPU: 3    Tainted: G      D       (3.7.0-rc1+ #24)
	PC is at kthread_data+0x10/0x18
	LR is at wq_worker_sleeping+0x14/0xa4
	pc : [<8004143c>]    lr : [<8003d7c8>]    psr: 20000193
	sp : bf87bae8  ip : bf87baf8  fp : bf87baf4
	r10: bf855080  r9 : 806a5240  r8 : 806af148
	r7 : 00000003  r6 : 00000003  r5 : bf854f00  r4 : 812cd240
	r3 : 00000000  r2 : 4b72695e  r1 : 00000003  r0 : bf854f00
	Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
	Control: 10c53c7d  Table: 1000404a  DAC: 00000015
	Process kworker/u:0 (pid: 6, stack limit = 0xbf87a238)
	Stack: (0xbf87bae8 to 0xbf87c000)
	bae0:                   bf87bb14 bf87baf8 8003d7c8 80041438 812cd240 bf854f00
	bb00: bf87a000 00000003 bf87bb5c bf87bb18 804e2c40 8003d7c0 00000001 80008f0c
	bb20: bf854f00 806a5240 bf87a000 806a5240 bf87bb5c bf854f00 00000001 0000000b
	bb40: bf854000 bf87bb94 bf855004 bf87a000 bf87bb6c bf87bb60 804e31d4 804e28cc
	bb60: bf87bba4 bf87bb70 800287ec 804e31a8 bf87a000 bf87bb8c 00000001 bf85515c
	bb80: bf855004 806e9060 bf87bba4 bf87bb8c bf87bb8c bf85504c bf87bc2c bf87bba8
	bba0: 800129bc 80028288 bf87a238 0000000b 00000001 00000008 00000000 00000000
	bbc0: 60000113 80366aa0 35393565 34313232 35316520 30303032 31652034 30333061
	bbe0: 62203030 66666661 20376266 39356528 31303233 00202938 800159f0 804e10c0
	bc00: 8061443c bf87bd68 00000018 00000000 00000005 00000000 bf854f00 00000018
	bc20: bf87bc54 bf87bc30 80015abc 800127cc bf87a000 00000000 bf87bd68 00000005
	bc40: bf80ec90 bf854f00 bf87bc9c bf87bc58 80015c38 80015a5c 6c703d4d 6f667461
	bc60: 44006d72 00000000 00000028 6674616c 3a6d726f 00000005 806b2d20 00000018
	bc80: bf87bd68 bf80ec90 00000000 8072c30c bf87bcbc bf87bca0 80015e64 80015ae8
	bca0: 00000005 806b2d20 00000018 bf87bd68 bf87bd64 bf87bcc0 80008474 80015dcc
	bcc0: ffff963a 812cd240 00000001 00000003 bf80ecd0 00000000 00000010 00000004
	bce0: bf87bd04 bf87bcf0 802bf8b4 802bf840 bf88801c bf87bd0c bf87bd24 bf87bd10
	bd00: 802bf908 802bf89c 80600ef0 8061d458 bf845d00 bf87bd2c bf87bd44 bf87bd28
	bd20: 802bfb78 802bf8c8 bf87bd4c bf87bd38 80019d10 804e3d7c bf80ecd0 806ae950
	bd40: bf87bdac bf87bd50 80366a9c 20000113 ffffffff bf87bd9c bf87bdd4 bf87bd68
	bd60: 8000e760 80008444 00000000 00000001 00000001 00000000 00000001 bf80f000
	bd80: 00000000 80739a28 bf80ec90 00000000 8072c30c bf87bdd4 bf87bd88 bf87bdb0
	bda0: 8036084c 80366a9c 20000113 ffffffff bf80f068 bf80f000 00000010 00000000
	bdc0: 8035ff98 00000000 bf87bde4 bf87bdd8 80373fb8 80366960 bf87be04 bf87bde8
	bde0: 8036cb6c 80373fa0 bf80f068 bf80f068 00000000 00000000 bf87be14 bf87be08
	be00: 8035ffac 8036ca00 bf87be4c bf87be18 802c9724 8035ffa4 00000000 8072c30c
	be20: 00000000 00000000 bf87be4c bf80f068 bf80f09c 00000010 8072c764 806e8d0c
	be40: bf87be6c bf87be50 802c99b8 802c96fc bf80f068 80737cc8 bf3cafc8 8072c764
	be60: bf87be84 bf87be70 802c9b3c 802c98ec bf3cafc0 806ba2dc bf87becc bf87be88
	be80: 8004a03c 802c9b28 8072c200 bf87a000 bf804800 bf3cafc8 00000000 8072c30c
	bea0: bf87bebc bf87beb0 bf826a40 8072c200 bf87a000 bf804800 bf3cafc8 00000000
	bec0: bf87bf14 bf87bed0 80039c80 80049fbc bf2a5b00 806a5240 812b5240 bf826a40
	bee0: bf804805 80049fb0 8072c314 bf826a40 8072c30c bf87a000 8072c314 bf826a50
	bf00: 00000000 00000089 bf87bf54 bf87bf18 8003a3d0 80039b0c 00000000 bf861e34
	bf20: bf826a50 8072c200 bf826a40 bf861e34 bf87bf5c 00000000 bf826a40 8003a2a0
	bf40: 00000000 00000000 bf87bfac bf87bf58 80041ad0 8003a2ac 00000000 00000000
	bf60: 00000000 bf826a40 00000000 00000000 bf87bf70 bf87bf70 00000001 00010001
	bf80: bf87bf80 bf87bf80 800508d4 bf861e34 80041a20 00000000 00000000 00000000
	bfa0: 00000000 bf87bfb0 8000ecd8 80041a2c 00000000 00000000 00000000 00000000
	bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
	bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
	Backtrace: 
	[<8004142c>] (kthread_data+0x0/0x18) from [<8003d7c8>] (wq_worker_sleeping+0x14/0xa4)
	[<8003d7b4>] (wq_worker_sleeping+0x0/0xa4) from [<804e2c40>] (__schedule+0x380/0x5a4)
	 r7:00000003 r6:bf87a000 r5:bf854f00 r4:812cd240
	 [<804e28c0>] (__schedule+0x0/0x5a4) from [<804e31d4>] (schedule+0x38/0x78)
	[<804e319c>] (schedule+0x0/0x78) from [<800287ec>] (do_exit+0x570/0x844)
	[<8002827c>] (do_exit+0x0/0x844) from [<800129bc>] (die+0x1fc/0x404)
	[<800127c0>] (die+0x0/0x404) from [<80015abc>] (__do_kernel_fault+0x6c/0x8c)
	[<80015a50>] (__do_kernel_fault+0x0/0x8c) from [<80015c38>] (do_page_fault+0x15c/0x270)
	 r9:bf854f00 r8:bf80ec90 r7:00000005 r6:bf87bd68 r5:00000000
	 r4:bf87a000
	 [<80015adc>] (do_page_fault+0x0/0x270) from [<80015e64>] (do_translation_fault+0xa4/0xac)
	[<80015dc0>] (do_translation_fault+0x0/0xac) from [<80008474>] (do_DataAbort+0x3c/0xa4)
	 r7:bf87bd68 r6:00000018 r5:806b2d20 r4:00000005
	 [<80008438>] (do_DataAbort+0x0/0xa4) from [<8000e760>] (__dabt_svc+0x40/0x60)
	Exception stack(0xbf87bd68 to 0xbf87bdb0)
	bd60:                   00000000 00000001 00000001 00000000 00000001 bf80f000
	bd80: 00000000 80739a28 bf80ec90 00000000 8072c30c bf87bdd4 bf87bd88 bf87bdb0
	bda0: 8036084c 80366a9c 20000113 ffffffff
	 r7:bf87bd9c r6:ffffffff r5:20000113 r4:80366a9c
	 [<80366954>] (hcd_bus_resume+0x0/0x188) from [<80373fb8>] (generic_resume+0x24/0x28)
	 r9:00000000 r8:8035ff98 r7:00000000 r6:00000010 r5:bf80f000
	 r4:bf80f068
	 [<80373f94>] (generic_resume+0x0/0x28) from [<8036cb6c>] (usb_resume+0x178/0x198)
	[<8036c9f4>] (usb_resume+0x0/0x198) from [<8035ffac>] (usb_dev_resume+0x14/0x18)
	 r7:00000000 r6:00000000 r5:bf80f068 r4:bf80f068
	 [<8035ff98>] (usb_dev_resume+0x0/0x18) from [<802c9724>] (dpm_run_callback+0x34/0x7c)
	[<802c96f0>] (dpm_run_callback+0x0/0x7c) from [<802c99b8>] (device_resume+0xd8/0x23c)
	 r8:806e8d0c r7:8072c764 r6:00000010 r5:bf80f09c r4:bf80f068
	 [<802c98e0>] (device_resume+0x0/0x23c) from [<802c9b3c>] (async_resume+0x20/0x4c)
	 r7:8072c764 r6:bf3cafc8 r5:80737cc8 r4:bf80f068
	 [<802c9b1c>] (async_resume+0x0/0x4c) from [<8004a03c>] (async_run_entry_fn+0x8c/0x200)
	 r5:806ba2dc r4:bf3cafc0
	 [<80049fb0>] (async_run_entry_fn+0x0/0x200) from [<80039c80>] (process_one_work+0x180/0x428)
	 r9:00000000 r8:bf3cafc8 r7:bf804800 r6:bf87a000 r5:8072c200
	 r4:bf826a40
	 [<80039b00>] (process_one_work+0x0/0x428) from [<8003a3d0>] (worker_thread+0x130/0x528)
	[<8003a2a0>] (worker_thread+0x0/0x528) from [<80041ad0>] (kthread+0xb0/0xbc)
	[<80041a20>] (kthread+0x0/0xbc) from [<8000ecd8>] (ret_from_fork+0x14/0x3c)
	 r8:00000000 r7:00000000 r6:00000000 r5:80041a20 r4:bf861e34
	 Code: e1a0c00d e92dd800 e24cb004 e5903154 (e5130014) 
	---[ end trace 9ee8ab26298c73ef ]---
	Fixing recursive fault but reboot is needed!

> 
> Alan Stern
> 
> 
> 
> Index: usb-3.6/include/linux/usb.h
> ===================================================================
> --- usb-3.6.orig/include/linux/usb.h
> +++ usb-3.6/include/linux/usb.h
> @@ -482,6 +482,7 @@ struct usb3_lpm_parameters {
>   * @connect_time: time device was first connected
>   * @do_remote_wakeup:  remote wakeup should be enabled
>   * @reset_resume: needs reset instead of resume
> + * @port_is_suspended: the upstream port is suspended (L2 or U3)
>   * @wusb_dev: if this is a Wireless USB device, link to the WUSB
>   *	specific data for the device.
>   * @slot_id: Slot ID assigned by xHCI
> @@ -560,6 +561,7 @@ struct usb_device {
>  
>  	unsigned do_remote_wakeup:1;
>  	unsigned reset_resume:1;
> +	unsigned port_is_suspended:1;
>  #endif
>  	struct wusb_dev *wusb_dev;
>  	int slot_id;
> Index: usb-3.6/drivers/usb/core/hub.c
> ===================================================================
> --- usb-3.6.orig/drivers/usb/core/hub.c
> +++ usb-3.6/drivers/usb/core/hub.c
> @@ -2876,6 +2876,7 @@ int usb_port_suspend(struct usb_device *
>  				(PMSG_IS_AUTO(msg) ? "auto-" : ""),
>  				udev->do_remote_wakeup);
>  		usb_set_device_state(udev, USB_STATE_SUSPENDED);
> +		udev->port_is_suspended = 1;
>  		msleep(10);
>  	}
>  	usb_mark_last_busy(hub->hdev);
> @@ -3040,6 +3041,7 @@ int usb_port_resume(struct usb_device *u
>  
>   SuspendCleared:
>  	if (status == 0) {
> +		udev->port_is_suspended = 0;
>  		if (hub_is_superspeed(hub->hdev)) {
>  			if (portchange & USB_PORT_STAT_C_LINK_STATE)
>  				clear_port_feature(hub->hdev, port1,
> Index: usb-3.6/drivers/usb/core/hcd.c
> ===================================================================
> --- usb-3.6.orig/drivers/usb/core/hcd.c
> +++ usb-3.6/drivers/usb/core/hcd.c
> @@ -2039,8 +2039,9 @@ int hcd_bus_resume(struct usb_device *rh
>  	status = hcd->driver->bus_resume(hcd);
>  	clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags);
>  	if (status == 0) {
> -		/* TRSMRCY = 10 msec */
> -		msleep(10);
> +		struct usb_device *udev;
> +		int port1;
> +
>  		spin_lock_irq(&hcd_root_hub_lock);
>  		if (!HCD_DEAD(hcd)) {
>  			usb_set_device_state(rhdev, rhdev->actconfig
> @@ -2050,6 +2051,20 @@ int hcd_bus_resume(struct usb_device *rh
>  			hcd->state = HC_STATE_RUNNING;
>  		}
>  		spin_unlock_irq(&hcd_root_hub_lock);
> +
> +		/*
> +		 * Check whether any of the enabled ports on the root hub are
> +		 * unsuspended.  If they are then a TRSMRCY delay is needed
> +		 * (this is what the USB-2 spec calls a "global resume").
> +		 * Otherwise we can skip the delay.
> +		 */
> +		usb_hub_for_each_child(rhdev, port1, udev) {
> +			if (udev->state != USB_STATE_NOTATTACHED &&
> +					!udev->port_is_suspended) {
> +				msleep(10);	/* TRSMRCY */
> +				break;
> +			}
> +		}
>  	} else {
>  		hcd->state = old_state;
>  		dev_dbg(&rhdev->dev, "bus %s fail, err %d\n",
> 
> 

-- 

Best Regards,
Peter Chen

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

  Powered by Linux