Generate a change uevent when the "number_of_alternate_modes" sysfs file
for partners and plugs is updated by a port driver.
Cc: Heikki Krogerus <[email protected]>
Cc: Benson Leung <[email protected]>
Signed-off-by: Prashant Malani <[email protected]>
---
drivers/usb/typec/class.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index ebfd3113a9a8..8f77669f9cf4 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -766,6 +766,7 @@ int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmod
return ret;
sysfs_notify(&partner->dev.kobj, NULL, "number_of_alternate_modes");
+ kobject_uevent(&partner->dev.kobj, KOBJ_CHANGE);
return 0;
}
@@ -923,6 +924,7 @@ int typec_plug_set_num_altmodes(struct typec_plug *plug, int num_altmodes)
return ret;
sysfs_notify(&plug->dev.kobj, NULL, "number_of_alternate_modes");
+ kobject_uevent(&plug->dev.kobj, KOBJ_CHANGE);
return 0;
}
--
2.29.2.729.g45daf8777d-goog
On Wed, Jan 06, 2021 at 07:49:04PM -0800, Prashant Malani wrote:
> Generate a change uevent when the "number_of_alternate_modes" sysfs file
> for partners and plugs is updated by a port driver.
>
> Cc: Heikki Krogerus <[email protected]>
> Cc: Benson Leung <[email protected]>
> Signed-off-by: Prashant Malani <[email protected]>
> ---
> drivers/usb/typec/class.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> index ebfd3113a9a8..8f77669f9cf4 100644
> --- a/drivers/usb/typec/class.c
> +++ b/drivers/usb/typec/class.c
> @@ -766,6 +766,7 @@ int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmod
> return ret;
>
> sysfs_notify(&partner->dev.kobj, NULL, "number_of_alternate_modes");
> + kobject_uevent(&partner->dev.kobj, KOBJ_CHANGE);
Shouldn't the sysfs_notify() handle the "something has changed" logic
good enough for userspace, as obviously someone is polling on the thing
(otherwise we wouldn't be calling sysfs_notify...)
The kobject itself hasn't "changed", but rather an individual attribute
has changed. We don't want to create uevents for every individual sysfs
attribute changing values, do we?
What is preventing a normal "monitor the sysfs file" logic from working
here for anyone who wants to know that the alternate modes have changed?
thanks,
greg k-h
Hi Greg,
Thanks for taking a look at the patch.
On Thu, Jan 7, 2021 at 1:16 AM Greg KH <[email protected]> wrote:
>
> On Wed, Jan 06, 2021 at 07:49:04PM -0800, Prashant Malani wrote:
> > Generate a change uevent when the "number_of_alternate_modes" sysfs file
> > for partners and plugs is updated by a port driver.
> >
> > Cc: Heikki Krogerus <[email protected]>
> > Cc: Benson Leung <[email protected]>
> > Signed-off-by: Prashant Malani <[email protected]>
> > ---
> > drivers/usb/typec/class.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> > index ebfd3113a9a8..8f77669f9cf4 100644
> > --- a/drivers/usb/typec/class.c
> > +++ b/drivers/usb/typec/class.c
> > @@ -766,6 +766,7 @@ int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmod
> > return ret;
> >
> > sysfs_notify(&partner->dev.kobj, NULL, "number_of_alternate_modes");
> > + kobject_uevent(&partner->dev.kobj, KOBJ_CHANGE);
>
> Shouldn't the sysfs_notify() handle the "something has changed" logic
> good enough for userspace, as obviously someone is polling on the thing
> (otherwise we wouldn't be calling sysfs_notify...)
>
> The kobject itself hasn't "changed", but rather an individual attribute
> has changed. We don't want to create uevents for every individual sysfs
> attribute changing values, do we?
Fair point. I noticed other attributes in this source file use a
similar approach (sysfs_notify + kobject_uevent)
and took guidance from there in an attempt to remain consistent
(though, of course, your point still stands).
I'm guessing it is for processes that rely on udev events
(subsystem=typec) rather than polling.
>
> What is preventing a normal "monitor the sysfs file" logic from working
> here for anyone who wants to know that the alternate modes have changed?
One limitation I can think of is that this sysfs file is hidden till
it has a valid value (i.e >= 0), so a user-space process might not
be able to poll on the file till it is visible (I suppose even then
one could poll on the parent).
Kindly disregard the patch if you reckon it is unnecessary.
Best regards,
-Prashant
On Thu, Jan 07, 2021 at 01:50:53AM -0800, Prashant Malani wrote:
> Hi Greg,
>
> Thanks for taking a look at the patch.
>
> On Thu, Jan 7, 2021 at 1:16 AM Greg KH <[email protected]> wrote:
> >
> > On Wed, Jan 06, 2021 at 07:49:04PM -0800, Prashant Malani wrote:
> > > Generate a change uevent when the "number_of_alternate_modes" sysfs file
> > > for partners and plugs is updated by a port driver.
> > >
> > > Cc: Heikki Krogerus <[email protected]>
> > > Cc: Benson Leung <[email protected]>
> > > Signed-off-by: Prashant Malani <[email protected]>
> > > ---
> > > drivers/usb/typec/class.c | 2 ++
> > > 1 file changed, 2 insertions(+)
> > >
> > > diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> > > index ebfd3113a9a8..8f77669f9cf4 100644
> > > --- a/drivers/usb/typec/class.c
> > > +++ b/drivers/usb/typec/class.c
> > > @@ -766,6 +766,7 @@ int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmod
> > > return ret;
> > >
> > > sysfs_notify(&partner->dev.kobj, NULL, "number_of_alternate_modes");
> > > + kobject_uevent(&partner->dev.kobj, KOBJ_CHANGE);
> >
> > Shouldn't the sysfs_notify() handle the "something has changed" logic
> > good enough for userspace, as obviously someone is polling on the thing
> > (otherwise we wouldn't be calling sysfs_notify...)
> >
> > The kobject itself hasn't "changed", but rather an individual attribute
> > has changed. We don't want to create uevents for every individual sysfs
> > attribute changing values, do we?
>
> Fair point. I noticed other attributes in this source file use a
> similar approach (sysfs_notify + kobject_uevent)
> and took guidance from there in an attempt to remain consistent
> (though, of course, your point still stands).
>
> I'm guessing it is for processes that rely on udev events
> (subsystem=typec) rather than polling.
>
> >
> > What is preventing a normal "monitor the sysfs file" logic from working
> > here for anyone who wants to know that the alternate modes have changed?
>
> One limitation I can think of is that this sysfs file is hidden till
> it has a valid value (i.e >= 0), so a user-space process might not
> be able to poll on the file till it is visible (I suppose even then
> one could poll on the parent).
If the file is being added at this point in time, then yes, it is ok to
send a KOBJ_CHANGE event as that is needed. Is that what is happening
here?
thanks,
greg k-h
On Thu, Jan 07, 2021 at 11:57:08AM +0100, Greg KH wrote:
> On Thu, Jan 07, 2021 at 01:50:53AM -0800, Prashant Malani wrote:
> > Hi Greg,
> >
> > Thanks for taking a look at the patch.
> >
> > On Thu, Jan 7, 2021 at 1:16 AM Greg KH <[email protected]> wrote:
> > >
> > > On Wed, Jan 06, 2021 at 07:49:04PM -0800, Prashant Malani wrote:
> > > > Generate a change uevent when the "number_of_alternate_modes" sysfs file
> > > > for partners and plugs is updated by a port driver.
> > > >
> > > > Cc: Heikki Krogerus <[email protected]>
> > > > Cc: Benson Leung <[email protected]>
> > > > Signed-off-by: Prashant Malani <[email protected]>
> > > > ---
> > > > drivers/usb/typec/class.c | 2 ++
> > > > 1 file changed, 2 insertions(+)
> > > >
> > > > diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> > > > index ebfd3113a9a8..8f77669f9cf4 100644
> > > > --- a/drivers/usb/typec/class.c
> > > > +++ b/drivers/usb/typec/class.c
> > > > @@ -766,6 +766,7 @@ int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmod
> > > > return ret;
> > > >
> > > > sysfs_notify(&partner->dev.kobj, NULL, "number_of_alternate_modes");
> > > > + kobject_uevent(&partner->dev.kobj, KOBJ_CHANGE);
> > >
> > > Shouldn't the sysfs_notify() handle the "something has changed" logic
> > > good enough for userspace, as obviously someone is polling on the thing
> > > (otherwise we wouldn't be calling sysfs_notify...)
> > >
> > > The kobject itself hasn't "changed", but rather an individual attribute
> > > has changed. We don't want to create uevents for every individual sysfs
> > > attribute changing values, do we?
> >
> > Fair point. I noticed other attributes in this source file use a
> > similar approach (sysfs_notify + kobject_uevent)
> > and took guidance from there in an attempt to remain consistent
> > (though, of course, your point still stands).
> >
> > I'm guessing it is for processes that rely on udev events
> > (subsystem=typec) rather than polling.
> >
> > >
> > > What is preventing a normal "monitor the sysfs file" logic from working
> > > here for anyone who wants to know that the alternate modes have changed?
> >
> > One limitation I can think of is that this sysfs file is hidden till
> > it has a valid value (i.e >= 0), so a user-space process might not
> > be able to poll on the file till it is visible (I suppose even then
> > one could poll on the parent).
>
> If the file is being added at this point in time, then yes, it is ok to
> send a KOBJ_CHANGE event as that is needed. Is that what is happening
> here?
In looking at the code more, yes, you are right, I'll go queue this up
now, thanks.
greg k-h
In cleaning up the printf %hh's I have found a number of files
that explicitly do a
#define DEBUG
with no comments or surrounding #ifdef CONFIG_MY_DEBUG_FEATURE/#endif
If I saw this in a review, I would assume this was leftover devel code and nak the review.
Finding and removing are pretty trival, i believe there are only around 10.
I am bringing this up because if the existing code depends on the DEBUG,
ex/ getting lucking with timing, then the change would introduce problems.
Tom