* [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
@ 2021-02-26 9:16 Ricky Niu
2021-02-26 9:24 ` Greg KH
2021-02-26 9:31 ` Greg KH
0 siblings, 2 replies; 7+ messages in thread
From: Ricky Niu @ 2021-02-26 9:16 UTC (permalink / raw)
To: gregkh, stern, erosca, gustavoars, a.darwish, rickyniu, oneukum,
kyletso
Cc: linux-usb, linux-kernel
When the topology of the nested hubs are over 6 layers
Send uevent to user space when USB TOPO layer over 6.
Let end user more understand what happened.
Signed-off-by: Ricky Niu <rickyniu@google.com>
---
drivers/usb/core/hub.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 7f71218cc1e5..e5e924526822 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -55,6 +55,10 @@ static DEFINE_SPINLOCK(device_state_lock);
static struct workqueue_struct *hub_wq;
static void hub_event(struct work_struct *work);
+/* struct to notify userspace of hub events */
+static struct class *hub_class;
+static struct device *hub_device;
+
/* synchronize hub-port add/remove and peering operations */
DEFINE_MUTEX(usb_port_peer_mutex);
@@ -1764,6 +1768,13 @@ static bool hub_descriptor_is_sane(struct usb_host_interface *desc)
return true;
}
+static void hub_over_tier(void)
+{
+ char *envp[2] = { "HUB=OVERTIER", NULL };
+
+ kobject_uevent_env(&hub_device->kobj, KOBJ_CHANGE, envp);
+}
+
static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
struct usb_host_interface *desc;
@@ -1831,6 +1842,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
if (hdev->level == MAX_TOPO_LEVEL) {
dev_err(&intf->dev,
"Unsupported bus topology: hub nested too deep\n");
+ hub_over_tier();
return -E2BIG;
}
@@ -5680,6 +5692,13 @@ int usb_hub_init(void)
return -1;
}
+ hub_class = class_create(THIS_MODULE, "usb_hub");
+ if (IS_ERR(hub_class))
+ return PTR_ERR(hub_class);
+
+ hub_device =
+ device_create(hub_class, NULL, MKDEV(0, 0), NULL, "usb_hub");
+
/*
* The workqueue needs to be freezable to avoid interfering with
* USB-PERSIST port handover. Otherwise it might see that a full-speed
@@ -5699,6 +5718,9 @@ int usb_hub_init(void)
void usb_hub_cleanup(void)
{
+ if (!IS_ERR(hub_class))
+ class_destroy(hub_class);
+
destroy_workqueue(hub_wq);
/*
--
2.30.1.766.gb4fecdf3b7-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
2021-02-26 9:16 [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6 Ricky Niu
@ 2021-02-26 9:24 ` Greg KH
2021-02-26 9:31 ` Greg KH
1 sibling, 0 replies; 7+ messages in thread
From: Greg KH @ 2021-02-26 9:24 UTC (permalink / raw)
To: Ricky Niu
Cc: stern, erosca, gustavoars, a.darwish, oneukum, kyletso, linux-usb,
linux-kernel
On Fri, Feb 26, 2021 at 05:16:12PM +0800, Ricky Niu wrote:
> When the topology of the nested hubs are over 6 layers
> Send uevent to user space when USB TOPO layer over 6.
> Let end user more understand what happened.
>
> Signed-off-by: Ricky Niu <rickyniu@google.com>
> ---
> drivers/usb/core/hub.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index 7f71218cc1e5..e5e924526822 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -55,6 +55,10 @@ static DEFINE_SPINLOCK(device_state_lock);
> static struct workqueue_struct *hub_wq;
> static void hub_event(struct work_struct *work);
>
> +/* struct to notify userspace of hub events */
> +static struct class *hub_class;
> +static struct device *hub_device;
> +
> /* synchronize hub-port add/remove and peering operations */
> DEFINE_MUTEX(usb_port_peer_mutex);
>
> @@ -1764,6 +1768,13 @@ static bool hub_descriptor_is_sane(struct usb_host_interface *desc)
> return true;
> }
>
> +static void hub_over_tier(void)
> +{
> + char *envp[2] = { "HUB=OVERTIER", NULL };
> +
> + kobject_uevent_env(&hub_device->kobj, KOBJ_CHANGE, envp);
Where have you now documented this odd uevent that is never sent by
anything else?
What tool will "catch" this? Where is that code located at?
uevents are not for stuff like this, you are trying to send "error
conditions" to userspace, please use the "proper" interfaces like this
and not abuse existing ones.
> +}
> +
> static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
> {
> struct usb_host_interface *desc;
> @@ -1831,6 +1842,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
> if (hdev->level == MAX_TOPO_LEVEL) {
> dev_err(&intf->dev,
> "Unsupported bus topology: hub nested too deep\n");
> + hub_over_tier();
> return -E2BIG;
> }
>
> @@ -5680,6 +5692,13 @@ int usb_hub_init(void)
> return -1;
> }
>
> + hub_class = class_create(THIS_MODULE, "usb_hub");
> + if (IS_ERR(hub_class))
> + return PTR_ERR(hub_class);
> +
> + hub_device =
> + device_create(hub_class, NULL, MKDEV(0, 0), NULL, "usb_hub");
You just created a whole new sysfs class with no Documentation/ABI/
update?
{sigh}
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
2021-02-26 9:16 [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6 Ricky Niu
2021-02-26 9:24 ` Greg KH
@ 2021-02-26 9:31 ` Greg KH
2021-03-03 9:03 ` Chien Kun Niu
1 sibling, 1 reply; 7+ messages in thread
From: Greg KH @ 2021-02-26 9:31 UTC (permalink / raw)
To: Ricky Niu
Cc: stern, erosca, gustavoars, a.darwish, oneukum, kyletso, linux-usb,
linux-kernel
On Fri, Feb 26, 2021 at 05:16:12PM +0800, Ricky Niu wrote:
> When the topology of the nested hubs are over 6 layers
> Send uevent to user space when USB TOPO layer over 6.
> Let end user more understand what happened.
>
> Signed-off-by: Ricky Niu <rickyniu@google.com>
> ---
> drivers/usb/core/hub.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index 7f71218cc1e5..e5e924526822 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -55,6 +55,10 @@ static DEFINE_SPINLOCK(device_state_lock);
> static struct workqueue_struct *hub_wq;
> static void hub_event(struct work_struct *work);
>
> +/* struct to notify userspace of hub events */
> +static struct class *hub_class;
> +static struct device *hub_device;
Wait, how did you even test this code? This will not work if you have
more than one hub in the system at a single time, right?
That's going to be really rough, given here's the output of just my
desktop system, count the number of hubs in it:rdevmgmt.msc
$ lsusb -t
/: Bus 10.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
/: Bus 09.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
|__ Port 5: Dev 2, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 5: Dev 2, If 1, Class=Wireless, Driver=btusb, 12M
|__ Port 6: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
/: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=uas, 10000M
/: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 4, If 0, Class=Hub, Driver=hub/2p, 12M
|__ Port 2: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 5, If 2, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 5: Dev 3, If 3, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 3, If 1, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 3, If 6, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 3, If 4, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 3, If 2, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 3, If 0, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 5: Dev 3, If 7, Class=Human Interface Device, Driver=usbhid, 480M
|__ Port 5: Dev 3, If 5, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 6: Dev 6, If 0, Class=Human Interface Device, Driver=usbhid, 12M
/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M/x2
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
|__ Port 1: Dev 11, If 0, Class=Hub, Driver=hub/3p, 5000M
|__ Port 3: Dev 12, If 0, Class=Hub, Driver=hub/3p, 5000M
|__ Port 1: Dev 13, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
|__ Port 1: Dev 14, If 0, Class=Hub, Driver=hub/3p, 480M
|__ Port 3: Dev 15, If 0, Class=Hub, Driver=hub/3p, 480M
|__ Port 2: Dev 17, If 0, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 3: Dev 18, If 3, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 3: Dev 18, If 1, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 3: Dev 18, If 2, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 3: Dev 18, If 0, Class=Audio, Driver=snd-usb-audio, 12M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
So, proof that this works? How did you test this?
Also, you have a memory leak in this submission :(
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
2021-02-26 9:31 ` Greg KH
@ 2021-03-03 9:03 ` Chien Kun Niu
2021-03-03 9:09 ` Greg KH
0 siblings, 1 reply; 7+ messages in thread
From: Chien Kun Niu @ 2021-03-03 9:03 UTC (permalink / raw)
To: Greg KH
Cc: stern, erosca, gustavoars, a.darwish, oneukum, Kyle Tso,
linux-usb, linux-kernel, James Wei
Hi , Greg
What tool will "catch" this? Where is that code located at?
=> I prepare merge the code to Android phone , so I used Android HLOS
to catch this uevent.
uevents are not for stuff like this, you are trying to send "error
conditions" to userspace, please use the "proper" interfaces like this
and not abuse existing ones.
=> Sorry , I am not sure what is the "proper" interfaces your mean.
Could you please give me more description?
You just created a whole new sysfs class with no Documentation/ABI/
update?
=> Yes, I will add it.
Wait, how did you even test this code? This will not work if you have
more than one hub in the system at a single time, right?
=> I build the test build which flash in Android phone and connect
several hubs to try it.
When the new hub which met MAX_TOPO_LEVEL connected , it sent
notify to user space.
Phone ------↓
hub ------↓
hub ------↓
...------↓
hub
if (hdev->level == MAX_TOPO_LEVEL) {
dev_err(&intf->dev,
"Unsupported bus topology: hub nested too deep\n");
hub_over_tier();
return -E2BIG;
}
So, proof that this works? How did you test this?
=> I use the Pixel phone to verify the code , the framework received
the uevent when the last connected hub over "MAX_TOPO_LEVEL".
Also, you have a memory leak in this submission :(
=> Do you mean I should add device_destroy here ?
hub_device =
device_create(hub_class, NULL, MKDEV(0, 0), NULL, "usb_hub");
+if (IS_ERR(hub_device))
+ return PTR_ERR(hub_device);
void usb_hub_cleanup(void)
{
+if (!IS_ERR(hub_device))
+device_destroy(hub_class, hub_device->devt);
if (!IS_ERR(hub_class))
class_destroy(hub_class);
Best Regards,
Chien Kun Niu
rickyniu@google.com
Chien Kun Niu
SSD USB
rickyniu@google.com
02 8729 0651
Greg KH <gregkh@linuxfoundation.org> 於 2021年2月26日 週五 下午5:31寫道:
>
> On Fri, Feb 26, 2021 at 05:16:12PM +0800, Ricky Niu wrote:
> > When the topology of the nested hubs are over 6 layers
> > Send uevent to user space when USB TOPO layer over 6.
> > Let end user more understand what happened.
> >
> > Signed-off-by: Ricky Niu <rickyniu@google.com>
> > ---
> > drivers/usb/core/hub.c | 22 ++++++++++++++++++++++
> > 1 file changed, 22 insertions(+)
> >
> > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> > index 7f71218cc1e5..e5e924526822 100644
> > --- a/drivers/usb/core/hub.c
> > +++ b/drivers/usb/core/hub.c
> > @@ -55,6 +55,10 @@ static DEFINE_SPINLOCK(device_state_lock);
> > static struct workqueue_struct *hub_wq;
> > static void hub_event(struct work_struct *work);
> >
> > +/* struct to notify userspace of hub events */
> > +static struct class *hub_class;
> > +static struct device *hub_device;
>
> Wait, how did you even test this code? This will not work if you have
> more than one hub in the system at a single time, right?
>
> That's going to be really rough, given here's the output of just my
> desktop system, count the number of hubs in it:rdevmgmt.msc
>
> $ lsusb -t
> /: Bus 10.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
> /: Bus 09.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
> |__ Port 5: Dev 2, If 0, Class=Wireless, Driver=btusb, 12M
> |__ Port 5: Dev 2, If 1, Class=Wireless, Driver=btusb, 12M
> |__ Port 6: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
> /: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
> |__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
> |__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=uas, 10000M
> /: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
> |__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
> |__ Port 2: Dev 4, If 0, Class=Hub, Driver=hub/2p, 12M
> |__ Port 2: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
> |__ Port 2: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
> |__ Port 2: Dev 5, If 2, Class=Human Interface Device, Driver=usbhid, 12M
> |__ Port 5: Dev 3, If 3, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 5: Dev 3, If 1, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 5: Dev 3, If 6, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 5: Dev 3, If 4, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 5: Dev 3, If 2, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 5: Dev 3, If 0, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 5: Dev 3, If 7, Class=Human Interface Device, Driver=usbhid, 480M
> |__ Port 5: Dev 3, If 5, Class=Audio, Driver=snd-usb-audio, 480M
> |__ Port 6: Dev 6, If 0, Class=Human Interface Device, Driver=usbhid, 12M
> /: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M/x2
> /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
> /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
> |__ Port 1: Dev 11, If 0, Class=Hub, Driver=hub/3p, 5000M
> |__ Port 3: Dev 12, If 0, Class=Hub, Driver=hub/3p, 5000M
> |__ Port 1: Dev 13, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
> /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
> |__ Port 1: Dev 14, If 0, Class=Hub, Driver=hub/3p, 480M
> |__ Port 3: Dev 15, If 0, Class=Hub, Driver=hub/3p, 480M
> |__ Port 2: Dev 17, If 0, Class=Human Interface Device, Driver=usbhid, 12M
> |__ Port 3: Dev 18, If 3, Class=Human Interface Device, Driver=usbhid, 12M
> |__ Port 3: Dev 18, If 1, Class=Audio, Driver=snd-usb-audio, 12M
> |__ Port 3: Dev 18, If 2, Class=Audio, Driver=snd-usb-audio, 12M
> |__ Port 3: Dev 18, If 0, Class=Audio, Driver=snd-usb-audio, 12M
> /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
> /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
>
>
> So, proof that this works? How did you test this?
>
> Also, you have a memory leak in this submission :(
>
> greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
2021-03-03 9:03 ` Chien Kun Niu
@ 2021-03-03 9:09 ` Greg KH
2021-03-05 7:17 ` Chien Kun Niu
0 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2021-03-03 9:09 UTC (permalink / raw)
To: Chien Kun Niu
Cc: stern, erosca, gustavoars, a.darwish, oneukum, Kyle Tso,
linux-usb, linux-kernel, James Wei
On Wed, Mar 03, 2021 at 05:03:25PM +0800, Chien Kun Niu wrote:
> Hi , Greg
>
> What tool will "catch" this? Where is that code located at?
> => I prepare merge the code to Android phone , so I used Android HLOS
> to catch this uevent.
Very odd quoting style, perhaps you might want to read up on how to do
this properly at:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
> uevents are not for stuff like this, you are trying to send "error
> conditions" to userspace, please use the "proper" interfaces like this
> and not abuse existing ones.
> => Sorry , I am not sure what is the "proper" interfaces your mean.
> Could you please give me more description?
How does the kernel normally send error conditions that it detects in
hardware to userspace?
> You just created a whole new sysfs class with no Documentation/ABI/
> update?
> => Yes, I will add it.
>
> Wait, how did you even test this code? This will not work if you have
> more than one hub in the system at a single time, right?
> => I build the test build which flash in Android phone and connect
> several hubs to try it.
> When the new hub which met MAX_TOPO_LEVEL connected , it sent
> notify to user space.
>
> Phone ------↓
> hub ------↓
> hub ------↓
> ...------↓
> hub
>
> if (hdev->level == MAX_TOPO_LEVEL) {
> dev_err(&intf->dev,
> "Unsupported bus topology: hub nested too deep\n");
> hub_over_tier();
> return -E2BIG;
> }
>
But you only have a single hub variable, and a huge memory leak, did you
not detect that in your testing?
> So, proof that this works? How did you test this?
> => I use the Pixel phone to verify the code , the framework received
> the uevent when the last connected hub over "MAX_TOPO_LEVEL".
Try it on a desktop as well, with many hubs and see what happens :(
> Also, you have a memory leak in this submission :(
> => Do you mean I should add device_destroy here ?
What do you think should be done?
>
> hub_device =
> device_create(hub_class, NULL, MKDEV(0, 0), NULL, "usb_hub");
> +if (IS_ERR(hub_device))
> + return PTR_ERR(hub_device);
>
> void usb_hub_cleanup(void)
> {
> +if (!IS_ERR(hub_device))
> +device_destroy(hub_class, hub_device->devt);
>
> if (!IS_ERR(hub_class))
> class_destroy(hub_class);
I don't think you are understanding that you can have multiple hubs in
the system at the same time :(
thanks,
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
2021-03-03 9:09 ` Greg KH
@ 2021-03-05 7:17 ` Chien Kun Niu
2021-03-05 7:37 ` Greg KH
0 siblings, 1 reply; 7+ messages in thread
From: Chien Kun Niu @ 2021-03-05 7:17 UTC (permalink / raw)
To: Greg KH
Cc: stern, erosca, gustavoars, a.darwish, oneukum, Kyle Tso,
linux-usb, linux-kernel, James Wei
Greg KH <gregkh@linuxfoundation.org> 於 2021年3月3日 週三 下午5:10寫道:
>
> On Wed, Mar 03, 2021 at 05:03:25PM +0800, Chien Kun Niu wrote:
> > Hi , Greg
> >
> > What tool will "catch" this? Where is that code located at?
> > => I prepare merge the code to Android phone , so I used Android HLOS
> > to catch this uevent.
>
> Very odd quoting style, perhaps you might want to read up on how to do
> this properly at:
> https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
>
> > uevents are not for stuff like this, you are trying to send "error
> > conditions" to userspace, please use the "proper" interfaces like this
> > and not abuse existing ones.
> > => Sorry , I am not sure what is the "proper" interfaces your mean.
> > Could you please give me more description?
>
> How does the kernel normally send error conditions that it detects in
> hardware to userspace?
>
I will create a sysfs attribute to record the hub status.
If there is a new hub with over 6 USB TOPO layer connected, I will use
the sysfs_notify to send the "error conditions" to userspace.
Is it a proper interfaces to delivery "error conditions"?
> > You just created a whole new sysfs class with no Documentation/ABI/
> > update?
> > => Yes, I will add it.
> >
> > Wait, how did you even test this code? This will not work if you have
> > more than one hub in the system at a single time, right?
> > => I build the test build which flash in Android phone and connect
> > several hubs to try it.
> > When the new hub which met MAX_TOPO_LEVEL connected , it sent
> > notify to user space.
> >
> > Phone ------↓
> > hub ------↓
> > hub ------↓
> > ...------↓
> > hub
> >
> > if (hdev->level == MAX_TOPO_LEVEL) {
> > dev_err(&intf->dev,
> > "Unsupported bus topology: hub nested too deep\n");
> > hub_over_tier();
> > return -E2BIG;
> > }
> >
>
> But you only have a single hub variable, and a huge memory leak, did you
> not detect that in your testing?
>
> > So, proof that this works? How did you test this?
> > => I use the Pixel phone to verify the code , the framework received
> > the uevent when the last connected hub over "MAX_TOPO_LEVEL".
>
> Try it on a desktop as well, with many hubs and see what happens :(
>
> > Also, you have a memory leak in this submission :(
> > => Do you mean I should add device_destroy here ?
>
> What do you think should be done?
>
> >
> > hub_device =
> > device_create(hub_class, NULL, MKDEV(0, 0), NULL, "usb_hub");
> > +if (IS_ERR(hub_device))
> > + return PTR_ERR(hub_device);
> >
> > void usb_hub_cleanup(void)
> > {
> > +if (!IS_ERR(hub_device))
> > +device_destroy(hub_class, hub_device->devt);
> >
> > if (!IS_ERR(hub_class))
> > class_destroy(hub_class);
>
> I don't think you are understanding that you can have multiple hubs in
> the system at the same time :(
>
> thanks,
>
> greg k-h
Thanks,
Chien Kun Niu
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6
2021-03-05 7:17 ` Chien Kun Niu
@ 2021-03-05 7:37 ` Greg KH
0 siblings, 0 replies; 7+ messages in thread
From: Greg KH @ 2021-03-05 7:37 UTC (permalink / raw)
To: Chien Kun Niu
Cc: stern, erosca, gustavoars, a.darwish, oneukum, Kyle Tso,
linux-usb, linux-kernel, James Wei
On Fri, Mar 05, 2021 at 03:17:37PM +0800, Chien Kun Niu wrote:
> Greg KH <gregkh@linuxfoundation.org> 於 2021年3月3日 週三 下午5:10寫道:
> >
> > On Wed, Mar 03, 2021 at 05:03:25PM +0800, Chien Kun Niu wrote:
> > > Hi , Greg
> > >
> > > What tool will "catch" this? Where is that code located at?
> > > => I prepare merge the code to Android phone , so I used Android HLOS
> > > to catch this uevent.
> >
> > Very odd quoting style, perhaps you might want to read up on how to do
> > this properly at:
> > https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
> >
> > > uevents are not for stuff like this, you are trying to send "error
> > > conditions" to userspace, please use the "proper" interfaces like this
> > > and not abuse existing ones.
> > > => Sorry , I am not sure what is the "proper" interfaces your mean.
> > > Could you please give me more description?
> >
> > How does the kernel normally send error conditions that it detects in
> > hardware to userspace?
> >
>
> I will create a sysfs attribute to record the hub status.
> If there is a new hub with over 6 USB TOPO layer connected, I will use
> the sysfs_notify to send the "error conditions" to userspace.
> Is it a proper interfaces to delivery "error conditions"?
Maybe, it all depends on what you are wanting to show here. Try it out
and see, it's easier to review patches that you have shown work properly
for your use case than it is to try to discuss general issues.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-03-05 7:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-02-26 9:16 [PATCH] ANDROID: usb: core: Send uevent when USB TOPO layer over 6 Ricky Niu
2021-02-26 9:24 ` Greg KH
2021-02-26 9:31 ` Greg KH
2021-03-03 9:03 ` Chien Kun Niu
2021-03-03 9:09 ` Greg KH
2021-03-05 7:17 ` Chien Kun Niu
2021-03-05 7:37 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).