From: Greg KH <gregkh@linuxfoundation.org>
To: Guan-Yu Lin <guanyulin@google.com>
Cc: Thinh.Nguyen@synopsys.com, mathias.nyman@intel.com,
stern@rowland.harvard.edu, elder@kernel.org, oneukum@suse.com,
yajun.deng@linux.dev, dianders@chromium.org, kekrby@gmail.com,
perex@perex.cz, tiwai@suse.com, tj@kernel.org,
stanley_chang@realtek.com, andreyknvl@gmail.com,
christophe.jaillet@wanadoo.fr, quic_jjohnson@quicinc.com,
ricardo@marliere.net, grundler@chromium.org,
niko.mauno@vaisala.com, linux-usb@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org,
badhri@google.com, albertccwang@google.com,
quic_wcheng@quicinc.com, pumahsu@google.com
Subject: Re: [PATCH v4 3/5] usb: add apis for sideband uasge tracking
Date: Wed, 9 Oct 2024 14:44:03 +0200 [thread overview]
Message-ID: <2024100941-limping-dislodge-5c74@gregkh> (raw)
In-Reply-To: <20241009054429.3970438-4-guanyulin@google.com>
On Wed, Oct 09, 2024 at 05:42:57AM +0000, Guan-Yu Lin wrote:
> Introduce sb_usage_count and corresponding apis to track sideband usage
> on each usb_device. A sideband refers to the co-processor that accesses
> the usb_device via shared control on the same USB host controller. To
> optimize power usage, it's essential to monitor whether ther sideband is
> actively using the usb_device. This information is vital when
> determining if a usb_device can be safely suspended during system power
> state transitions.
>
> Signed-off-by: Guan-Yu Lin <guanyulin@google.com>
> ---
> drivers/usb/core/driver.c | 54 +++++++++++++++++++++++++++++++++++++++
> include/linux/usb.h | 13 ++++++++++
> 2 files changed, 67 insertions(+)
>
> diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
> index 0c3f12daac79..c1ba5ed15214 100644
> --- a/drivers/usb/core/driver.c
> +++ b/drivers/usb/core/driver.c
> @@ -1673,6 +1673,60 @@ void usb_disable_autosuspend(struct usb_device *udev)
> }
> EXPORT_SYMBOL_GPL(usb_disable_autosuspend);
>
> +/**
> + * usb_sideband_get - notify usb driver there's a new active sideband
> + * @udev: the usb_device which has an active sideband
> + *
> + * An active sideband indicates that another entity is currently using the usb
> + * device. Notify the usb device by increasing the sb_usage_count. This allows
> + * usb driver to adjust power management policy based on sideband activities.
> + */
> +void usb_sideband_get(struct usb_device *udev)
> +{
> + struct usb_device *parent = udev;
> +
> + do {
> + atomic_inc(&parent->sb_usage_count);
As this is a reference count, use refcount_t please.
> + parent = parent->parent;
> + } while (parent);
Woah, walking up the device chain? That should not be needed, or if so,
then each device's "usage count" is pointless.
> +}
> +EXPORT_SYMBOL_GPL(usb_sideband_get);
> +
> +/**
> + * usb_sideband_put - notify usb driver there's a sideband deactivated
> + * @udev: the usb_device which has a sideband deactivated
> + *
> + * The inverse operation of usb_sideband_get, which notifies the usb device by
> + * decreasing the sb_usage_count. This allows usb driver to adjust power
> + * management policy based on sideband activities.
> + */
> +void usb_sideband_put(struct usb_device *udev)
> +{
> + struct usb_device *parent = udev;
> +
> + do {
> + atomic_dec(&parent->sb_usage_count);
> + parent = parent->parent;
> + } while (parent);
> +}
> +EXPORT_SYMBOL_GPL(usb_sideband_put);
> +
> +/**
> + * usb_sideband_check - check sideband activities on the host controller
> + * @udev: the usb_device which has a sideband deactivated
> + *
> + * Check if there are any sideband activity on the USB device right now. This
> + * information could be used for power management or other forms or resource
> + * management.
> + *
> + * Returns true on any active sideband existence, false otherwise
> + */
> +bool usb_sideband_check(struct usb_device *udev)
> +{
> + return !!atomic_read(&udev->sb_usage_count);
And what happens if it changes right after you make this call? This
feels racy and broken.
> +}
> +EXPORT_SYMBOL_GPL(usb_sideband_check);
> +
> /**
> * usb_autosuspend_device - delayed autosuspend of a USB device and its interfaces
> * @udev: the usb_device to autosuspend
> diff --git a/include/linux/usb.h b/include/linux/usb.h
> index 672d8fc2abdb..5b9fea378960 100644
> --- a/include/linux/usb.h
> +++ b/include/linux/usb.h
> @@ -645,6 +645,7 @@ struct usb3_lpm_parameters {
> * parent->hub_delay + wHubDelay + tTPTransmissionDelay (40ns)
> * Will be used as wValue for SetIsochDelay requests.
> * @use_generic_driver: ask driver core to reprobe using the generic driver.
> + * @sb_usage_count: number of active sideband accessing this usb device.
> *
> * Notes:
> * Usbcore drivers should not set usbdev->state directly. Instead use
> @@ -731,6 +732,8 @@ struct usb_device {
>
> u16 hub_delay;
> unsigned use_generic_driver:1;
> +
> + atomic_t sb_usage_count;
Why is this on the device and not the interface that is bound to the
driver that is doing this work?
thanks,
greg k-h
next prev parent reply other threads:[~2024-10-09 12:44 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-09 5:42 [PATCH v4 0/5] Support system sleep with offloaded usb transfers Guan-Yu Lin
2024-10-09 5:42 ` [PATCH v4 1/5] usb: dwc3: separate dev_pm_ops for each pm_event Guan-Yu Lin
2024-10-09 12:45 ` Greg KH
2024-10-10 4:12 ` Guan-Yu Lin
2024-10-09 5:42 ` [PATCH v4 2/5] usb: xhci-plat: " Guan-Yu Lin
2024-10-09 5:42 ` [PATCH v4 3/5] usb: add apis for sideband uasge tracking Guan-Yu Lin
2024-10-09 7:33 ` Amadeusz Sławiński
2024-10-09 11:36 ` Guan-Yu Lin
2024-10-09 12:44 ` Greg KH [this message]
2024-10-10 5:30 ` Guan-Yu Lin
2024-10-10 6:33 ` Greg KH
2024-10-10 16:14 ` Guan-Yu Lin
2024-10-11 4:30 ` Greg KH
2024-10-11 7:33 ` Guan-Yu Lin
2024-10-09 5:42 ` [PATCH v4 4/5] xhci: sideband: add api to trace sideband usage Guan-Yu Lin
2024-10-09 12:47 ` Greg KH
2024-10-10 4:16 ` Guan-Yu Lin
2024-10-09 5:42 ` [PATCH v4 5/5] usb: host: enable sideband transfer during system sleep Guan-Yu Lin
2024-10-09 12:47 ` Greg KH
2024-10-11 7:34 ` Guan-Yu Lin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2024100941-limping-dislodge-5c74@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=Thinh.Nguyen@synopsys.com \
--cc=albertccwang@google.com \
--cc=andreyknvl@gmail.com \
--cc=badhri@google.com \
--cc=christophe.jaillet@wanadoo.fr \
--cc=dianders@chromium.org \
--cc=elder@kernel.org \
--cc=grundler@chromium.org \
--cc=guanyulin@google.com \
--cc=kekrby@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=niko.mauno@vaisala.com \
--cc=oneukum@suse.com \
--cc=perex@perex.cz \
--cc=pumahsu@google.com \
--cc=quic_jjohnson@quicinc.com \
--cc=quic_wcheng@quicinc.com \
--cc=ricardo@marliere.net \
--cc=stanley_chang@realtek.com \
--cc=stern@rowland.harvard.edu \
--cc=tiwai@suse.com \
--cc=tj@kernel.org \
--cc=yajun.deng@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.