Patchwork slirp: Signal free input buffer space to io-thread

login
register
mail settings
Submitter Jan Kiszka
Date March 30, 2012, 5:43 p.m.
Message ID <4F75F0C1.2070403@siemens.com>
Download mbox | patch
Permalink /patch/149705/
State New
Headers show

Comments

Jan Kiszka - March 30, 2012, 5:43 p.m.
This massively accelerates slirp reception speed: If data arrives
faster than the guest can read it from the input buffer, the file
descriptor for the corresponding socket was taken out of the fdset for
select. However, the event of the guest reading enough data from the
buffer was not signaled. Thus, the io-thread only noticed this change
on the next time-driven poll. Fix this by kicking the io-thread as
required.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

Hell, this was really annoying when working with slirp, specifically
with KVM irqchip enabled (as it reduces userspace exits). But I never
really found the time to dig deep enough. And now it turned out to be
so simple! http://thread.gmane.org/gmane.comp.emulators.qemu/141975 was
the key for me.

 slirp/sbuf.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
Paolo Bonzini - March 30, 2012, 6:37 p.m.
Il 30/03/2012 19:43, Jan Kiszka ha scritto:
> This massively accelerates slirp reception speed: If data arrives
> faster than the guest can read it from the input buffer, the file
> descriptor for the corresponding socket was taken out of the fdset for
> select. However, the event of the guest reading enough data from the
> buffer was not signaled. Thus, the io-thread only noticed this change
> on the next time-driven poll. Fix this by kicking the io-thread as
> required.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> 
> Hell, this was really annoying when working with slirp, specifically
> with KVM irqchip enabled (as it reduces userspace exits). But I never
> really found the time to dig deep enough. And now it turned out to be
> so simple! http://thread.gmane.org/gmane.comp.emulators.qemu/141975 was
> the key for me.
> 
>  slirp/sbuf.c |    6 ++++++
>  1 files changed, 6 insertions(+), 0 deletions(-)
> 
> diff --git a/slirp/sbuf.c b/slirp/sbuf.c
> index 5a1ccbf..637f8fe 100644
> --- a/slirp/sbuf.c
> +++ b/slirp/sbuf.c
> @@ -6,6 +6,7 @@
>   */
>  
>  #include <slirp.h>
> +#include <main-loop.h>
>  
>  static void sbappendsb(struct sbuf *sb, struct mbuf *m);
>  
> @@ -18,6 +19,8 @@ sbfree(struct sbuf *sb)
>  void
>  sbdrop(struct sbuf *sb, int num)
>  {
> +    int limit = sb->sb_datalen / 2;
> +
>  	/*
>  	 * We can only drop how much we have
>  	 * This should never succeed
> @@ -29,6 +32,9 @@ sbdrop(struct sbuf *sb, int num)
>  	if(sb->sb_rptr >= sb->sb_data + sb->sb_datalen)
>  		sb->sb_rptr -= sb->sb_datalen;
>  
> +    if (sb->sb_cc < limit && sb->sb_cc + num >= limit) {
> +        qemu_notify_event();
> +    }
>  }
>  
>  void

Looks good!

Paolo

Patch

diff --git a/slirp/sbuf.c b/slirp/sbuf.c
index 5a1ccbf..637f8fe 100644
--- a/slirp/sbuf.c
+++ b/slirp/sbuf.c
@@ -6,6 +6,7 @@ 
  */
 
 #include <slirp.h>
+#include <main-loop.h>
 
 static void sbappendsb(struct sbuf *sb, struct mbuf *m);
 
@@ -18,6 +19,8 @@  sbfree(struct sbuf *sb)
 void
 sbdrop(struct sbuf *sb, int num)
 {
+    int limit = sb->sb_datalen / 2;
+
 	/*
 	 * We can only drop how much we have
 	 * This should never succeed
@@ -29,6 +32,9 @@  sbdrop(struct sbuf *sb, int num)
 	if(sb->sb_rptr >= sb->sb_data + sb->sb_datalen)
 		sb->sb_rptr -= sb->sb_datalen;
 
+    if (sb->sb_cc < limit && sb->sb_cc + num >= limit) {
+        qemu_notify_event();
+    }
 }
 
 void