qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control
@ 2012-05-25 10:52 zwu.kernel
  2012-05-25 11:05 ` Paolo Bonzini
  2012-05-25 12:13 ` Stefan Hajnoczi
  0 siblings, 2 replies; 6+ messages in thread
From: zwu.kernel @ 2012-05-25 10:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, wuzhy, stefanha, kvm, jan.kiszka

From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

Only when all other hub port's *peer* .can_receive() all return 1, the source hub port .can_receive() return 1.

Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
 net/hub.c |   27 ++++++++++++++++++++++++---
 1 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/net/hub.c b/net/hub.c
index 357ca87..478cce1 100644
--- a/net/hub.c
+++ b/net/hub.c
@@ -15,6 +15,7 @@
 #include "monitor.h"
 #include "net.h"
 #include "hub.h"
+#include "iov.h"
 
 /*
  * A hub broadcasts incoming packets to all its ports except the source port.
@@ -59,16 +60,16 @@ static ssize_t net_hub_receive_iov(NetHub *hub, NetHubPort *source_port,
                                    const struct iovec *iov, int iovcnt)
 {
     NetHubPort *port;
-    ssize_t ret = 0;
+    ssize_t len = iov_size(iov, iovcnt);
 
     QLIST_FOREACH(port, &hub->ports, next) {
         if (port == source_port) {
             continue;
         }
 
-        ret = qemu_sendv_packet(&port->nc, iov, iovcnt);
+        qemu_sendv_packet(&port->nc, iov, iovcnt);
     }
-    return ret;
+    return len;
 }
 
 static NetHub *net_hub_new(unsigned int id)
@@ -85,6 +86,25 @@ static NetHub *net_hub_new(unsigned int id)
     return hub;
 }
 
+static int net_hub_port_can_receive(NetClientState *nc)
+{
+    NetHubPort *port;
+    NetHubPort *src_port = DO_UPCAST(NetHubPort, nc, nc);
+    NetHub *hub = src_port->hub;
+
+    QLIST_FOREACH(port, &hub->ports, next) {
+        if (port == src_port) {
+            continue;
+        }
+
+        if (!qemu_can_send_packet(&port->nc)) {
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
 static ssize_t net_hub_port_receive(NetClientState *nc,
                                     const uint8_t *buf, size_t len)
 {
@@ -111,6 +131,7 @@ static void net_hub_port_cleanup(NetClientState *nc)
 static NetClientInfo net_hub_port_info = {
     .type = NET_CLIENT_TYPE_HUB,
     .size = sizeof(NetHubPort),
+    .can_receive = net_hub_port_can_receive,
     .receive = net_hub_port_receive,
     .receive_iov = net_hub_port_receive_iov,
     .cleanup = net_hub_port_cleanup,
-- 
1.7.6

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

* Re: [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control
  2012-05-25 10:52 [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control zwu.kernel
@ 2012-05-25 11:05 ` Paolo Bonzini
  2012-05-25 11:10   ` Zhi Yong Wu
  2012-05-25 12:13 ` Stefan Hajnoczi
  1 sibling, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2012-05-25 11:05 UTC (permalink / raw)
  To: zwu.kernel; +Cc: jan.kiszka, wuzhy, qemu-devel, kvm, stefanha

Il 25/05/2012 12:52, zwu.kernel@gmail.com ha scritto:
> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> 
> Only when all other hub port's *peer* .can_receive() all return 1, the source hub port .can_receive() return 1.
> 
> Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> ---
>  net/hub.c |   27 ++++++++++++++++++++++++---
>  1 files changed, 24 insertions(+), 3 deletions(-)
> 
> diff --git a/net/hub.c b/net/hub.c
> index 357ca87..478cce1 100644
> --- a/net/hub.c
> +++ b/net/hub.c
> @@ -15,6 +15,7 @@
>  #include "monitor.h"
>  #include "net.h"
>  #include "hub.h"
> +#include "iov.h"
>  
>  /*
>   * A hub broadcasts incoming packets to all its ports except the source port.
> @@ -59,16 +60,16 @@ static ssize_t net_hub_receive_iov(NetHub *hub, NetHubPort *source_port,
>                                     const struct iovec *iov, int iovcnt)
>  {
>      NetHubPort *port;
> -    ssize_t ret = 0;
> +    ssize_t len = iov_size(iov, iovcnt);
>  
>      QLIST_FOREACH(port, &hub->ports, next) {
>          if (port == source_port) {
>              continue;
>          }
>  
> -        ret = qemu_sendv_packet(&port->nc, iov, iovcnt);
> +        qemu_sendv_packet(&port->nc, iov, iovcnt);

I think you still need to apply flow control, otherwise you're cheating.
 But perhaps this is acceptable, I'll leave it to more expert people.

Paolo

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

* Re: [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control
  2012-05-25 11:05 ` Paolo Bonzini
@ 2012-05-25 11:10   ` Zhi Yong Wu
  0 siblings, 0 replies; 6+ messages in thread
From: Zhi Yong Wu @ 2012-05-25 11:10 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: jan.kiszka, wuzhy, qemu-devel, kvm, stefanha

On Fri, May 25, 2012 at 7:05 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 25/05/2012 12:52, zwu.kernel@gmail.com ha scritto:
>> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>>
>> Only when all other hub port's *peer* .can_receive() all return 1, the source hub port .can_receive() return 1.
>>
>> Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>> ---
>>  net/hub.c |   27 ++++++++++++++++++++++++---
>>  1 files changed, 24 insertions(+), 3 deletions(-)
>>
>> diff --git a/net/hub.c b/net/hub.c
>> index 357ca87..478cce1 100644
>> --- a/net/hub.c
>> +++ b/net/hub.c
>> @@ -15,6 +15,7 @@
>>  #include "monitor.h"
>>  #include "net.h"
>>  #include "hub.h"
>> +#include "iov.h"
>>
>>  /*
>>   * A hub broadcasts incoming packets to all its ports except the source port.
>> @@ -59,16 +60,16 @@ static ssize_t net_hub_receive_iov(NetHub *hub, NetHubPort *source_port,
>>                                     const struct iovec *iov, int iovcnt)
>>  {
>>      NetHubPort *port;
>> -    ssize_t ret = 0;
>> +    ssize_t len = iov_size(iov, iovcnt);
>>
>>      QLIST_FOREACH(port, &hub->ports, next) {
>>          if (port == source_port) {
>>              continue;
>>          }
>>
>> -        ret = qemu_sendv_packet(&port->nc, iov, iovcnt);
>> +        qemu_sendv_packet(&port->nc, iov, iovcnt);
>
> I think you still need to apply flow control, otherwise you're cheating.
>  But perhaps this is acceptable, I'll leave it to more expert people.
Great. thanks. any comments for other patches?

>
> Paolo



-- 
Regards,

Zhi Yong Wu

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

* Re: [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control
  2012-05-25 10:52 [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control zwu.kernel
  2012-05-25 11:05 ` Paolo Bonzini
@ 2012-05-25 12:13 ` Stefan Hajnoczi
  2012-05-26 12:32   ` Zhi Yong Wu
  1 sibling, 1 reply; 6+ messages in thread
From: Stefan Hajnoczi @ 2012-05-25 12:13 UTC (permalink / raw)
  To: zwu.kernel; +Cc: pbonzini, wuzhy, qemu-devel, kvm, jan.kiszka

On Fri, May 25, 2012 at 06:52:14PM +0800, zwu.kernel@gmail.com wrote:
> @@ -59,16 +60,16 @@ static ssize_t net_hub_receive_iov(NetHub *hub, NetHubPort *source_port,
>                                     const struct iovec *iov, int iovcnt)
>  {
>      NetHubPort *port;
> -    ssize_t ret = 0;
> +    ssize_t len = iov_size(iov, iovcnt);
> 
>      QLIST_FOREACH(port, &hub->ports, next) {
>          if (port == source_port) {
>              continue;
>          }
> 
> -        ret = qemu_sendv_packet(&port->nc, iov, iovcnt);
> +        qemu_sendv_packet(&port->nc, iov, iovcnt);
>      }
> -    return ret;
> +    return len;
>  }

I think this is okay because at this point we've given it our best shot:
we already checked that port peers can receive.  If they error out now
there's not much we can do.  The packet is dropped for that particular
peer but at least we tried to deliver it when they claimed to be ready.

Stefan

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

* Re: [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control
  2012-05-25 12:13 ` Stefan Hajnoczi
@ 2012-05-26 12:32   ` Zhi Yong Wu
  0 siblings, 0 replies; 6+ messages in thread
From: Zhi Yong Wu @ 2012-05-26 12:32 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: pbonzini, wuzhy, qemu-devel, kvm, jan.kiszka

On Fri, May 25, 2012 at 8:13 PM, Stefan Hajnoczi
<stefanha@linux.vnet.ibm.com> wrote:
> On Fri, May 25, 2012 at 06:52:14PM +0800, zwu.kernel@gmail.com wrote:
>> @@ -59,16 +60,16 @@ static ssize_t net_hub_receive_iov(NetHub *hub, NetHubPort *source_port,
>>                                     const struct iovec *iov, int iovcnt)
>>  {
>>      NetHubPort *port;
>> -    ssize_t ret = 0;
>> +    ssize_t len = iov_size(iov, iovcnt);
>>
>>      QLIST_FOREACH(port, &hub->ports, next) {
>>          if (port == source_port) {
>>              continue;
>>          }
>>
>> -        ret = qemu_sendv_packet(&port->nc, iov, iovcnt);
>> +        qemu_sendv_packet(&port->nc, iov, iovcnt);
>>      }
>> -    return ret;
>> +    return len;
>>  }
>
> I think this is okay because at this point we've given it our best shot:
> we already checked that port peers can receive.  If they error out now
> there's not much we can do.  The packet is dropped for that particular
> peer but at least we tried to deliver it when they claimed to be ready.
Yeah, i think that he is lack of enough understanding on net subsystem
code. He can't see that his thought brought a lot of issues.

>
> Stefan
>



-- 
Regards,

Zhi Yong Wu

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

* [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control
  2012-06-04  5:29 [Qemu-devel] [PATCH v4 00/16] hub-based networking patches zwu.kernel
@ 2012-06-04  5:29 ` zwu.kernel
  0 siblings, 0 replies; 6+ messages in thread
From: zwu.kernel @ 2012-06-04  5:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, stefanha, jan.kiszka, Zhi Yong Wu, luowenj, pbonzini

From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

Only when all other hub port's *peer* .can_receive() all return 1,
the source hub port .can_receive() return 1.

Reviewed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
 net/hub.c |   27 ++++++++++++++++++++++++---
 1 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/net/hub.c b/net/hub.c
index 230d86a..efd90b5 100644
--- a/net/hub.c
+++ b/net/hub.c
@@ -15,6 +15,7 @@
 #include "monitor.h"
 #include "net.h"
 #include "hub.h"
+#include "iov.h"
 
 /*
  * A hub broadcasts incoming packets to all its ports except the source port.
@@ -59,16 +60,16 @@ static ssize_t net_hub_receive_iov(NetHub *hub, NetHubPort *source_port,
                                    const struct iovec *iov, int iovcnt)
 {
     NetHubPort *port;
-    ssize_t ret = 0;
+    ssize_t len = iov_size(iov, iovcnt);
 
     QLIST_FOREACH(port, &hub->ports, next) {
         if (port == source_port) {
             continue;
         }
 
-        ret = qemu_sendv_packet(&port->nc, iov, iovcnt);
+        qemu_sendv_packet(&port->nc, iov, iovcnt);
     }
-    return ret;
+    return len;
 }
 
 static NetHub *net_hub_new(unsigned int id)
@@ -85,6 +86,25 @@ static NetHub *net_hub_new(unsigned int id)
     return hub;
 }
 
+static int net_hub_port_can_receive(NetClientState *nc)
+{
+    NetHubPort *port;
+    NetHubPort *src_port = DO_UPCAST(NetHubPort, nc, nc);
+    NetHub *hub = src_port->hub;
+
+    QLIST_FOREACH(port, &hub->ports, next) {
+        if (port == src_port) {
+            continue;
+        }
+
+        if (!qemu_can_send_packet(&port->nc)) {
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
 static ssize_t net_hub_port_receive(NetClientState *nc,
                                     const uint8_t *buf, size_t len)
 {
@@ -111,6 +131,7 @@ static void net_hub_port_cleanup(NetClientState *nc)
 static NetClientInfo net_hub_port_info = {
     .type = NET_CLIENT_TYPE_HUB,
     .size = sizeof(NetHubPort),
+    .can_receive = net_hub_port_can_receive,
     .receive = net_hub_port_receive,
     .receive_iov = net_hub_port_receive_iov,
     .cleanup = net_hub_port_cleanup,
-- 
1.7.6

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

end of thread, other threads:[~2012-06-04  5:32 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-25 10:52 [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control zwu.kernel
2012-05-25 11:05 ` Paolo Bonzini
2012-05-25 11:10   ` Zhi Yong Wu
2012-05-25 12:13 ` Stefan Hajnoczi
2012-05-26 12:32   ` Zhi Yong Wu
  -- strict thread matches above, loose matches on Subject: below --
2012-06-04  5:29 [Qemu-devel] [PATCH v4 00/16] hub-based networking patches zwu.kernel
2012-06-04  5:29 ` [Qemu-devel] [PATCH v4 16/16] hub: add the support for hub own flow control zwu.kernel

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).