All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xen-netfront: wait xenbus state change when load module manually
@ 2018-07-27  9:56 Xiao Liang
  2018-07-27 18:40 ` Boris Ostrovsky
                   ` (5 more replies)
  0 siblings, 6 replies; 22+ messages in thread
From: Xiao Liang @ 2018-07-27  9:56 UTC (permalink / raw)
  To: netdev, xen-devel, davem, jgross, boris.ostrovsky
  Cc: linux-kernel, Xiao 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.

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 <xiliang@redhat.com>
---
 drivers/net/xen-netfront.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index a57daecf1d57..2d8812dd1534 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -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)
 
+static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
 static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
 
 struct netfront_stats {
@@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
 	netif_carrier_off(netdev);
 
 	xenbus_switch_state(dev, XenbusStateInitialising);
+	wait_event(module_load_q,
+			   xenbus_read_driver_state(dev->otherend) !=
+			   XenbusStateClosed &&
+			   xenbus_read_driver_state(dev->otherend) !=
+			   XenbusStateUnknown);
 	return netdev;
 
  exit:
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
@ 2018-07-27 18:40 ` Boris Ostrovsky
  2018-07-30  7:43   ` Xiao Liang
  2018-07-30  7:43   ` [Xen-devel] " Xiao Liang
  2018-07-27 18:40 ` Boris Ostrovsky
                   ` (4 subsequent siblings)
  5 siblings, 2 replies; 22+ messages in thread
From: Boris Ostrovsky @ 2018-07-27 18:40 UTC (permalink / raw)
  To: Xiao Liang, netdev, xen-devel, davem, jgross; +Cc: linux-kernel

On 07/27/2018 05:56 AM, Xiao Liang wrote:
> 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 <xiliang@redhat.com>
> ---
>  drivers/net/xen-netfront.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
> index a57daecf1d57..2d8812dd1534 100644
> --- a/drivers/net/xen-netfront.c
> +++ b/drivers/net/xen-netfront.c
> @@ -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)
>  
> +static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
>  static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
>  
>  struct netfront_stats {
> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>  	netif_carrier_off(netdev);
>  
>  	xenbus_switch_state(dev, XenbusStateInitialising);
> +	wait_event(module_load_q,
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateClosed &&
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateUnknown);
>  	return netdev;
>  
>   exit:


Should we have a wake_up somewhere? And what about other states --- is,
for example, XenbusStateClosing a valid reason to continue?


-boris


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
  2018-07-27 18:40 ` Boris Ostrovsky
@ 2018-07-27 18:40 ` Boris Ostrovsky
  2018-07-29 15:30 ` David Miller
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 22+ messages in thread
From: Boris Ostrovsky @ 2018-07-27 18:40 UTC (permalink / raw)
  To: Xiao Liang, netdev, xen-devel, davem, jgross; +Cc: linux-kernel

On 07/27/2018 05:56 AM, Xiao Liang wrote:
> 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 <xiliang@redhat.com>
> ---
>  drivers/net/xen-netfront.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
> index a57daecf1d57..2d8812dd1534 100644
> --- a/drivers/net/xen-netfront.c
> +++ b/drivers/net/xen-netfront.c
> @@ -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)
>  
> +static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
>  static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
>  
>  struct netfront_stats {
> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>  	netif_carrier_off(netdev);
>  
>  	xenbus_switch_state(dev, XenbusStateInitialising);
> +	wait_event(module_load_q,
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateClosed &&
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateUnknown);
>  	return netdev;
>  
>   exit:


Should we have a wake_up somewhere? And what about other states --- is,
for example, XenbusStateClosing a valid reason to continue?


-boris


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
                   ` (2 preceding siblings ...)
  2018-07-29 15:30 ` David Miller
@ 2018-07-29 15:30 ` David Miller
  2018-07-30  8:18   ` [Xen-devel] " Xiao Liang
  2018-07-30  8:18   ` Xiao Liang
  2018-07-30 16:41 ` David Miller
  2018-07-30 16:41 ` David Miller
  5 siblings, 2 replies; 22+ messages in thread
From: David Miller @ 2018-07-29 15:30 UTC (permalink / raw)
  To: xiliang; +Cc: netdev, xen-devel, jgross, boris.ostrovsky, linux-kernel

From: Xiao Liang <xiliang@redhat.com>
Date: Fri, 27 Jul 2018 17:56:08 +0800

> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>  	netif_carrier_off(netdev);
>  
>  	xenbus_switch_state(dev, XenbusStateInitialising);
> +	wait_event(module_load_q,
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateClosed &&
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateUnknown);
>  	return netdev;
>  
>   exit:

What performs the wakeups that will trigger for this sleep site?

Thank you.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
  2018-07-27 18:40 ` Boris Ostrovsky
  2018-07-27 18:40 ` Boris Ostrovsky
@ 2018-07-29 15:30 ` David Miller
  2018-07-29 15:30 ` David Miller
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 22+ messages in thread
From: David Miller @ 2018-07-29 15:30 UTC (permalink / raw)
  To: xiliang; +Cc: jgross, netdev, boris.ostrovsky, linux-kernel, xen-devel

From: Xiao Liang <xiliang@redhat.com>
Date: Fri, 27 Jul 2018 17:56:08 +0800

> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>  	netif_carrier_off(netdev);
>  
>  	xenbus_switch_state(dev, XenbusStateInitialising);
> +	wait_event(module_load_q,
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateClosed &&
> +			   xenbus_read_driver_state(dev->otherend) !=
> +			   XenbusStateUnknown);
>  	return netdev;
>  
>   exit:

What performs the wakeups that will trigger for this sleep site?

Thank you.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27 18:40 ` Boris Ostrovsky
  2018-07-30  7:43   ` Xiao Liang
@ 2018-07-30  7:43   ` Xiao Liang
  1 sibling, 0 replies; 22+ messages in thread
From: Xiao Liang @ 2018-07-30  7:43 UTC (permalink / raw)
  To: Boris Ostrovsky, netdev, xen-devel, davem, jgross; +Cc: linux-kernel

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:
>> 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 <xiliang@redhat.com>
>> ---
>>   drivers/net/xen-netfront.c | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
>> index a57daecf1d57..2d8812dd1534 100644
>> --- a/drivers/net/xen-netfront.c
>> +++ b/drivers/net/xen-netfront.c
>> @@ -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)
>>   
>> +static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
>>   static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
>>   
>>   struct netfront_stats {
>> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>>   	netif_carrier_off(netdev);
>>   
>>   	xenbus_switch_state(dev, XenbusStateInitialising);
>> +	wait_event(module_load_q,
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateClosed &&
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateUnknown);
>>   	return netdev;
>>   
>>    exit:
>
> Should we have a wake_up somewhere?
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

>
>
> -boris
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27 18:40 ` Boris Ostrovsky
@ 2018-07-30  7:43   ` Xiao Liang
  2018-07-30  7:43   ` [Xen-devel] " Xiao Liang
  1 sibling, 0 replies; 22+ messages in thread
From: Xiao Liang @ 2018-07-30  7:43 UTC (permalink / raw)
  To: Boris Ostrovsky, netdev, xen-devel, davem, jgross; +Cc: linux-kernel

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:
>> 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 <xiliang@redhat.com>
>> ---
>>   drivers/net/xen-netfront.c | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
>> index a57daecf1d57..2d8812dd1534 100644
>> --- a/drivers/net/xen-netfront.c
>> +++ b/drivers/net/xen-netfront.c
>> @@ -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)
>>   
>> +static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
>>   static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
>>   
>>   struct netfront_stats {
>> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>>   	netif_carrier_off(netdev);
>>   
>>   	xenbus_switch_state(dev, XenbusStateInitialising);
>> +	wait_event(module_load_q,
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateClosed &&
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateUnknown);
>>   	return netdev;
>>   
>>    exit:
>
> Should we have a wake_up somewhere?
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

>
>
> -boris
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-29 15:30 ` David Miller
@ 2018-07-30  8:18   ` Xiao Liang
  2018-08-24 11:12     ` Jiri Slaby
  2018-08-24 11:12     ` Jiri Slaby
  2018-07-30  8:18   ` Xiao Liang
  1 sibling, 2 replies; 22+ messages in thread
From: Xiao Liang @ 2018-07-30  8:18 UTC (permalink / raw)
  To: David Miller; +Cc: jgross, netdev, boris.ostrovsky, linux-kernel, xen-devel

Thanks, David

On 07/29/2018 11:30 PM, David Miller wrote:
> From: Xiao Liang <xiliang@redhat.com>
> Date: Fri, 27 Jul 2018 17:56:08 +0800
>
>> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>>   	netif_carrier_off(netdev);
>>   
>>   	xenbus_switch_state(dev, XenbusStateInitialising);
>> +	wait_event(module_load_q,
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateClosed &&
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateUnknown);
>>   	return netdev;
>>   
>>    exit:
> 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
>
> Thank you.
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-29 15:30 ` David Miller
  2018-07-30  8:18   ` [Xen-devel] " Xiao Liang
@ 2018-07-30  8:18   ` Xiao Liang
  1 sibling, 0 replies; 22+ messages in thread
From: Xiao Liang @ 2018-07-30  8:18 UTC (permalink / raw)
  To: David Miller; +Cc: jgross, netdev, boris.ostrovsky, linux-kernel, xen-devel

Thanks, David

On 07/29/2018 11:30 PM, David Miller wrote:
> From: Xiao Liang <xiliang@redhat.com>
> Date: Fri, 27 Jul 2018 17:56:08 +0800
>
>> @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
>>   	netif_carrier_off(netdev);
>>   
>>   	xenbus_switch_state(dev, XenbusStateInitialising);
>> +	wait_event(module_load_q,
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateClosed &&
>> +			   xenbus_read_driver_state(dev->otherend) !=
>> +			   XenbusStateUnknown);
>>   	return netdev;
>>   
>>    exit:
> 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
>
> Thank you.
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
                   ` (4 preceding siblings ...)
  2018-07-30 16:41 ` David Miller
@ 2018-07-30 16:41 ` David Miller
  5 siblings, 0 replies; 22+ messages in thread
From: David Miller @ 2018-07-30 16:41 UTC (permalink / raw)
  To: xiliang; +Cc: netdev, xen-devel, jgross, boris.ostrovsky, linux-kernel

From: Xiao Liang <xiliang@redhat.com>
Date: Fri, 27 Jul 2018 17:56:08 +0800

> 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.
 ...
> Signed-off-by: Xiao Liang <xiliang@redhat.com>

Applied and queued up for -stable, thanks.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
                   ` (3 preceding siblings ...)
  2018-07-29 15:30 ` David Miller
@ 2018-07-30 16:41 ` David Miller
  2018-07-30 16:41 ` David Miller
  5 siblings, 0 replies; 22+ messages in thread
From: David Miller @ 2018-07-30 16:41 UTC (permalink / raw)
  To: xiliang; +Cc: jgross, netdev, boris.ostrovsky, linux-kernel, xen-devel

From: Xiao Liang <xiliang@redhat.com>
Date: Fri, 27 Jul 2018 17:56:08 +0800

> 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.
 ...
> Signed-off-by: Xiao Liang <xiliang@redhat.com>

Applied and queued up for -stable, thanks.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-30  8:18   ` [Xen-devel] " Xiao Liang
@ 2018-08-24 11:12     ` Jiri Slaby
  2018-08-24 11:26       ` Juergen Gross
  2018-08-24 11:26       ` Juergen Gross
  2018-08-24 11:12     ` Jiri Slaby
  1 sibling, 2 replies; 22+ messages in thread
From: Jiri Slaby @ 2018-08-24 11:12 UTC (permalink / raw)
  To: Xiao Liang, David Miller
  Cc: jgross, netdev, boris.ostrovsky, linux-kernel, xen-devel

On 07/30/2018, 10:18 AM, Xiao Liang wrote:
> On 07/29/2018 11:30 PM, David Miller wrote:
>> From: Xiao Liang <xiliang@redhat.com>
>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>
>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>> *xennet_create_dev(struct xenbus_device *dev)
>>>       netif_carrier_off(netdev);
>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>> +    wait_event(module_load_q,
>>> +               xenbus_read_driver_state(dev->otherend) !=
>>> +               XenbusStateClosed &&
>>> +               xenbus_read_driver_state(dev->otherend) !=
>>> +               XenbusStateUnknown);
>>>       return netdev;
>>>      exit:
>> 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

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-07-30  8:18   ` [Xen-devel] " Xiao Liang
  2018-08-24 11:12     ` Jiri Slaby
@ 2018-08-24 11:12     ` Jiri Slaby
  1 sibling, 0 replies; 22+ messages in thread
From: Jiri Slaby @ 2018-08-24 11:12 UTC (permalink / raw)
  To: Xiao Liang, David Miller
  Cc: jgross, netdev, boris.ostrovsky, linux-kernel, xen-devel

On 07/30/2018, 10:18 AM, Xiao Liang wrote:
> On 07/29/2018 11:30 PM, David Miller wrote:
>> From: Xiao Liang <xiliang@redhat.com>
>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>
>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>> *xennet_create_dev(struct xenbus_device *dev)
>>>       netif_carrier_off(netdev);
>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>> +    wait_event(module_load_q,
>>> +               xenbus_read_driver_state(dev->otherend) !=
>>> +               XenbusStateClosed &&
>>> +               xenbus_read_driver_state(dev->otherend) !=
>>> +               XenbusStateUnknown);
>>>       return netdev;
>>>      exit:
>> 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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-08-24 11:12     ` Jiri Slaby
@ 2018-08-24 11:26       ` Juergen Gross
  2018-08-24 14:26         ` Boris Ostrovsky
  2018-08-24 14:26         ` [Xen-devel] " Boris Ostrovsky
  2018-08-24 11:26       ` Juergen Gross
  1 sibling, 2 replies; 22+ messages in thread
From: Juergen Gross @ 2018-08-24 11:26 UTC (permalink / raw)
  To: Jiri Slaby, Xiao Liang, David Miller
  Cc: netdev, boris.ostrovsky, linux-kernel, xen-devel

On 24/08/18 13:12, Jiri Slaby wrote:
> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>> On 07/29/2018 11:30 PM, David Miller wrote:
>>> From: Xiao Liang <xiliang@redhat.com>
>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>
>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>       netif_carrier_off(netdev);
>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>> +    wait_event(module_load_q,
>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>> +               XenbusStateClosed &&
>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>> +               XenbusStateUnknown);
>>>>       return netdev;
>>>>      exit:
>>> 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


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-08-24 11:12     ` Jiri Slaby
  2018-08-24 11:26       ` Juergen Gross
@ 2018-08-24 11:26       ` Juergen Gross
  1 sibling, 0 replies; 22+ messages in thread
From: Juergen Gross @ 2018-08-24 11:26 UTC (permalink / raw)
  To: Jiri Slaby, Xiao Liang, David Miller
  Cc: netdev, boris.ostrovsky, linux-kernel, xen-devel

On 24/08/18 13:12, Jiri Slaby wrote:
> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>> On 07/29/2018 11:30 PM, David Miller wrote:
>>> From: Xiao Liang <xiliang@redhat.com>
>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>
>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>       netif_carrier_off(netdev);
>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>> +    wait_event(module_load_q,
>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>> +               XenbusStateClosed &&
>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>> +               XenbusStateUnknown);
>>>>       return netdev;
>>>>      exit:
>>> 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


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-08-24 11:26       ` Juergen Gross
  2018-08-24 14:26         ` Boris Ostrovsky
@ 2018-08-24 14:26         ` Boris Ostrovsky
  2018-09-07 11:06           ` Jiri Slaby
  2018-09-07 11:06           ` Jiri Slaby
  1 sibling, 2 replies; 22+ messages in thread
From: Boris Ostrovsky @ 2018-08-24 14:26 UTC (permalink / raw)
  To: Juergen Gross, Jiri Slaby, Xiao Liang, David Miller
  Cc: netdev, linux-kernel, xen-devel

On 08/24/2018 07:26 AM, Juergen Gross wrote:
> On 24/08/18 13:12, Jiri Slaby wrote:
>> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>>> On 07/29/2018 11:30 PM, David Miller wrote:
>>>> From: Xiao Liang <xiliang@redhat.com>
>>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>>
>>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>>       netif_carrier_off(netdev);
>>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>>> +    wait_event(module_load_q,
>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>> +               XenbusStateClosed &&
>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>> +               XenbusStateUnknown);
>>>>>       return netdev;
>>>>>      exit:
>>>> 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.


Yes, use single queue, but rename it to something more neutral. module_wq?

-boris

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-08-24 11:26       ` Juergen Gross
@ 2018-08-24 14:26         ` Boris Ostrovsky
  2018-08-24 14:26         ` [Xen-devel] " Boris Ostrovsky
  1 sibling, 0 replies; 22+ messages in thread
From: Boris Ostrovsky @ 2018-08-24 14:26 UTC (permalink / raw)
  To: Juergen Gross, Jiri Slaby, Xiao Liang, David Miller
  Cc: netdev, linux-kernel, xen-devel

On 08/24/2018 07:26 AM, Juergen Gross wrote:
> On 24/08/18 13:12, Jiri Slaby wrote:
>> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>>> On 07/29/2018 11:30 PM, David Miller wrote:
>>>> From: Xiao Liang <xiliang@redhat.com>
>>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>>
>>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>>       netif_carrier_off(netdev);
>>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>>> +    wait_event(module_load_q,
>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>> +               XenbusStateClosed &&
>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>> +               XenbusStateUnknown);
>>>>>       return netdev;
>>>>>      exit:
>>>> 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.


Yes, use single queue, but rename it to something more neutral. module_wq?

-boris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-08-24 14:26         ` [Xen-devel] " Boris Ostrovsky
@ 2018-09-07 11:06           ` Jiri Slaby
  2018-09-07 11:30             ` Juergen Gross
  2018-09-07 11:30             ` Juergen Gross
  2018-09-07 11:06           ` Jiri Slaby
  1 sibling, 2 replies; 22+ messages in thread
From: Jiri Slaby @ 2018-09-07 11:06 UTC (permalink / raw)
  To: Boris Ostrovsky, Juergen Gross, Xiao Liang, David Miller
  Cc: netdev, linux-kernel, xen-devel

On 08/24/2018, 04:26 PM, Boris Ostrovsky wrote:
> On 08/24/2018 07:26 AM, Juergen Gross wrote:
>> On 24/08/18 13:12, Jiri Slaby wrote:
>>> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>>>> On 07/29/2018 11:30 PM, David Miller wrote:
>>>>> From: Xiao Liang <xiliang@redhat.com>
>>>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>>>
>>>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>>>       netif_carrier_off(netdev);
>>>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>>>> +    wait_event(module_load_q,
>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>> +               XenbusStateClosed &&
>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>> +               XenbusStateUnknown);
>>>>>>       return netdev;
>>>>>>      exit:
>>>>> 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.
> 
> 
> 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

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-08-24 14:26         ` [Xen-devel] " Boris Ostrovsky
  2018-09-07 11:06           ` Jiri Slaby
@ 2018-09-07 11:06           ` Jiri Slaby
  1 sibling, 0 replies; 22+ messages in thread
From: Jiri Slaby @ 2018-09-07 11:06 UTC (permalink / raw)
  To: Boris Ostrovsky, Juergen Gross, Xiao Liang, David Miller
  Cc: netdev, linux-kernel, xen-devel

On 08/24/2018, 04:26 PM, Boris Ostrovsky wrote:
> On 08/24/2018 07:26 AM, Juergen Gross wrote:
>> On 24/08/18 13:12, Jiri Slaby wrote:
>>> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>>>> On 07/29/2018 11:30 PM, David Miller wrote:
>>>>> From: Xiao Liang <xiliang@redhat.com>
>>>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>>>
>>>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>>>       netif_carrier_off(netdev);
>>>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>>>> +    wait_event(module_load_q,
>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>> +               XenbusStateClosed &&
>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>> +               XenbusStateUnknown);
>>>>>>       return netdev;
>>>>>>      exit:
>>>>> 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.
> 
> 
> 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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [Xen-devel] [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-09-07 11:06           ` Jiri Slaby
@ 2018-09-07 11:30             ` Juergen Gross
  2018-09-07 11:30             ` Juergen Gross
  1 sibling, 0 replies; 22+ messages in thread
From: Juergen Gross @ 2018-09-07 11:30 UTC (permalink / raw)
  To: Jiri Slaby, Boris Ostrovsky, Xiao Liang, David Miller
  Cc: netdev, linux-kernel, xen-devel

On 07/09/18 13:06, Jiri Slaby wrote:
> On 08/24/2018, 04:26 PM, Boris Ostrovsky wrote:
>> On 08/24/2018 07:26 AM, Juergen Gross wrote:
>>> On 24/08/18 13:12, Jiri Slaby wrote:
>>>> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>>>>> On 07/29/2018 11:30 PM, David Miller wrote:
>>>>>> From: Xiao Liang <xiliang@redhat.com>
>>>>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>>>>
>>>>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>>>>       netif_carrier_off(netdev);
>>>>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>>>>> +    wait_event(module_load_q,
>>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>>> +               XenbusStateClosed &&
>>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>>> +               XenbusStateUnknown);
>>>>>>>       return netdev;
>>>>>>>      exit:
>>>>>> 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.
>>
>>
>> Yes, use single queue, but rename it to something more neutral. module_wq?
> 
> Can somebody who is actually using the module fix this, please?

Already at it.


Juergen


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] xen-netfront: wait xenbus state change when load module manually
  2018-09-07 11:06           ` Jiri Slaby
  2018-09-07 11:30             ` Juergen Gross
@ 2018-09-07 11:30             ` Juergen Gross
  1 sibling, 0 replies; 22+ messages in thread
From: Juergen Gross @ 2018-09-07 11:30 UTC (permalink / raw)
  To: Jiri Slaby, Boris Ostrovsky, Xiao Liang, David Miller
  Cc: netdev, linux-kernel, xen-devel

On 07/09/18 13:06, Jiri Slaby wrote:
> On 08/24/2018, 04:26 PM, Boris Ostrovsky wrote:
>> On 08/24/2018 07:26 AM, Juergen Gross wrote:
>>> On 24/08/18 13:12, Jiri Slaby wrote:
>>>> On 07/30/2018, 10:18 AM, Xiao Liang wrote:
>>>>> On 07/29/2018 11:30 PM, David Miller wrote:
>>>>>> From: Xiao Liang <xiliang@redhat.com>
>>>>>> Date: Fri, 27 Jul 2018 17:56:08 +0800
>>>>>>
>>>>>>> @@ -1330,6 +1331,11 @@ static struct net_device
>>>>>>> *xennet_create_dev(struct xenbus_device *dev)
>>>>>>>       netif_carrier_off(netdev);
>>>>>>>         xenbus_switch_state(dev, XenbusStateInitialising);
>>>>>>> +    wait_event(module_load_q,
>>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>>> +               XenbusStateClosed &&
>>>>>>> +               xenbus_read_driver_state(dev->otherend) !=
>>>>>>> +               XenbusStateUnknown);
>>>>>>>       return netdev;
>>>>>>>      exit:
>>>>>> 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.
>>
>>
>> Yes, use single queue, but rename it to something more neutral. module_wq?
> 
> Can somebody who is actually using the module fix this, please?

Already at it.


Juergen


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH] xen-netfront: wait xenbus state change when load module manually
@ 2018-07-27  9:56 Xiao Liang
  0 siblings, 0 replies; 22+ messages in thread
From: Xiao Liang @ 2018-07-27  9:56 UTC (permalink / raw)
  To: netdev, xen-devel, davem, jgross, boris.ostrovsky
  Cc: linux-kernel, Xiao 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.

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 <xiliang@redhat.com>
---
 drivers/net/xen-netfront.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index a57daecf1d57..2d8812dd1534 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -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)
 
+static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
 static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
 
 struct netfront_stats {
@@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
 	netif_carrier_off(netdev);
 
 	xenbus_switch_state(dev, XenbusStateInitialising);
+	wait_event(module_load_q,
+			   xenbus_read_driver_state(dev->otherend) !=
+			   XenbusStateClosed &&
+			   xenbus_read_driver_state(dev->otherend) !=
+			   XenbusStateUnknown);
 	return netdev;
 
  exit:
-- 
2.17.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply related	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2018-09-07 11:30 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-27  9:56 [PATCH] xen-netfront: wait xenbus state change when load module manually Xiao Liang
2018-07-27 18:40 ` Boris Ostrovsky
2018-07-30  7:43   ` Xiao Liang
2018-07-30  7:43   ` [Xen-devel] " Xiao Liang
2018-07-27 18:40 ` Boris Ostrovsky
2018-07-29 15:30 ` David Miller
2018-07-29 15:30 ` David Miller
2018-07-30  8:18   ` [Xen-devel] " Xiao Liang
2018-08-24 11:12     ` Jiri Slaby
2018-08-24 11:26       ` Juergen Gross
2018-08-24 14:26         ` Boris Ostrovsky
2018-08-24 14:26         ` [Xen-devel] " Boris Ostrovsky
2018-09-07 11:06           ` Jiri Slaby
2018-09-07 11:30             ` Juergen Gross
2018-09-07 11:30             ` Juergen Gross
2018-09-07 11:06           ` Jiri Slaby
2018-08-24 11:26       ` Juergen Gross
2018-08-24 11:12     ` Jiri Slaby
2018-07-30  8:18   ` Xiao Liang
2018-07-30 16:41 ` David Miller
2018-07-30 16:41 ` David Miller
  -- strict thread matches above, loose matches on Subject: below --
2018-07-27  9:56 Xiao Liang

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.