When loading module manually, after call xenbus_switch_state to initializes
the state of the netfront device, the driver state did not change so fast
that may lead no dev created in latest kernel. This patch adds wait to make
sure xenbus knows the driver is not in closed/unknown state.
Current state:
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
[vm]# modprobe -r xen_netfront
[vm]# modprobe xen_netfront
[vm]# ethtool eth0
Settings for eth0:
Cannot get device settings: No such device
Cannot get wake-on-lan settings: No such device
Cannot get message level: No such device
Cannot get link status: No such device
No data available
With the patch installed.
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
[vm]# modprobe -r xen_netfront
[vm]# modprobe xen_netfront
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
Signed-off-by: Xiao Liang <redacted>
---
drivers/net/xen-netfront.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -87,6 +87,7 @@ struct netfront_cb {/* IRQ name is queue name with "-tx" or "-rx" appended */#define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3)+staticDECLARE_WAIT_QUEUE_HEAD(module_load_q);staticDECLARE_WAIT_QUEUE_HEAD(module_unload_q);structnetfront_stats{
From: Boris Ostrovsky <boris.ostrovsky@oracle.com> Date: 2018-07-27 18:40:38
On 07/27/2018 05:56 AM, Xiao Liang wrote:
quoted hunk
When loading module manually, after call xenbus_switch_state to initializes
the state of the netfront device, the driver state did not change so fast
that may lead no dev created in latest kernel. This patch adds wait to make
sure xenbus knows the driver is not in closed/unknown state.
Current state:
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
[vm]# modprobe -r xen_netfront
[vm]# modprobe xen_netfront
[vm]# ethtool eth0
Settings for eth0:
Cannot get device settings: No such device
Cannot get wake-on-lan settings: No such device
Cannot get message level: No such device
Cannot get link status: No such device
No data available
With the patch installed.
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
[vm]# modprobe -r xen_netfront
[vm]# modprobe xen_netfront
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
Signed-off-by: Xiao Liang <redacted>
---
drivers/net/xen-netfront.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -87,6 +87,7 @@ struct netfront_cb {/* IRQ name is queue name with "-tx" or "-rx" appended */#define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3)+staticDECLARE_WAIT_QUEUE_HEAD(module_load_q);staticDECLARE_WAIT_QUEUE_HEAD(module_unload_q);structnetfront_stats{
Thanks, Boris
Please see my reply inline.
On 07/28/2018 02:40 AM, Boris Ostrovsky wrote:
On 07/27/2018 05:56 AM, Xiao Liang wrote:
quoted
When loading module manually, after call xenbus_switch_state to initializes
the state of the netfront device, the driver state did not change so fast
that may lead no dev created in latest kernel. This patch adds wait to make
sure xenbus knows the driver is not in closed/unknown state.
Current state:
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
[vm]# modprobe -r xen_netfront
[vm]# modprobe xen_netfront
[vm]# ethtool eth0
Settings for eth0:
Cannot get device settings: No such device
Cannot get wake-on-lan settings: No such device
Cannot get message level: No such device
Cannot get link status: No such device
No data available
With the patch installed.
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
[vm]# modprobe -r xen_netfront
[vm]# modprobe xen_netfront
[vm]# ethtool eth0
Settings for eth0:
Link detected: yes
Signed-off-by: Xiao Liang <redacted>
---
drivers/net/xen-netfront.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -87,6 +87,7 @@ struct netfront_cb {/* IRQ name is queue name with "-tx" or "-rx" appended */#define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3)+staticDECLARE_WAIT_QUEUE_HEAD(module_load_q);staticDECLARE_WAIT_QUEUE_HEAD(module_unload_q);structnetfront_stats{
In my understanding, netback_changed handles it if dev state is in
XenbusStateInitialising and otherend is in XenbusStateInitWait, and then
create connection to backend.
But in most cases, it breaks out as dev->state not in
XenbusStateInitialising. So I added a wait here.
And what about other states --- is,
for example, XenbusStateClosing a valid reason to continue?
I think XenbusStateClosing should not be a valid reason to continue.
My purpose is waiting otherend status to be XenbusStateInitWait(after
new dev created).To avoid unnecessary impact, I only check it leaves
closed and unknow state in this patch.
In my testing, hotplug vifs from guest in host or load/unload module in
guest over 100 times, only waiting XenbusStateInitWait or as this patch
does, both are working.
vifs can be created each time successfully.
Thanks,
Xiao Liang
What performs the wakeups that will trigger for this sleep site?
In my understanding, backend leaving closed/unknow state can trigger the
wakeups. I mean to make sure both sides are ready for creating connection.
Thanks,
Liang
When loading module manually, after call xenbus_switch_state to initializes
the state of the netfront device, the driver state did not change so fast
that may lead no dev created in latest kernel. This patch adds wait to make
sure xenbus knows the driver is not in closed/unknown state.
What performs the wakeups that will trigger for this sleep site?
In my understanding, backend leaving closed/unknow state can trigger the
wakeups. I mean to make sure both sides are ready for creating connection.
While backporting this to 4.12, I was surprised by the commit the same
as Boris and David.
So I assume the explanation is that wake_up_all of module_unload_q in
netback_changed wakes also all the processes waiting on module_load_q?
If so, what makes sure that module_unload_q is queued and the process is
the same as for module_load_q?
To me, it looks rather error-prone. Unless it is erroneous now, at least
for future changes. Wouldn't it make sense to wake up module_load_q
along with module_unload_q in netback_changed? Or drop module_load_q
completely and use only module_unload_q (i.e. in xennet_create_dev too)?
thanks,
--
js
suse labs
What performs the wakeups that will trigger for this sleep site?
In my understanding, backend leaving closed/unknow state can trigger the
wakeups. I mean to make sure both sides are ready for creating connection.
While backporting this to 4.12, I was surprised by the commit the same
as Boris and David.
So I assume the explanation is that wake_up_all of module_unload_q in
netback_changed wakes also all the processes waiting on module_load_q?
If so, what makes sure that module_unload_q is queued and the process is
the same as for module_load_q?
How could it? Either the thread is waiting on module_unload_q _or_ on
module_load_q. It can't wait on two queues at the same time.
To me, it looks rather error-prone. Unless it is erroneous now, at least
for future changes. Wouldn't it make sense to wake up module_load_q
along with module_unload_q in netback_changed? Or drop module_load_q
completely and use only module_unload_q (i.e. in xennet_create_dev too)?
To me this looks just wrong. A thread waiting on module_load_q won't be
woken up again.
I'd drop module_load_q in favor of module_unload_q.
Juergen
What performs the wakeups that will trigger for this sleep site?
In my understanding, backend leaving closed/unknow state can trigger the
wakeups. I mean to make sure both sides are ready for creating connection.
While backporting this to 4.12, I was surprised by the commit the same
as Boris and David.
So I assume the explanation is that wake_up_all of module_unload_q in
netback_changed wakes also all the processes waiting on module_load_q?
If so, what makes sure that module_unload_q is queued and the process is
the same as for module_load_q?
How could it? Either the thread is waiting on module_unload_q _or_ on
module_load_q. It can't wait on two queues at the same time.
quoted
To me, it looks rather error-prone. Unless it is erroneous now, at least
for future changes. Wouldn't it make sense to wake up module_load_q
along with module_unload_q in netback_changed? Or drop module_load_q
completely and use only module_unload_q (i.e. in xennet_create_dev too)?
To me this looks just wrong. A thread waiting on module_load_q won't be
woken up again.
I'd drop module_load_q in favor of module_unload_q.
Yes, use single queue, but rename it to something more neutral. module_wq?
-boris
What performs the wakeups that will trigger for this sleep site?
In my understanding, backend leaving closed/unknow state can trigger the
wakeups. I mean to make sure both sides are ready for creating connection.
While backporting this to 4.12, I was surprised by the commit the same
as Boris and David.
So I assume the explanation is that wake_up_all of module_unload_q in
netback_changed wakes also all the processes waiting on module_load_q?
If so, what makes sure that module_unload_q is queued and the process is
the same as for module_load_q?
How could it? Either the thread is waiting on module_unload_q _or_ on
module_load_q. It can't wait on two queues at the same time.
quoted
To me, it looks rather error-prone. Unless it is erroneous now, at least
for future changes. Wouldn't it make sense to wake up module_load_q
along with module_unload_q in netback_changed? Or drop module_load_q
completely and use only module_unload_q (i.e. in xennet_create_dev too)?
To me this looks just wrong. A thread waiting on module_load_q won't be
woken up again.
I'd drop module_load_q in favor of module_unload_q.
Yes, use single queue, but rename it to something more neutral. module_wq?
Can somebody who is actually using the module fix this, please?
I could fix it, but untested changes are "a bit" worse than tested changes.
thanks,
--
js
suse labs
What performs the wakeups that will trigger for this sleep site?
In my understanding, backend leaving closed/unknow state can trigger the
wakeups. I mean to make sure both sides are ready for creating connection.
While backporting this to 4.12, I was surprised by the commit the same
as Boris and David.
So I assume the explanation is that wake_up_all of module_unload_q in
netback_changed wakes also all the processes waiting on module_load_q?
If so, what makes sure that module_unload_q is queued and the process is
the same as for module_load_q?
How could it? Either the thread is waiting on module_unload_q _or_ on
module_load_q. It can't wait on two queues at the same time.
quoted
To me, it looks rather error-prone. Unless it is erroneous now, at least
for future changes. Wouldn't it make sense to wake up module_load_q
along with module_unload_q in netback_changed? Or drop module_load_q
completely and use only module_unload_q (i.e. in xennet_create_dev too)?
To me this looks just wrong. A thread waiting on module_load_q won't be
woken up again.
I'd drop module_load_q in favor of module_unload_q.
Yes, use single queue, but rename it to something more neutral. module_wq?
Can somebody who is actually using the module fix this, please?