lkml.org 
[lkml]   [2012]   [Aug]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 3/6] virtio/console: Wait until the port is ready on splice
    Date
    From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

    Wait if the port is not connected or full on splice
    like as write is doing.

    Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    ---

    drivers/char/virtio_console.c | 39 +++++++++++++++++++++++++++------------
    1 files changed, 27 insertions(+), 12 deletions(-)

    diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
    index 22b7373..b2fc2ab 100644
    --- a/drivers/char/virtio_console.c
    +++ b/drivers/char/virtio_console.c
    @@ -724,6 +724,26 @@ static ssize_t port_fops_read(struct file *filp, char __user *ubuf,
    return fill_readbuf(port, ubuf, count, true);
    }

    +static int wait_port_writable(struct port *port, bool nonblock)
    +{
    + int ret;
    +
    + if (will_write_block(port)) {
    + if (nonblock)
    + return -EAGAIN;
    +
    + ret = wait_event_freezable(port->waitqueue,
    + !will_write_block(port));
    + if (ret < 0)
    + return ret;
    + }
    + /* Port got hot-unplugged. */
    + if (!port->guest_connected)
    + return -ENODEV;
    +
    + return 0;
    +}
    +
    static ssize_t port_fops_write(struct file *filp, const char __user *ubuf,
    size_t count, loff_t *offp)
    {
    @@ -740,18 +760,9 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf,

    nonblock = filp->f_flags & O_NONBLOCK;

    - if (will_write_block(port)) {
    - if (nonblock)
    - return -EAGAIN;
    -
    - ret = wait_event_freezable(port->waitqueue,
    - !will_write_block(port));
    - if (ret < 0)
    - return ret;
    - }
    - /* Port got hot-unplugged. */
    - if (!port->guest_connected)
    - return -ENODEV;
    + ret = wait_port_writable(port, nonblock);
    + if (ret < 0)
    + return ret;

    count = min((size_t)(32 * 1024), count);

    @@ -851,6 +862,10 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
    .u.data = &sgl,
    };

    + ret = wait_port_writable(port, filp->f_flags & O_NONBLOCK);
    + if (ret < 0)
    + return ret;
    +
    sgl.n = 0;
    sgl.len = 0;
    sgl.sg = kmalloc(sizeof(struct scatterlist) * MAX_SPLICE_PAGES,



    \
     
     \ /
      Last update: 2012-08-09 15:22    [W:0.041 / U:0.052 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site