Messages in this thread | | | Date | Tue, 8 Dec 2009 21:37:14 +0800 | From | Jie Zhang <> | Subject | Re: [PATCH] NOMMU: use copy_*_user_page() in access_process_vm() |
| |
On 12/08/2009 06:57 PM, David Howells wrote: > Mike Frysinger<vapier@gentoo.org> wrote: > >> + copy_to_user_page(vma, NULL, NULL, >> + (void *) addr, buf, len); >> ... >> + copy_from_user_page(vma, NULL, NULL, >> + buf, (void *) addr, len); > > I think this is not correct. The third parameter in both cases (vaddr) is of > unsigned long type (so should be 0 not NULL), and should not be left zero in > any case. I think it should be passed addr. In fact, we should really pass > the second parameter too (page), though for now, I'm happy to leave that NULL. > > See attached revision of the patch. > I agree on using 0 instead of NULL. But for !MMU, I think, vaddr is always as same as addr. So we don't need to pass it?
Jie
> David > --- > From: Jie Zhang<jie.zhang@analog.com> > Subject: [PATCH] NOMMU: Use copy_*_user_page() in access_process_vm() > > The MMU code uses the copy_*_user_page() variants in access_process_vm() > rather than copy_*_user() as the former includes an icache flush. This is > important when doing things like setting software breakpoints with gdb. > So switch the NOMMU code over to do the same. > > This patch makes the reasonable assumption that copy_from_user_page() won't > fail - which is probably fine, as we've checked the VMA from which we're > copying is usable, and the copy is not allowed to cross VMAs. The one case > where it might go wrong is if the VMA is a device rather than RAM, and that > device returns an error which - in which case rubbish will be returned rather > than EIO. > > Signed-off-by: Jie Zhang<jie.zhang@analog.com> > Signed-off-by: Mike Frysinger<vapier@gentoo.org> > Signed-off-by: David Howells<dhowells@redhat.com> > --- > > mm/nommu.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > > diff --git a/mm/nommu.c b/mm/nommu.c > index af12270..953800f 100644 > --- a/mm/nommu.c > +++ b/mm/nommu.c > @@ -1896,9 +1896,11 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in > > /* only read or write mappings where it is permitted */ > if (write&& vma->vm_flags& VM_MAYWRITE) > - len -= copy_to_user((void *) addr, buf, len); > + copy_to_user_page(vma, NULL, addr, > + (void *) addr, buf, len); > else if (!write&& vma->vm_flags& VM_MAYREAD) > - len -= copy_from_user(buf, (void *) addr, len); > + copy_from_user_page(vma, NULL, addr, > + buf, (void *) addr, len); > else > len = 0; > } else {
| |