From patchwork Fri Jan 31 22:39:08 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zoran Markovic X-Patchwork-Id: 23994 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ve0-f200.google.com (mail-ve0-f200.google.com [209.85.128.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 4FCD0202FA for ; Fri, 31 Jan 2014 22:39:57 +0000 (UTC) Received: by mail-ve0-f200.google.com with SMTP id c14sf13261322vea.11 for ; Fri, 31 Jan 2014 14:39:56 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:sender:precedence:list-id:x-original-sender :x-original-authentication-results:mailing-list:list-post:list-help :list-archive:list-unsubscribe; bh=y+Hu9UYzHIh5Fa+3r7GhYpL1m1nzwNW/sM/WaHgoxCw=; b=fNmTsWP8ZPAxT3n9GFTiMqgfhIngy+dePRyXL4edykix7YBkg33yJGrQp01qCu6vlO UqWvTmdUuMUmf2zftK1GhPmVPfgr1Q97whMjr0xl/pAW4hEWFTTRxNc6CNyRCDPnpR6i t+YSpzDPdfUSSZIw+AUePTl1fMfwWd3oKnDj6F87C1OPVJHmL5JJO643GwsAmcj7N5z+ /5nHOlR36sZTPrLuzgoj9a6rUcj6EclnXt6i2HR5MtfgYB9ZLgT4Hg+fh5Qh1IuGuQBo 5Ba0thC69WvPt7YBTscZ+11uJUu1rTNzUd/jjnbcxuV1CNbV7kzomYObyHapTlnaRed6 02cw== X-Gm-Message-State: ALoCoQm0OEnAbj1aYLmyXbCWmoKSaHHOFhuVNIeHJB+uAvWGvWyMiUyyoYgwcKFq5BQafrTRGuQX X-Received: by 10.236.92.202 with SMTP id j50mr7733906yhf.26.1391207996118; Fri, 31 Jan 2014 14:39:56 -0800 (PST) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.22.106 with SMTP id 97ls1303072qgm.29.gmail; Fri, 31 Jan 2014 14:39:56 -0800 (PST) X-Received: by 10.220.247.68 with SMTP id mb4mr55521vcb.37.1391207996051; Fri, 31 Jan 2014 14:39:56 -0800 (PST) Received: from mail-vb0-f46.google.com (mail-vb0-f46.google.com [209.85.212.46]) by mx.google.com with ESMTPS id sg4si4035687vdc.1.2014.01.31.14.39.56 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 31 Jan 2014 14:39:56 -0800 (PST) Received-SPF: neutral (google.com: 209.85.212.46 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.212.46; Received: by mail-vb0-f46.google.com with SMTP id o19so3280324vbm.5 for ; Fri, 31 Jan 2014 14:39:56 -0800 (PST) X-Received: by 10.58.227.38 with SMTP id rx6mr18601419vec.10.1391207995932; Fri, 31 Jan 2014 14:39:55 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.174.196 with SMTP id u4csp131801vcz; Fri, 31 Jan 2014 14:39:55 -0800 (PST) X-Received: by 10.68.172.37 with SMTP id az5mr23332151pbc.139.1391207995206; Fri, 31 Jan 2014 14:39:55 -0800 (PST) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q6si11975115pbf.274.2014.01.31.14.39.54; Fri, 31 Jan 2014 14:39:54 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-usb-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932905AbaAaWjx (ORCPT + 3 others); Fri, 31 Jan 2014 17:39:53 -0500 Received: from mail-pd0-f175.google.com ([209.85.192.175]:44995 "EHLO mail-pd0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932271AbaAaWjv (ORCPT ); Fri, 31 Jan 2014 17:39:51 -0500 Received: by mail-pd0-f175.google.com with SMTP id w10so4792997pde.34 for ; Fri, 31 Jan 2014 14:39:51 -0800 (PST) X-Received: by 10.69.0.10 with SMTP id au10mr23633612pbd.48.1391207991124; Fri, 31 Jan 2014 14:39:51 -0800 (PST) Received: from vb-linaro.ric.broadcom.com ([216.31.219.19]) by mx.google.com with ESMTPSA id jp3sm31137858pbc.36.2014.01.31.14.39.49 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 31 Jan 2014 14:39:50 -0800 (PST) From: Zoran Markovic To: linux-kernel@vger.kernel.org Cc: linux-usb@vger.kernel.org, Shaibal Dutta , Greg Kroah-Hartman , Alan Stern , Sarah Sharp , Xenia Ragiadakou , Julius Werner , Krzysztof Mazur , Matthias Beyer , Dan Williams , Mathias Nyman , Thomas Pugliese , Zoran Markovic Subject: [RFC PATCH] usb: move hub init and LED blink work to power efficient workqueue Date: Fri, 31 Jan 2014 14:39:08 -0800 Message-Id: <1391207948-17063-1-git-send-email-zoran.markovic@linaro.org> X-Mailer: git-send-email 1.7.9.5 Sender: linux-usb-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: zoran.markovic@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.212.46 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Shaibal Dutta Allow the scheduler to select the best CPU to handle hub initalization and LED blinking work. This extends idle residency times on idle CPUs and conserves power. This functionality is enabled when CONFIG_WQ_POWER_EFFICIENT is selected. Cc: Greg Kroah-Hartman Cc: Alan Stern Cc: Sarah Sharp Cc: Xenia Ragiadakou Cc: Julius Werner Cc: Krzysztof Mazur Cc: Matthias Beyer Cc: Dan Williams Cc: Mathias Nyman Cc: Thomas Pugliese Signed-off-by: Shaibal Dutta [zoran.markovic@linaro.org: Rebased to latest kernel. Added commit message. Changed reference from system to power efficient workqueue for LEDs in check_highspeed() and hub_port_connect_change().] Signed-off-by: Zoran Markovic --- drivers/usb/core/hub.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index babba88..ae07ffe 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -504,7 +504,8 @@ static void led_work (struct work_struct *work) changed++; } if (changed) - schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD); + queue_delayed_work(system_power_efficient_wq, + &hub->leds, LED_CYCLE_PERIOD); } /* use a short timeout for hub/port status fetches */ @@ -1046,8 +1047,9 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) if (type == HUB_INIT) { delay = hub_power_on(hub, false); PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func2); - schedule_delayed_work(&hub->init_work, - msecs_to_jiffies(delay)); + queue_delayed_work(system_power_efficient_wq, + &hub->init_work, + msecs_to_jiffies(delay)); /* Suppress autosuspend until init is done */ usb_autopm_get_interface_no_resume( @@ -1200,8 +1202,9 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) /* Don't do a long sleep inside a workqueue routine */ if (type == HUB_INIT2) { PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func3); - schedule_delayed_work(&hub->init_work, - msecs_to_jiffies(delay)); + queue_delayed_work(system_power_efficient_wq, + &hub->init_work, + msecs_to_jiffies(delay)); return; /* Continues at init3: below */ } else { msleep(delay); @@ -1214,7 +1217,8 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) if (status < 0) dev_err(hub->intfdev, "activate --> %d\n", status); if (hub->has_indicators && blinkenlights) - schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD); + queue_delayed_work(system_power_efficient_wq, + &hub->leds, LED_CYCLE_PERIOD); /* Scan all ports that need attention */ kick_khubd(hub); @@ -4316,7 +4320,8 @@ check_highspeed (struct usb_hub *hub, struct usb_device *udev, int port1) /* hub LEDs are probably harder to miss than syslog */ if (hub->has_indicators) { hub->indicator[port1-1] = INDICATOR_GREEN_BLINK; - schedule_delayed_work (&hub->leds, 0); + queue_delayed_work(system_power_efficient_wq, + &hub->leds, 0); } } kfree(qual); @@ -4545,7 +4550,9 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, if (hub->has_indicators) { hub->indicator[port1-1] = INDICATOR_AMBER_BLINK; - schedule_delayed_work (&hub->leds, 0); + queue_delayed_work( + system_power_efficient_wq, + &hub->leds, 0); } status = -ENOTCONN; /* Don't retry */ goto loop_disable;