Re: [RFC PATCH 1/6] virtio/console: Add splice_write support
From: Amit Shah <hidden>
Date: 2012-08-09 09:00:56
Also in:
lkml, qemu-devel
On (Tue) 24 Jul 2012 [11:37:07], Yoshihiro YUNOMAE wrote:
From: Masami Hiramatsu <redacted> Enable to use splice_write from pipe to virtio-console port. This steals pages from pipe and directly send it to host. Note that this may accelerate only the guest to host path. Signed-off-by: Masami Hiramatsu <redacted> Cc: Amit Shah <redacted> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---
+/* Faster zero-copy write by splicing */
+static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
+ struct file *filp, loff_t *ppos,
+ size_t len, unsigned int flags)
+{
+ struct port *port = filp->private_data;
+ struct sg_list sgl;
+ ssize_t ret;
+ struct splice_desc sd = {
+ .total_len = len,
+ .flags = flags,
+ .pos = *ppos,
+ .u.data = &sgl,
+ };
+
+ sgl.n = 0;
+ sgl.len = 0;
+ sgl.sg = kmalloc(sizeof(struct scatterlist) * MAX_SPLICE_PAGES,
+ GFP_ATOMIC);Do you expect this function to be called from interrupt context?
+ if (unlikely(!sgl.sg)) + return -ENOMEM; + + sg_init_table(sgl.sg, MAX_SPLICE_PAGES); + ret = __splice_from_pipe(pipe, &sd, pipe_to_sg); + if (likely(ret > 0)) + ret = send_pages(port, sgl.sg, sgl.n, sgl.len, true); + + return ret; +}
Amit