mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
mm/highmem: remove deprecated kmap_atomic
kmap_atomic() is being deprecated in favor of kmap_local_page(). Replace the uses of kmap_atomic() within the highmem code. On profiling clear_huge_page() using ftrace an improvement of 62% was observed on the below setup. Setup:- Below data has been collected on Qualcomm's SM7250 SoC THP enabled (kernel v4.19.113) with only CPU-0(Cortex-A55) and CPU-7(Cortex-A76) switched on and set to max frequency, also DDR set to perf governor. FTRACE Data:- Base data:- Number of iterations: 48 Mean of allocation time: 349.5 us std deviation: 74.5 us v4 data:- Number of iterations: 48 Mean of allocation time: 131 us std deviation: 32.7 us The following simple userspace experiment to allocate 100MB(BUF_SZ) of pages and writing to it gave us a good insight, we observed an improvement of 42% in allocation and writing timings. ------------------------------------------------------------- Test code snippet ------------------------------------------------------------- clock_start(); buf = malloc(BUF_SZ); /* Allocate 100 MB of memory */ for(i=0; i < BUF_SZ_PAGES; i++) { *((int *)(buf + (i*PAGE_SIZE))) = 1; } clock_end(); ------------------------------------------------------------- Malloc test timings for 100MB anon allocation:- Base data:- Number of iterations: 100 Mean of allocation time: 31831 us std deviation: 4286 us v4 data:- Number of iterations: 100 Mean of allocation time: 18193 us std deviation: 4915 us [willy@infradead.org: fix zero_user_segments()] Link: https://lkml.kernel.org/r/YYVhHCJcm2DM2G9u@casper.infradead.org Link: https://lkml.kernel.org/r/20210204073255.20769-2-prathu.baronia@oneplus.com Signed-off-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Prathu Baronia <prathu.baronia@oneplus.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Matthew Wilcox <willy@infradead.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
afe8605ca4
commit
d2c20e51e3
@@ -143,9 +143,9 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
|
|||||||
#ifndef clear_user_highpage
|
#ifndef clear_user_highpage
|
||||||
static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
|
static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
|
||||||
{
|
{
|
||||||
void *addr = kmap_atomic(page);
|
void *addr = kmap_local_page(page);
|
||||||
clear_user_page(addr, vaddr, page);
|
clear_user_page(addr, vaddr, page);
|
||||||
kunmap_atomic(addr);
|
kunmap_local(addr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -177,9 +177,9 @@ alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
|
|||||||
|
|
||||||
static inline void clear_highpage(struct page *page)
|
static inline void clear_highpage(struct page *page)
|
||||||
{
|
{
|
||||||
void *kaddr = kmap_atomic(page);
|
void *kaddr = kmap_local_page(page);
|
||||||
clear_page(kaddr);
|
clear_page(kaddr);
|
||||||
kunmap_atomic(kaddr);
|
kunmap_local(kaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_TAG_CLEAR_HIGHPAGE
|
#ifndef __HAVE_ARCH_TAG_CLEAR_HIGHPAGE
|
||||||
@@ -202,7 +202,7 @@ static inline void zero_user_segments(struct page *page,
|
|||||||
unsigned start1, unsigned end1,
|
unsigned start1, unsigned end1,
|
||||||
unsigned start2, unsigned end2)
|
unsigned start2, unsigned end2)
|
||||||
{
|
{
|
||||||
void *kaddr = kmap_atomic(page);
|
void *kaddr = kmap_local_page(page);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
BUG_ON(end1 > page_size(page) || end2 > page_size(page));
|
BUG_ON(end1 > page_size(page) || end2 > page_size(page));
|
||||||
@@ -213,7 +213,7 @@ static inline void zero_user_segments(struct page *page,
|
|||||||
if (end2 > start2)
|
if (end2 > start2)
|
||||||
memset(kaddr + start2, 0, end2 - start2);
|
memset(kaddr + start2, 0, end2 - start2);
|
||||||
|
|
||||||
kunmap_atomic(kaddr);
|
kunmap_local(kaddr);
|
||||||
for (i = 0; i < compound_nr(page); i++)
|
for (i = 0; i < compound_nr(page); i++)
|
||||||
flush_dcache_page(page + i);
|
flush_dcache_page(page + i);
|
||||||
}
|
}
|
||||||
@@ -238,11 +238,11 @@ static inline void copy_user_highpage(struct page *to, struct page *from,
|
|||||||
{
|
{
|
||||||
char *vfrom, *vto;
|
char *vfrom, *vto;
|
||||||
|
|
||||||
vfrom = kmap_atomic(from);
|
vfrom = kmap_local_page(from);
|
||||||
vto = kmap_atomic(to);
|
vto = kmap_local_page(to);
|
||||||
copy_user_page(vto, vfrom, vaddr, to);
|
copy_user_page(vto, vfrom, vaddr, to);
|
||||||
kunmap_atomic(vto);
|
kunmap_local(vto);
|
||||||
kunmap_atomic(vfrom);
|
kunmap_local(vfrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -253,11 +253,11 @@ static inline void copy_highpage(struct page *to, struct page *from)
|
|||||||
{
|
{
|
||||||
char *vfrom, *vto;
|
char *vfrom, *vto;
|
||||||
|
|
||||||
vfrom = kmap_atomic(from);
|
vfrom = kmap_local_page(from);
|
||||||
vto = kmap_atomic(to);
|
vto = kmap_local_page(to);
|
||||||
copy_page(vto, vfrom);
|
copy_page(vto, vfrom);
|
||||||
kunmap_atomic(vto);
|
kunmap_local(vto);
|
||||||
kunmap_atomic(vfrom);
|
kunmap_local(vfrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -383,7 +383,7 @@ void zero_user_segments(struct page *page, unsigned start1, unsigned end1,
|
|||||||
unsigned this_end = min_t(unsigned, end1, PAGE_SIZE);
|
unsigned this_end = min_t(unsigned, end1, PAGE_SIZE);
|
||||||
|
|
||||||
if (end1 > start1) {
|
if (end1 > start1) {
|
||||||
kaddr = kmap_atomic(page + i);
|
kaddr = kmap_local_page(page + i);
|
||||||
memset(kaddr + start1, 0, this_end - start1);
|
memset(kaddr + start1, 0, this_end - start1);
|
||||||
}
|
}
|
||||||
end1 -= this_end;
|
end1 -= this_end;
|
||||||
@@ -398,7 +398,7 @@ void zero_user_segments(struct page *page, unsigned start1, unsigned end1,
|
|||||||
|
|
||||||
if (end2 > start2) {
|
if (end2 > start2) {
|
||||||
if (!kaddr)
|
if (!kaddr)
|
||||||
kaddr = kmap_atomic(page + i);
|
kaddr = kmap_local_page(page + i);
|
||||||
memset(kaddr + start2, 0, this_end - start2);
|
memset(kaddr + start2, 0, this_end - start2);
|
||||||
}
|
}
|
||||||
end2 -= this_end;
|
end2 -= this_end;
|
||||||
@@ -406,7 +406,7 @@ void zero_user_segments(struct page *page, unsigned start1, unsigned end1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (kaddr) {
|
if (kaddr) {
|
||||||
kunmap_atomic(kaddr);
|
kunmap_local(kaddr);
|
||||||
flush_dcache_page(page + i);
|
flush_dcache_page(page + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user