* [PATCH] use clear_page()/copy_page() in favor of memset()/memcpy() on whole pages
@ 2010-09-02 12:30 Jan Beulich
2010-09-14 23:06 ` Andrew Morton
0 siblings, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2010-09-02 12:30 UTC (permalink / raw)
To: linux-kernel; +Cc: akpm
After all that's what they are intended for.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
---
fs/fuse/dev.c | 2 +-
kernel/kexec.c | 2 +-
kernel/power/snapshot.c | 14 +++++++-------
kernel/power/swap.c | 6 +++---
mm/memory.c | 2 +-
5 files changed, 13 insertions(+), 13 deletions(-)
--- linux-2.6.36-rc3/fs/fuse/dev.c
+++ 2.6.36-rc3-use-clear_page/fs/fuse/dev.c
@@ -811,7 +811,7 @@ static int fuse_copy_page(struct fuse_co
if (page && zeroing && count < PAGE_SIZE) {
void *mapaddr = kmap_atomic(page, KM_USER1);
- memset(mapaddr, 0, PAGE_SIZE);
+ clear_page(mapaddr);
kunmap_atomic(mapaddr, KM_USER1);
}
while (count) {
--- linux-2.6.36-rc3/kernel/kexec.c
+++ 2.6.36-rc3-use-clear_page/kernel/kexec.c
@@ -816,7 +816,7 @@ static int kimage_load_normal_segment(st
ptr = kmap(page);
/* Start with a clear page */
- memset(ptr, 0, PAGE_SIZE);
+ clear_page(ptr);
ptr += maddr & ~PAGE_MASK;
mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK);
if (mchunk > mbytes)
--- linux-2.6.36-rc3/kernel/power/snapshot.c
+++ 2.6.36-rc3-use-clear_page/kernel/power/snapshot.c
@@ -988,7 +988,7 @@ static void copy_data_page(unsigned long
*/
safe_copy_page(buffer, s_page);
dst = kmap_atomic(d_page, KM_USER0);
- memcpy(dst, buffer, PAGE_SIZE);
+ copy_page(dst, buffer);
kunmap_atomic(dst, KM_USER0);
} else {
safe_copy_page(page_address(d_page), s_page);
@@ -1636,7 +1636,7 @@ int snapshot_read_next(struct snapshot_h
memory_bm_position_reset(&orig_bm);
memory_bm_position_reset(©_bm);
} else if (handle->cur <= nr_meta_pages) {
- memset(buffer, 0, PAGE_SIZE);
+ clear_page(buffer);
pack_pfns(buffer, &orig_bm);
} else {
struct page *page;
@@ -1650,7 +1650,7 @@ int snapshot_read_next(struct snapshot_h
void *kaddr;
kaddr = kmap_atomic(page, KM_USER0);
- memcpy(buffer, kaddr, PAGE_SIZE);
+ copy_page(buffer, kaddr);
kunmap_atomic(kaddr, KM_USER0);
handle->buffer = buffer;
} else {
@@ -1933,7 +1933,7 @@ static void copy_last_highmem_page(void)
void *dst;
dst = kmap_atomic(last_highmem_page, KM_USER0);
- memcpy(dst, buffer, PAGE_SIZE);
+ copy_page(dst, buffer);
kunmap_atomic(dst, KM_USER0);
last_highmem_page = NULL;
}
@@ -2219,9 +2219,9 @@ swap_two_pages_data(struct page *p1, str
kaddr1 = kmap_atomic(p1, KM_USER0);
kaddr2 = kmap_atomic(p2, KM_USER1);
- memcpy(buf, kaddr1, PAGE_SIZE);
- memcpy(kaddr1, kaddr2, PAGE_SIZE);
- memcpy(kaddr2, buf, PAGE_SIZE);
+ copy_page(buf, kaddr1);
+ copy_page(kaddr1, kaddr2);
+ copy_page(kaddr2, buf);
kunmap_atomic(kaddr1, KM_USER0);
kunmap_atomic(kaddr2, KM_USER1);
}
--- linux-2.6.36-rc3/kernel/power/swap.c
+++ 2.6.36-rc3-use-clear_page/kernel/power/swap.c
@@ -249,7 +249,7 @@ static int write_page(void *buf, sector_
if (bio_chain) {
src = (void *)__get_free_page(__GFP_WAIT | __GFP_HIGH);
if (src) {
- memcpy(src, buf, PAGE_SIZE);
+ copy_page(src, buf);
} else {
WARN_ON_ONCE(1);
bio_chain = NULL; /* Go synchronous */
@@ -323,7 +323,7 @@ static int swap_write_page(struct swap_m
error = write_page(handle->cur, handle->cur_swap, NULL);
if (error)
goto out;
- memset(handle->cur, 0, PAGE_SIZE);
+ clear_page(handle->cur);
handle->cur_swap = offset;
handle->k = 0;
}
@@ -634,7 +634,7 @@ int swsusp_check(void)
hib_resume_bdev = open_by_devnum(swsusp_resume_device, FMODE_READ);
if (!IS_ERR(hib_resume_bdev)) {
set_blocksize(hib_resume_bdev, PAGE_SIZE);
- memset(swsusp_header, 0, PAGE_SIZE);
+ clear_page(swsusp_header);
error = hib_bio_read_page(swsusp_resume_block,
swsusp_header, NULL);
if (error)
--- linux-2.6.36-rc3/mm/memory.c
+++ 2.6.36-rc3-use-clear_page/mm/memory.c
@@ -2079,7 +2079,7 @@ static inline void cow_user_page(struct
* zeroes.
*/
if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
- memset(kaddr, 0, PAGE_SIZE);
+ clear_page(kaddr);
kunmap_atomic(kaddr, KM_USER0);
flush_dcache_page(dst);
} else
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] use clear_page()/copy_page() in favor of memset()/memcpy() on whole pages
2010-09-02 12:30 [PATCH] use clear_page()/copy_page() in favor of memset()/memcpy() on whole pages Jan Beulich
@ 2010-09-14 23:06 ` Andrew Morton
2010-09-15 0:11 ` Rafael J. Wysocki
2010-09-15 6:32 ` Miklos Szeredi
0 siblings, 2 replies; 4+ messages in thread
From: Andrew Morton @ 2010-09-14 23:06 UTC (permalink / raw)
To: Jan Beulich; +Cc: linux-kernel, Rafael J. Wysocki, Miklos Szeredi
On Thu, 02 Sep 2010 13:30:37 +0100
"Jan Beulich" <JBeulich@novell.com> wrote:
> After all that's what they are intended for.
>
> ...
>
> --- linux-2.6.36-rc3/fs/fuse/dev.c
> +++ 2.6.36-rc3-use-clear_page/fs/fuse/dev.c
> @@ -811,7 +811,7 @@ static int fuse_copy_page(struct fuse_co
>
> if (page && zeroing && count < PAGE_SIZE) {
> void *mapaddr = kmap_atomic(page, KM_USER1);
> - memset(mapaddr, 0, PAGE_SIZE);
> + clear_page(mapaddr);
> kunmap_atomic(mapaddr, KM_USER1);
> }
> while (count) {
fuse wanted to use clear_highpage() here. But clear_highpage() uses
KM_USER0. I don't immediately see why fuse uses KM_USER1 here?
>
> ...
>
> --- linux-2.6.36-rc3/kernel/power/snapshot.c
> +++ 2.6.36-rc3-use-clear_page/kernel/power/snapshot.c
> @@ -988,7 +988,7 @@ static void copy_data_page(unsigned long
> */
> safe_copy_page(buffer, s_page);
> dst = kmap_atomic(d_page, KM_USER0);
> - memcpy(dst, buffer, PAGE_SIZE);
> + copy_page(dst, buffer);
> kunmap_atomic(dst, KM_USER0);
> } else {
> safe_copy_page(page_address(d_page), s_page);
> @@ -1636,7 +1636,7 @@ int snapshot_read_next(struct snapshot_h
> memory_bm_position_reset(&orig_bm);
> memory_bm_position_reset(©_bm);
> } else if (handle->cur <= nr_meta_pages) {
> - memset(buffer, 0, PAGE_SIZE);
> + clear_page(buffer);
> pack_pfns(buffer, &orig_bm);
> } else {
> struct page *page;
> @@ -1650,7 +1650,7 @@ int snapshot_read_next(struct snapshot_h
> void *kaddr;
>
> kaddr = kmap_atomic(page, KM_USER0);
> - memcpy(buffer, kaddr, PAGE_SIZE);
> + copy_page(buffer, kaddr);
> kunmap_atomic(kaddr, KM_USER0);
> handle->buffer = buffer;
> } else {
> @@ -1933,7 +1933,7 @@ static void copy_last_highmem_page(void)
> void *dst;
>
> dst = kmap_atomic(last_highmem_page, KM_USER0);
> - memcpy(dst, buffer, PAGE_SIZE);
> + copy_page(dst, buffer);
> kunmap_atomic(dst, KM_USER0);
> last_highmem_page = NULL;
> }
> @@ -2219,9 +2219,9 @@ swap_two_pages_data(struct page *p1, str
>
> kaddr1 = kmap_atomic(p1, KM_USER0);
> kaddr2 = kmap_atomic(p2, KM_USER1);
> - memcpy(buf, kaddr1, PAGE_SIZE);
> - memcpy(kaddr1, kaddr2, PAGE_SIZE);
> - memcpy(kaddr2, buf, PAGE_SIZE);
> + copy_page(buf, kaddr1);
> + copy_page(kaddr1, kaddr2);
> + copy_page(kaddr2, buf);
> kunmap_atomic(kaddr1, KM_USER0);
> kunmap_atomic(kaddr2, KM_USER1);
> }
The page-copying functions in snapshot.c are magical. The changes look
OK to me but I'd ask Rafael to double-check, please.
>
> ...
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] use clear_page()/copy_page() in favor of memset()/memcpy() on whole pages
2010-09-14 23:06 ` Andrew Morton
@ 2010-09-15 0:11 ` Rafael J. Wysocki
2010-09-15 6:32 ` Miklos Szeredi
1 sibling, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2010-09-15 0:11 UTC (permalink / raw)
To: Andrew Morton; +Cc: Jan Beulich, linux-kernel, Miklos Szeredi
On Wednesday, September 15, 2010, Andrew Morton wrote:
> On Thu, 02 Sep 2010 13:30:37 +0100
> "Jan Beulich" <JBeulich@novell.com> wrote:
>
> > After all that's what they are intended for.
> >
> > ...
> >
> > --- linux-2.6.36-rc3/fs/fuse/dev.c
> > +++ 2.6.36-rc3-use-clear_page/fs/fuse/dev.c
> > @@ -811,7 +811,7 @@ static int fuse_copy_page(struct fuse_co
> >
> > if (page && zeroing && count < PAGE_SIZE) {
> > void *mapaddr = kmap_atomic(page, KM_USER1);
> > - memset(mapaddr, 0, PAGE_SIZE);
> > + clear_page(mapaddr);
> > kunmap_atomic(mapaddr, KM_USER1);
> > }
> > while (count) {
>
> fuse wanted to use clear_highpage() here. But clear_highpage() uses
> KM_USER0. I don't immediately see why fuse uses KM_USER1 here?
>
> >
> > ...
> >
> > --- linux-2.6.36-rc3/kernel/power/snapshot.c
> > +++ 2.6.36-rc3-use-clear_page/kernel/power/snapshot.c
> > @@ -988,7 +988,7 @@ static void copy_data_page(unsigned long
> > */
> > safe_copy_page(buffer, s_page);
> > dst = kmap_atomic(d_page, KM_USER0);
> > - memcpy(dst, buffer, PAGE_SIZE);
> > + copy_page(dst, buffer);
> > kunmap_atomic(dst, KM_USER0);
> > } else {
> > safe_copy_page(page_address(d_page), s_page);
> > @@ -1636,7 +1636,7 @@ int snapshot_read_next(struct snapshot_h
> > memory_bm_position_reset(&orig_bm);
> > memory_bm_position_reset(©_bm);
> > } else if (handle->cur <= nr_meta_pages) {
> > - memset(buffer, 0, PAGE_SIZE);
> > + clear_page(buffer);
> > pack_pfns(buffer, &orig_bm);
> > } else {
> > struct page *page;
> > @@ -1650,7 +1650,7 @@ int snapshot_read_next(struct snapshot_h
> > void *kaddr;
> >
> > kaddr = kmap_atomic(page, KM_USER0);
> > - memcpy(buffer, kaddr, PAGE_SIZE);
> > + copy_page(buffer, kaddr);
> > kunmap_atomic(kaddr, KM_USER0);
> > handle->buffer = buffer;
> > } else {
> > @@ -1933,7 +1933,7 @@ static void copy_last_highmem_page(void)
> > void *dst;
> >
> > dst = kmap_atomic(last_highmem_page, KM_USER0);
> > - memcpy(dst, buffer, PAGE_SIZE);
> > + copy_page(dst, buffer);
> > kunmap_atomic(dst, KM_USER0);
> > last_highmem_page = NULL;
> > }
> > @@ -2219,9 +2219,9 @@ swap_two_pages_data(struct page *p1, str
> >
> > kaddr1 = kmap_atomic(p1, KM_USER0);
> > kaddr2 = kmap_atomic(p2, KM_USER1);
> > - memcpy(buf, kaddr1, PAGE_SIZE);
> > - memcpy(kaddr1, kaddr2, PAGE_SIZE);
> > - memcpy(kaddr2, buf, PAGE_SIZE);
> > + copy_page(buf, kaddr1);
> > + copy_page(kaddr1, kaddr2);
> > + copy_page(kaddr2, buf);
> > kunmap_atomic(kaddr1, KM_USER0);
> > kunmap_atomic(kaddr2, KM_USER1);
> > }
>
> The page-copying functions in snapshot.c are magical. The changes look
> OK to me but I'd ask Rafael to double-check, please.
Well, they _look_ OK to me too.
Rafael
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] use clear_page()/copy_page() in favor of memset()/memcpy() on whole pages
2010-09-14 23:06 ` Andrew Morton
2010-09-15 0:11 ` Rafael J. Wysocki
@ 2010-09-15 6:32 ` Miklos Szeredi
1 sibling, 0 replies; 4+ messages in thread
From: Miklos Szeredi @ 2010-09-15 6:32 UTC (permalink / raw)
To: Andrew Morton; +Cc: JBeulich, linux-kernel, rjw, miklos
On Tue, 14 Sep 2010, Andrew Morton wrote:
> On Thu, 02 Sep 2010 13:30:37 +0100
> "Jan Beulich" <JBeulich@novell.com> wrote:
>
> > After all that's what they are intended for.
> >
> > ...
> >
> > --- linux-2.6.36-rc3/fs/fuse/dev.c
> > +++ 2.6.36-rc3-use-clear_page/fs/fuse/dev.c
> > @@ -811,7 +811,7 @@ static int fuse_copy_page(struct fuse_co
> >
> > if (page && zeroing && count < PAGE_SIZE) {
> > void *mapaddr = kmap_atomic(page, KM_USER1);
> > - memset(mapaddr, 0, PAGE_SIZE);
> > + clear_page(mapaddr);
> > kunmap_atomic(mapaddr, KM_USER1);
> > }
> > while (count) {
>
> fuse wanted to use clear_highpage() here. But clear_highpage() uses
> KM_USER0. I don't immediately see why fuse uses KM_USER1 here?
There used to be KM_USER0 kmaps in there, but now they've been
replaced with plain kmaps. So switching to clear_highpage() should be
fine.
Incremental patch appended.
Thanks,
Miklos
----
Subject: fuse: use clear_highpage() and KM_USER0 instead of KM_USER1
From: Miklos Szeredi <mszeredi@suse.cz>
Commit 7909b1c640 (fuse: don't use atomic kmap) removed KM_USER0 usage
from fuse/dev.c. Switch KM_USER1 uses to KM_USER0 for clarity. Also
replace open coded clear_highpage().
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
---
fs/fuse/dev.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
Index: linux-2.6/fs/fuse/dev.c
===================================================================
--- linux-2.6.orig/fs/fuse/dev.c 2010-09-15 08:22:34.000000000 +0200
+++ linux-2.6/fs/fuse/dev.c 2010-09-15 08:24:30.000000000 +0200
@@ -809,11 +809,9 @@ static int fuse_copy_page(struct fuse_co
int err;
struct page *page = *pagep;
- if (page && zeroing && count < PAGE_SIZE) {
- void *mapaddr = kmap_atomic(page, KM_USER1);
- clear_page(mapaddr);
- kunmap_atomic(mapaddr, KM_USER1);
- }
+ if (page && zeroing && count < PAGE_SIZE)
+ clear_highpage(page);
+
while (count) {
if (cs->write && cs->pipebufs && page) {
return fuse_ref_page(cs, page, offset, count);
@@ -830,10 +828,10 @@ static int fuse_copy_page(struct fuse_co
}
}
if (page) {
- void *mapaddr = kmap_atomic(page, KM_USER1);
+ void *mapaddr = kmap_atomic(page, KM_USER0);
void *buf = mapaddr + offset;
offset += fuse_copy_do(cs, &buf, &count);
- kunmap_atomic(mapaddr, KM_USER1);
+ kunmap_atomic(mapaddr, KM_USER0);
} else
offset += fuse_copy_do(cs, NULL, &count);
}
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-09-15 6:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-02 12:30 [PATCH] use clear_page()/copy_page() in favor of memset()/memcpy() on whole pages Jan Beulich
2010-09-14 23:06 ` Andrew Morton
2010-09-15 0:11 ` Rafael J. Wysocki
2010-09-15 6:32 ` Miklos Szeredi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.