diff options
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/lguest/lguest.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c index 20f8253881b3..64110797044a 100644 --- a/Documentation/lguest/lguest.c +++ b/Documentation/lguest/lguest.c | |||
@@ -769,6 +769,16 @@ static void net_output(struct virtqueue *vq) | |||
769 | add_used(vq, head, 0); | 769 | add_used(vq, head, 0); |
770 | } | 770 | } |
771 | 771 | ||
772 | /* Will reading from this file descriptor block? */ | ||
773 | static bool will_block(int fd) | ||
774 | { | ||
775 | fd_set fdset; | ||
776 | struct timeval zero = { 0, 0 }; | ||
777 | FD_ZERO(&fdset); | ||
778 | FD_SET(fd, &fdset); | ||
779 | return select(fd+1, &fdset, NULL, NULL, &zero) != 1; | ||
780 | } | ||
781 | |||
772 | /* This is where we handle packets coming in from the tun device to our | 782 | /* This is where we handle packets coming in from the tun device to our |
773 | * Guest. */ | 783 | * Guest. */ |
774 | static void net_input(struct virtqueue *vq) | 784 | static void net_input(struct virtqueue *vq) |
@@ -781,10 +791,15 @@ static void net_input(struct virtqueue *vq) | |||
781 | head = wait_for_vq_desc(vq, iov, &out, &in); | 791 | head = wait_for_vq_desc(vq, iov, &out, &in); |
782 | if (out) | 792 | if (out) |
783 | errx(1, "Output buffers in net input queue?"); | 793 | errx(1, "Output buffers in net input queue?"); |
794 | |||
795 | /* Deliver interrupt now, since we're about to sleep. */ | ||
796 | if (vq->pending_used && will_block(net_info->tunfd)) | ||
797 | trigger_irq(vq); | ||
798 | |||
784 | len = readv(net_info->tunfd, iov, in); | 799 | len = readv(net_info->tunfd, iov, in); |
785 | if (len <= 0) | 800 | if (len <= 0) |
786 | err(1, "Failed to read from tun."); | 801 | err(1, "Failed to read from tun."); |
787 | add_used_and_trigger(vq, head, len); | 802 | add_used(vq, head, len); |
788 | } | 803 | } |
789 | 804 | ||
790 | /* This is the helper to create threads. */ | 805 | /* This is the helper to create threads. */ |