diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2009-06-13 00:27:12 -0400 |
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2009-06-12 08:57:13 -0400 |
| commit | b60da13fc7bbf99d3c68578bd3fbcf66e1cb5f41 (patch) | |
| tree | 6ae96583da3212755d867fdff30b2f9ae58609e8 | |
| parent | 4a8962e21bc505c714fc2508494d4c7dd3fe2d29 (diff) | |
lguest: suppress notifications in example Launcher
The Guest only really needs to tell us about activity when we're going
to listen to the eventfd: normally, we don't want to know.
So if there are no available buffers, turn on notifications, re-check,
then wait for the Guest to notify us via the eventfd, then turn
notifications off again.
There's enough else going on that the differences are in the noise.
Before: Secs RxKicks TxKicks
1G TCP Guest->Host: 3.94 4686 32815
1M normal pings: 104 142862 1000010
1M 1k pings (-l 120): 57 142026 1000007
After:
1G TCP Guest->Host: 3.76 4691 32811
1M normal pings: 111 142859 997467
1M 1k pings (-l 120): 55 19648 501549
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
| -rw-r--r-- | Documentation/lguest/lguest.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c index 64110797044a..bb5e3c28d9d6 100644 --- a/Documentation/lguest/lguest.c +++ b/Documentation/lguest/lguest.c | |||
| @@ -172,6 +172,7 @@ static struct termios orig_term; | |||
| 172 | * threads and so we need to make sure that changes visible to the Guest happen | 172 | * threads and so we need to make sure that changes visible to the Guest happen |
| 173 | * in precise order. */ | 173 | * in precise order. */ |
| 174 | #define wmb() __asm__ __volatile__("" : : : "memory") | 174 | #define wmb() __asm__ __volatile__("" : : : "memory") |
| 175 | #define mb() __asm__ __volatile__("" : : : "memory") | ||
| 175 | 176 | ||
| 176 | /* Convert an iovec element to the given type. | 177 | /* Convert an iovec element to the given type. |
| 177 | * | 178 | * |
| @@ -593,9 +594,23 @@ static unsigned wait_for_vq_desc(struct virtqueue *vq, | |||
| 593 | /* OK, tell Guest about progress up to now. */ | 594 | /* OK, tell Guest about progress up to now. */ |
| 594 | trigger_irq(vq); | 595 | trigger_irq(vq); |
| 595 | 596 | ||
| 597 | /* OK, now we need to know about added descriptors. */ | ||
| 598 | vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY; | ||
| 599 | |||
| 600 | /* They could have slipped one in as we were doing that: make | ||
| 601 | * sure it's written, then check again. */ | ||
| 602 | mb(); | ||
| 603 | if (last_avail != vq->vring.avail->idx) { | ||
| 604 | vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY; | ||
| 605 | break; | ||
| 606 | } | ||
| 607 | |||
| 596 | /* Nothing new? Wait for eventfd to tell us they refilled. */ | 608 | /* Nothing new? Wait for eventfd to tell us they refilled. */ |
| 597 | if (read(vq->eventfd, &event, sizeof(event)) != sizeof(event)) | 609 | if (read(vq->eventfd, &event, sizeof(event)) != sizeof(event)) |
| 598 | errx(1, "Event read failed?"); | 610 | errx(1, "Event read failed?"); |
| 611 | |||
| 612 | /* We don't need to be notified again. */ | ||
| 613 | vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY; | ||
| 599 | } | 614 | } |
| 600 | 615 | ||
| 601 | /* Check it isn't doing very strange things with descriptor numbers. */ | 616 | /* Check it isn't doing very strange things with descriptor numbers. */ |
