All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Nikos Filippakis <aesmade@gmail.com>, qemu-devel@nongnu.org
Cc: jasowang@redhat.com
Subject: Re: [Qemu-devel] [PATCH] net.c: Moved large array in nc_sendv_compat from the stack to the heap
Date: Mon, 7 Mar 2016 09:16:09 +0100	[thread overview]
Message-ID: <56DD38C9.2010404@redhat.com> (raw)
In-Reply-To: <1457210381-23325-1-git-send-email-aesmade@gmail.com>



On 05/03/2016 21:39, Nikos Filippakis wrote:
> Hello everyone! I am interested in getting to know the codebase a little better
> so that I can eventually apply for a GSOC position.
> This is my first attempt at posting a patch to a mailing list, any feedback
> is greatly appreciated.
> 
> Signed-off-by: Nikos Filippakis <aesmade@gmail.com>
> ---
>  net/net.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/net/net.c b/net/net.c
> index aebf753..79e9d7c 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -710,23 +710,30 @@ 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 *buffer;
>      size_t offset;
> +    ssize_t ret;
>  
>      if (iovcnt == 1) {
>          buffer = iov[0].iov_base;
>          offset = iov[0].iov_len;
>      } else {
> -        buffer = buf;
> -        offset = iov_to_buf(iov, iovcnt, 0, buf, sizeof(buf));
> +        buffer = g_malloc(NET_BUFSIZE * sizeof(uint8_t));
> +        offset = iov_to_buf(iov, iovcnt, 0, buffer,
> +                            NET_BUFSIZE * sizeof(uint8_t));
>      }

Hi Nikos,

I suspect an allocation (especially a large one) on this path can have a
performance impact.  On one hand, nc_sendv_compat is not used in
high-performance network cards (e1000 and virtio-net, for example) so
this is not a major issue.  On the other hand, this is the first such
conversion so you could set a good example.

Another possibility thus is to make the buffer smaller (e.g. 2K) and
check the size with iov_size.  If the size is at most 2K, you use the
on-stack buffer.  If the size is bigger than 2K and smaller than
NET_BUFSIZE, you go through the allocation but you only need to allocate
the correct number of bytes.  Finally, if the size is bigger than
NET_BUFSIZE you set errno = EINVAL and return -1.

Thanks,

Paolo

>      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);
>      }
> +
> +    if (iovcnt != 1) {
> +        g_free(buffer);
> +    }
> +
> +    return ret;
>  }
>  
>  ssize_t qemu_deliver_packet_iov(NetClientState *sender,
> 

      parent reply	other threads:[~2016-03-07  8:16 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-05 20:39 [Qemu-devel] [PATCH] net.c: Moved large array in nc_sendv_compat from the stack to the heap Nikos Filippakis
2016-03-06  7:47 ` Alex Bennée
2016-03-06 17:36   ` Nikos Filippakis
2016-03-07  7:43     ` Alex Bennée
2016-03-07  8:16 ` Paolo Bonzini [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56DD38C9.2010404@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=aesmade@gmail.com \
    --cc=jasowang@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.