Messages in this thread |  | | | Date | Tue, 15 Sep 2009 11:38:11 +0900 | | From | KAMEZAWA Hiroyuki <> | | Subject | Re: [PATCH 2/3] devmem: handle partial kmem write/read |
| |
On Tue, 15 Sep 2009 10:18:53 +0800 Wu Fengguang <fengguang.wu@intel.com> wrote:
> Return early on partial read/write, which may happen in future. > (eg. hit hwpoison pages) > Hmm, please modify vread() as you did in vwrite() and
== kbuf = (char *)__get_free_page(GFP_KERNEL); if (!kbuf) return -ENOMEM; == Add __GFP_ZERO to kbuf allocation, and just ignore vread()'s return value. Then, this will be much simpler. Thanks, -Kame
> CC: Greg KH <greg@kroah.com> > CC: Andi Kleen <andi@firstfloor.org> > CC: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> > Signed-off-by: Wu Fengguang <fengguang.wu@intel.com> > --- > drivers/char/mem.c | 30 ++++++++++++++++++------------ > mm/vmalloc.c | 10 +--------- > 2 files changed, 19 insertions(+), 21 deletions(-) > > --- linux-mm.orig/drivers/char/mem.c 2009-09-15 09:44:49.000000000 +0800 > +++ linux-mm/drivers/char/mem.c 2009-09-15 09:44:55.000000000 +0800 > @@ -444,18 +444,22 @@ static ssize_t read_kmem(struct file *fi > if (!kbuf) > return -ENOMEM; > while (count > 0) { > + unsigned long n; > + > sz = size_inside_page(p, count); > - sz = vread(kbuf, (char *)p, sz); > - if (!sz) > + n = vread(kbuf, (char *)p, sz); > + if (!n) > break; > - if (copy_to_user(buf, kbuf, sz)) { > + if (copy_to_user(buf, kbuf, n)) { > free_page((unsigned long)kbuf); > return -EFAULT; > } > - count -= sz; > - buf += sz; > - read += sz; > - p += sz; > + count -= n; > + buf += n; > + read += n; > + p += n; > + if (n < sz) > + break; > } > free_page((unsigned long)kbuf); > } > @@ -551,11 +555,13 @@ static ssize_t write_kmem(struct file * > free_page((unsigned long)kbuf); > return -EFAULT; > } > - sz = vwrite(kbuf, (char *)p, sz); > - count -= sz; > - buf += sz; > - virtr += sz; > - p += sz; > + n = vwrite(kbuf, (char *)p, sz); > + count -= n; > + buf += n; > + virtr += n; > + p += n; > + if (n < sz) > + break; > } > free_page((unsigned long)kbuf); > } > > -- > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ >
|  |