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 2/6] virtio/console: Add a failback for unstealable pipe buffer
    Date
    From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

    Add a failback memcpy path for unstealable pipe buffer.
    If buf->ops->steal() fails, virtio-serial tries to
    copy the page contents to an allocated page, instead
    of just failing splice().

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

    drivers/char/virtio_console.c | 28 +++++++++++++++++++++++++---
    1 files changed, 25 insertions(+), 3 deletions(-)

    diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
    index 730816c..22b7373 100644
    --- a/drivers/char/virtio_console.c
    +++ b/drivers/char/virtio_console.c
    @@ -794,7 +794,7 @@ static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
    struct splice_desc *sd)
    {
    struct sg_list *sgl = sd->u.data;
    - unsigned int len = 0;
    + unsigned int offset, len;

    if (sgl->n == MAX_SPLICE_PAGES)
    return 0;
    @@ -807,9 +807,31 @@ static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf,

    len = min(buf->len, sd->len);
    sg_set_page(&(sgl->sg[sgl->n]), buf->page, len, buf->offset);
    - sgl->n++;
    - sgl->len += len;
    + } else {
    + /* Failback to copying a page */
    + struct page *page = alloc_page(GFP_KERNEL);
    + char *src = buf->ops->map(pipe, buf, 1);
    + char *dst;
    +
    + if (!page)
    + return -ENOMEM;
    + dst = kmap(page);
    +
    + offset = sd->pos & ~PAGE_MASK;
    +
    + len = sd->len;
    + if (len + offset > PAGE_SIZE)
    + len = PAGE_SIZE - offset;
    +
    + memcpy(dst + offset, src + buf->offset, len);
    +
    + kunmap(page);
    + buf->ops->unmap(pipe, buf, src);
    +
    + sg_set_page(&(sgl->sg[sgl->n]), page, len, offset);
    }
    + sgl->n++;
    + sgl->len += len;

    return len;
    }



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