diff options
| author | David S. Miller <davem@davemloft.net> | 2010-10-21 11:43:05 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-10-21 11:43:05 -0400 |
| commit | 2198a10b501fd4443430cb17e065a9e859cc58c9 (patch) | |
| tree | 87f3781d293da0f8f8f61615905eb7bf62b7c128 /drivers/char/virtio_console.c | |
| parent | 9941fb62762253774cc6177d0b9172ece5133fe1 (diff) | |
| parent | db5a753bf198ef7a50e17d2ff358adf37efe8648 (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
net/core/dev.c
Diffstat (limited to 'drivers/char/virtio_console.c')
| -rw-r--r-- | drivers/char/virtio_console.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index c810481a5bc2..0f69c5ec0ecd 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
| @@ -459,9 +459,12 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count, | |||
| 459 | 459 | ||
| 460 | /* | 460 | /* |
| 461 | * Wait till the host acknowledges it pushed out the data we | 461 | * Wait till the host acknowledges it pushed out the data we |
| 462 | * sent. This is done for ports in blocking mode or for data | 462 | * sent. This is done for data from the hvc_console; the tty |
| 463 | * from the hvc_console; the tty operations are performed with | 463 | * operations are performed with spinlocks held so we can't |
| 464 | * spinlocks held so we can't sleep here. | 464 | * sleep here. An alternative would be to copy the data to a |
| 465 | * buffer and relax the spinning requirement. The downside is | ||
| 466 | * we need to kmalloc a GFP_ATOMIC buffer each time the | ||
| 467 | * console driver writes something out. | ||
| 465 | */ | 468 | */ |
| 466 | while (!virtqueue_get_buf(out_vq, &len)) | 469 | while (!virtqueue_get_buf(out_vq, &len)) |
| 467 | cpu_relax(); | 470 | cpu_relax(); |
| @@ -626,6 +629,14 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf, | |||
| 626 | goto free_buf; | 629 | goto free_buf; |
| 627 | } | 630 | } |
| 628 | 631 | ||
| 632 | /* | ||
| 633 | * We now ask send_buf() to not spin for generic ports -- we | ||
| 634 | * can re-use the same code path that non-blocking file | ||
| 635 | * descriptors take for blocking file descriptors since the | ||
| 636 | * wait is already done and we're certain the write will go | ||
| 637 | * through to the host. | ||
| 638 | */ | ||
| 639 | nonblock = true; | ||
| 629 | ret = send_buf(port, buf, count, nonblock); | 640 | ret = send_buf(port, buf, count, nonblock); |
| 630 | 641 | ||
| 631 | if (nonblock && ret > 0) | 642 | if (nonblock && ret > 0) |
