Re: [Qemu-devel] [PATCH v5] net: Allocating Large sized arrays to heap

2016-03-31 Thread Jason Wang


On 03/28/2016 08:34 PM, Pooja Dhannawat wrote:
> nc_sendv_compat has a huge stack usage of 69680 bytes approx.
> Moving large arrays to heap to reduce stack usage.
>
> Reviewed-by: Stefan Hajnoczi 
> Signed-off-by: Pooja Dhannawat 
> ---
>  net/net.c | 13 +
>  1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/net/net.c b/net/net.c
> index b0c832e..663da13 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -709,23 +709,28 @@ ssize_t qemu_send_packet_raw(NetClientState *nc, const 
> uint8_t *buf, int size)
>  static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
> int iovcnt, unsigned flags)
>  {
> -uint8_t buf[NET_BUFSIZE];
> +uint8_t *buf = NULL;
>  uint8_t *buffer;
>  size_t offset;
> +ssize_t ret;
>  
>  if (iovcnt == 1) {
>  buffer = iov[0].iov_base;
>  offset = iov[0].iov_len;
>  } else {
> +buf = g_new(uint8_t, NET_BUFSIZE);
>  buffer = buf;
> -offset = iov_to_buf(iov, iovcnt, 0, buf, sizeof(buf));
> +offset = iov_to_buf(iov, iovcnt, 0, buf, NET_BUFSIZE);
>  }
>  
>  if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
> -return nc->info->receive_raw(nc, buffer, offset);
> +ret = nc->info->receive_raw(nc, buffer, offset);
>  } else {
> -return nc->info->receive(nc, buffer, offset);
> +ret = nc->info->receive(nc, buffer, offset);
>  }
> +
> +g_free(buf);
> +return ret;
>  }
>  
>  ssize_t qemu_deliver_packet_iov(NetClientState *sender,

Applied to -net.

Thanks



Re: [Qemu-devel] [PATCH v5] net: Allocating Large sized arrays to heap

2016-03-31 Thread Pooja Dhannawat
On Thu, Mar 31, 2016 at 3:28 PM, Stefan Hajnoczi  wrote:

> On Mon, Mar 28, 2016 at 06:04:11PM +0530, Pooja Dhannawat wrote:
> > nc_sendv_compat has a huge stack usage of 69680 bytes approx.
> > Moving large arrays to heap to reduce stack usage.
> >
> > Reviewed-by: Stefan Hajnoczi 
> > Signed-off-by: Pooja Dhannawat 
> > ---
> >  net/net.c | 13 +
> >  1 file changed, 9 insertions(+), 4 deletions(-)
> >
> > diff --git a/net/net.c b/net/net.c
> > index b0c832e..663da13 100644
> > --- a/net/net.c
> > +++ b/net/net.c
> > @@ -709,23 +709,28 @@ ssize_t qemu_send_packet_raw(NetClientState *nc,
> const uint8_t *buf, int size)
> >  static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec
> *iov,
> > int iovcnt, unsigned flags)
> >  {
> > -uint8_t buf[NET_BUFSIZE];
> > +uint8_t *buf = NULL;
> >  uint8_t *buffer;
> >  size_t offset;
> > +ssize_t ret;
> >
> >  if (iovcnt == 1) {
> >  buffer = iov[0].iov_base;
> >  offset = iov[0].iov_len;
> >  } else {
> > +buf = g_new(uint8_t, NET_BUFSIZE);
> >  buffer = buf;
> > -offset = iov_to_buf(iov, iovcnt, 0, buf, sizeof(buf));
> > +offset = iov_to_buf(iov, iovcnt, 0, buf, NET_BUFSIZE);
> >  }
> >
> >  if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
> > -return nc->info->receive_raw(nc, buffer, offset);
> > +ret = nc->info->receive_raw(nc, buffer, offset);
> >  } else {
> > -return nc->info->receive(nc, buffer, offset);
> > +ret = nc->info->receive(nc, buffer, offset);
> >  }
> > +
> > +g_free(buf);
> > +return ret;
> >  }
> >
> >  ssize_t qemu_deliver_packet_iov(NetClientState *sender,
> > --
> > 2.5.0
>
> CCing Jason Wang, net subsystem maintainer.  Please use
> scripts/get_maintainer.pl to find the right people to CC in future
> patches.
>
> Yes, I am sorry about that. Fam also pointed out this thing but I forgot
this time also.
I will keep that mind from onwards.


> We may also want to keep a smaller stack buffer so that reasonably-sized
> packets (e.g. up to 2 KB) can be send without the performance cost of
> g_malloc().
>


Re: [Qemu-devel] [PATCH v5] net: Allocating Large sized arrays to heap

2016-03-31 Thread Stefan Hajnoczi
On Mon, Mar 28, 2016 at 06:04:11PM +0530, Pooja Dhannawat wrote:
> nc_sendv_compat has a huge stack usage of 69680 bytes approx.
> Moving large arrays to heap to reduce stack usage.
> 
> Reviewed-by: Stefan Hajnoczi 
> Signed-off-by: Pooja Dhannawat 
> ---
>  net/net.c | 13 +
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/net/net.c b/net/net.c
> index b0c832e..663da13 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -709,23 +709,28 @@ ssize_t qemu_send_packet_raw(NetClientState *nc, const 
> uint8_t *buf, int size)
>  static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
> int iovcnt, unsigned flags)
>  {
> -uint8_t buf[NET_BUFSIZE];
> +uint8_t *buf = NULL;
>  uint8_t *buffer;
>  size_t offset;
> +ssize_t ret;
>  
>  if (iovcnt == 1) {
>  buffer = iov[0].iov_base;
>  offset = iov[0].iov_len;
>  } else {
> +buf = g_new(uint8_t, NET_BUFSIZE);
>  buffer = buf;
> -offset = iov_to_buf(iov, iovcnt, 0, buf, sizeof(buf));
> +offset = iov_to_buf(iov, iovcnt, 0, buf, NET_BUFSIZE);
>  }
>  
>  if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
> -return nc->info->receive_raw(nc, buffer, offset);
> +ret = nc->info->receive_raw(nc, buffer, offset);
>  } else {
> -return nc->info->receive(nc, buffer, offset);
> +ret = nc->info->receive(nc, buffer, offset);
>  }
> +
> +g_free(buf);
> +return ret;
>  }
>  
>  ssize_t qemu_deliver_packet_iov(NetClientState *sender,
> -- 
> 2.5.0

CCing Jason Wang, net subsystem maintainer.  Please use
scripts/get_maintainer.pl to find the right people to CC in future
patches.

We may also want to keep a smaller stack buffer so that reasonably-sized
packets (e.g. up to 2 KB) can be send without the performance cost of
g_malloc().


signature.asc
Description: PGP signature


[Qemu-devel] [PATCH v5] net: Allocating Large sized arrays to heap

2016-03-28 Thread Pooja Dhannawat
nc_sendv_compat has a huge stack usage of 69680 bytes approx.
Moving large arrays to heap to reduce stack usage.

Reviewed-by: Stefan Hajnoczi 
Signed-off-by: Pooja Dhannawat 
---
 net/net.c | 13 +
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/net/net.c b/net/net.c
index b0c832e..663da13 100644
--- a/net/net.c
+++ b/net/net.c
@@ -709,23 +709,28 @@ ssize_t qemu_send_packet_raw(NetClientState *nc, const 
uint8_t *buf, int size)
 static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
int iovcnt, unsigned flags)
 {
-uint8_t buf[NET_BUFSIZE];
+uint8_t *buf = NULL;
 uint8_t *buffer;
 size_t offset;
+ssize_t ret;
 
 if (iovcnt == 1) {
 buffer = iov[0].iov_base;
 offset = iov[0].iov_len;
 } else {
+buf = g_new(uint8_t, NET_BUFSIZE);
 buffer = buf;
-offset = iov_to_buf(iov, iovcnt, 0, buf, sizeof(buf));
+offset = iov_to_buf(iov, iovcnt, 0, buf, NET_BUFSIZE);
 }
 
 if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
-return nc->info->receive_raw(nc, buffer, offset);
+ret = nc->info->receive_raw(nc, buffer, offset);
 } else {
-return nc->info->receive(nc, buffer, offset);
+ret = nc->info->receive(nc, buffer, offset);
 }
+
+g_free(buf);
+return ret;
 }
 
 ssize_t qemu_deliver_packet_iov(NetClientState *sender,
-- 
2.5.0