* Dave Hansen (dave@xxxxxxxx) wrote: > On 07/25/2013 10:21 AM, Robert Jennings wrote: > > +static void zap_buf_page(unsigned long useraddr) > > +{ > > + struct vm_area_struct *vma; > > + > > + down_read(¤t->mm->mmap_sem); > > + vma = find_vma_intersection(current->mm, useraddr, > > + useraddr + PAGE_SIZE); > > + if (!IS_ERR_OR_NULL(vma)) > > + zap_page_range(vma, useraddr, PAGE_SIZE, NULL); > > + up_read(¤t->mm->mmap_sem); > > +} > > + > > /** > > * splice_to_pipe - fill passed data into a pipe > > * @pipe: pipe to fill > > @@ -212,8 +224,16 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, > > buf->len = spd->partial[page_nr].len; > > buf->private = spd->partial[page_nr].private; > > buf->ops = spd->ops; > > - if (spd->flags & SPLICE_F_GIFT) > > + if (spd->flags & SPLICE_F_GIFT) { > > + unsigned long useraddr = > > + spd->partial[page_nr].useraddr; > > + > > + if ((spd->flags & SPLICE_F_MOVE) && > > + !buf->offset && (buf->len == PAGE_SIZE)) > > + /* Can move page aligned buf */ > > + zap_buf_page(useraddr); > > buf->flags |= PIPE_BUF_FLAG_GIFT; > > + } > > There isn't quite enough context here, but is it going to do this > zap_buf_page() very often? Seems a bit wasteful to do the up/down and > find_vma() every trip through the loop. The call to zap_buf_page() is in a loop where each pipe buffer is being processed, but in that loop we have a pipe_wait() where we schedule(). So as things are structured I don't have the ability to hold mmap_sem for multiple find_vma() calls. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>