On Thu, Apr 09, 2009 at 12:30:57PM -0400, Gregory Haskins wrote: > +static unsigned long > +task_memctx_copy_to(struct vbus_memctx *ctx, void *dst, const void *src, > + unsigned long n) > +{ > + struct task_memctx *tm = to_task_memctx(ctx); > + struct task_struct *p = tm->task; > + > + while (n) { > + unsigned long offset = ((unsigned long)dst)%PAGE_SIZE; > + unsigned long len = PAGE_SIZE - offset; > + int ret; > + struct page *pg; > + void *maddr; > + > + if (len > n) > + len = n; > + > + down_read(&p->mm->mmap_sem); > + ret = get_user_pages(p, p->mm, > + (unsigned long)dst, 1, 1, 0, &pg, NULL); > + > + if (ret != 1) { > + up_read(&p->mm->mmap_sem); > + break; > + } > + > + maddr = kmap_atomic(pg, KM_USER0); > + memcpy(maddr + offset, src, len); > + kunmap_atomic(maddr, KM_USER0); > + set_page_dirty_lock(pg); > + put_page(pg); > + up_read(&p->mm->mmap_sem); > + > + src += len; > + dst += len; > + n -= len; > + } > + > + return n; > +} BTW, why did you decide to use get_user_pages? Would switch_mm + copy_to_user work as well avoiding page walk if all pages are present? Also - if we just had vmexit because a process executed io (or hypercall), can't we just do copy_to_user there? Avi, I think at some point you said that we can? -- MST -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html