On (Tue) 24 Jul 2012 [11:37:07], Yoshihiro YUNOMAE wrote: > From: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx> > > 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 <masami.hiramatsu.pt@xxxxxxxxxxx> > Cc: Amit Shah <amit.shah@xxxxxxxxxx> > Cc: Arnd Bergmann <arnd@xxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > --- > +/* 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 _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization