This is a note to let you know that I've just added the patch titled Subject: USB: add usb_autopm_get_interface_burst()
to my gregkh-2.6 tree. Its filename is usb-add-usb_autopm_get_interface_burst.patch This tree can be found at http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/ >From [EMAIL PROTECTED] Fri Jul 6 11:21:32 2007 From: Alan Stern <[EMAIL PROTECTED]> Date: Fri, 6 Jul 2007 14:21:26 -0400 (EDT) Subject: USB: add usb_autopm_get_interface_burst() To: Greg KH <[EMAIL PROTECTED]> Cc: USB development list <linux-usb-devel@lists.sourceforge.net> Message-ID: <[EMAIL PROTECTED]> This patch (as929) adds usb_autopm_get_interface_burst() to the autosuspend programming interface. It is intended for situations where I/O events occur in bursts of activity; it reduces overhead by not cancelling the device's autosuspend timer. Signed-off-by: Alan Stern <[EMAIL PROTECTED]> Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]> --- drivers/usb/core/driver.c | 50 +++++++++++++++++++++++++++++++++++++--------- include/linux/usb.h | 1 2 files changed, 42 insertions(+), 9 deletions(-) --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1126,6 +1126,7 @@ static int usb_suspend_both(struct usb_d /** * usb_resume_both - resume a USB device and its interfaces * @udev: the usb_device to resume + * @burst: flag for burst-mode operation (don't disable the suspend timer) * * This is the central routine for resuming USB devices. It calls the * the resume method for @udev and then calls the resume methods for all @@ -1136,6 +1137,13 @@ static int usb_suspend_both(struct usb_d * tree and assuring that @udev will be able to resume. If the parent is * unable to resume successfully, the routine fails. * + * If @burst is set then @udev's autosuspend timer isn't cancelled. This + * helps avoid timer overhead in situations where bursts of I/O requests + * occur during a short period of time. If the timer expires later while + * @udev is still busy, nothing will happen and the timer won't be restarted. + * If the timer expires after @udev has become idle again, it will either + * reschedule itself or perform an autosuspend as usual. + * * The resume method calls are subject to mutual exclusion under control * of @udev's pm_mutex. Many of these calls are also under the protection * of @udev's device lock (including all requests originating outside the @@ -1151,14 +1159,15 @@ static int usb_suspend_both(struct usb_d * * This routine can run only in process context. */ -static int usb_resume_both(struct usb_device *udev) +static int usb_resume_both(struct usb_device *udev, int burst) { int status = 0; int i; struct usb_interface *intf; struct usb_device *parent = udev->parent; - cancel_delayed_work(&udev->autosuspend); + if (!burst) + cancel_delayed_work(&udev->autosuspend); if (udev->state == USB_STATE_NOTATTACHED) { status = -ENODEV; goto done; @@ -1233,7 +1242,7 @@ static int usb_autopm_do_device(struct u WARN_ON(udev->pm_usage_cnt < 0); if (inc_usage_cnt >= 0 && udev->pm_usage_cnt > 0) { if (udev->state == USB_STATE_SUSPENDED) - status = usb_resume_both(udev); + status = usb_resume_both(udev, 0); if (status != 0) udev->pm_usage_cnt -= inc_usage_cnt; else if (inc_usage_cnt) @@ -1338,7 +1347,7 @@ int usb_autoresume_device(struct usb_dev * its device's autosuspend state. */ static int usb_autopm_do_interface(struct usb_interface *intf, - int inc_usage_cnt) + int inc_usage_cnt, int burst) { struct usb_device *udev = interface_to_usbdev(intf); int status = 0; @@ -1351,7 +1360,7 @@ static int usb_autopm_do_interface(struc intf->pm_usage_cnt += inc_usage_cnt; if (inc_usage_cnt >= 0 && intf->pm_usage_cnt > 0) { if (udev->state == USB_STATE_SUSPENDED) - status = usb_resume_both(udev); + status = usb_resume_both(udev, burst); if (status != 0) intf->pm_usage_cnt -= inc_usage_cnt; else if (inc_usage_cnt) @@ -1401,7 +1410,7 @@ void usb_autopm_put_interface(struct usb { int status; - status = usb_autopm_do_interface(intf, -1); + status = usb_autopm_do_interface(intf, -1, 0); dev_vdbg(&intf->dev, "%s: status %d cnt %d\n", __FUNCTION__, status, intf->pm_usage_cnt); } @@ -1445,7 +1454,7 @@ int usb_autopm_get_interface(struct usb_ { int status; - status = usb_autopm_do_interface(intf, 1); + status = usb_autopm_do_interface(intf, 1, 0); dev_vdbg(&intf->dev, "%s: status %d cnt %d\n", __FUNCTION__, status, intf->pm_usage_cnt); return status; @@ -1453,6 +1462,29 @@ int usb_autopm_get_interface(struct usb_ EXPORT_SYMBOL_GPL(usb_autopm_get_interface); /** + * usb_autopm_get_interface_burst - increment a USB interface's PM-usage counter for burst-mode operation + * @intf: the usb_interface whose counter should be incremented + * + * This routine does almost exactly the same thing as + * usb_autopm_get_interface() above. The only difference is that it + * doesn't disable the device's autosuspend timer, so there's less + * overhead when the routine is called over and over again for a burst + * of I/O. + * + * This routine can run only in process context. + */ +int usb_autopm_get_interface_burst(struct usb_interface *intf) +{ + int status; + + status = usb_autopm_do_interface(intf, 1, 1); + dev_vdbg(&intf->dev, "%s: status %d cnt %d\n", + __FUNCTION__, status, intf->pm_usage_cnt); + return status; +} +EXPORT_SYMBOL_GPL(usb_autopm_get_interface_burst); + +/** * usb_autopm_set_interface - set a USB interface's autosuspend state * @intf: the usb_interface whose state should be set * @@ -1467,7 +1499,7 @@ int usb_autopm_set_interface(struct usb_ { int status; - status = usb_autopm_do_interface(intf, 0); + status = usb_autopm_do_interface(intf, 0, 0); dev_vdbg(&intf->dev, "%s: status %d cnt %d\n", __FUNCTION__, status, intf->pm_usage_cnt); return status; @@ -1524,7 +1556,7 @@ int usb_external_resume_device(struct us usb_pm_lock(udev); udev->auto_pm = 0; - status = usb_resume_both(udev); + status = usb_resume_both(udev, 0); udev->last_busy = jiffies; usb_pm_unlock(udev); --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -442,6 +442,7 @@ extern struct usb_device *usb_find_devic #ifdef CONFIG_USB_SUSPEND extern int usb_autopm_set_interface(struct usb_interface *intf); extern int usb_autopm_get_interface(struct usb_interface *intf); +extern int usb_autopm_get_interface_burst(struct usb_interface *intf); extern void usb_autopm_put_interface(struct usb_interface *intf); static inline void usb_autopm_enable(struct usb_interface *intf) Patches currently in gregkh-2.6 which might be from [EMAIL PROTECTED] are driver/sysfs-implement-sysfs_find_dirent-and-sysfs_get_dirent.patch driver/sysfs-use-sysfs_mutex-to-protect-the-sysfs_dirent-tree.patch driver/pm-remove-pm_parent-from-struct-dev_pm_info.patch driver/pm-remove-saved_state-from-struct-dev_pm_info.patch driver/pm-simplify-suspend_device.patch driver/sysfs-consolidate-sysfs-spinlocks.patch driver/sysfs-implement-sysfs_flag_removed-flag.patch driver/sysfs-implement-sysfs_get_dentry.patch driver/sysfs-make-directory-dentries-and-inodes-reclaimable.patch driver/sysfs-make-kobj-point-to-sysfs_dirent-instead-of-dentry.patch driver/sysfs-make-sysfs_drop_dentry-access-inodes-using-ilookup.patch driver/sysfs-move-sysfs_drop_dentry-to-dir.c-and-make-it-static.patch driver/sysfs-rename-sysfs_dirent-s_type-to-s_flags-and-make-room-for-flags.patch driver/sysfs-restructure-add-remove-paths-and-fix-inode-update.patch driver/pm-remove-prev_state-from-struct-dev_pm_info.patch driver/pm-do-not-check-parent-state-in-suspend-and-resume-core-code.patch driver/pm-remove-power_state.event-checks-from-suspend-core-code.patch usb/usb-add-usb-persist-facility.patch usb/usb-core-hub.c-prevent-re-enumeration-on-hnp.patch usb/usb-add-reset_resume-device-quirk.patch usb/usb-don-t-unsuspend-for-a-new-connection.patch usb/usb-implement-pm-freeze-and-prethaw.patch usb/usb-add-usb_autopm_get_interface_burst.patch usb/usb-disable-file_storage-usb_config_att_wakeup.patch usb/usb-interface-pm-state.patch usb/usb-make-hub-driver-s-release-more-robust.patch usb/usb-move-bus_suspend-and-bus_resume-method-calls.patch usb/usb-remove-locktree-routine-from-the-hub-driver.patch usb/usb-remove-references-to-dev.power.power_state.patch usb/usb-make-device-reset-stop-retrying-after-disconnect.patch usb/usb-add-power-persist-device-attribute.patch usb/usb-add-reset_resume-method.patch usb/usb-remove-__usb_port_suspend.patch usb/usb-remove-excess-code-from-hub.c.patch usb/usb-separate-root-and-non-root-suspend-resume.patch usb/usb-unify-reset_resume-and-normal-resume.patch usb/usb-add-usb_device_and_interface_info-for-device-matching.patch usb/usb-ehci-fix-handover-for-designated-full-speed-ports.patch usb/usb-ehci-ohci-handover-changes.patch usb/usb-option-fix-usage-of-urb-status-abuse.patch usb/usb-prevent-char-device-open-deregister-race.patch usb/usb-rework-c-style-comments.patch usb/usb-usb-storage-use-kthread_stop-for-the-control-thread.patch usb/usb-handle-bogus-low-speed-bulk-endpoints.patch usb/usb-don-t-resume-root-hub-if-the-controller-is-suspended.patch usb/usb-fix-off-by-1-error-in-the-scatter-gather-library.patch usb/usb-fix-up-full-speed-binterval-values-in-high-speed-interrupt-descriptor.patch usb/usb-remove-usages-of-dev-power.power_state.patch usb/usb-drivers-usb-storage-unusual_devs.h-whitespace-cleanup.patch usb/usb-storage-implement-autosuspend.patch ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel