diff options
author | Arun KS <arunks@codeaurora.org> | 2018-12-28 03:34:29 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-12-28 15:11:47 -0500 |
commit | ca79b0c211af63fa3276f0e3fd7dd9ada2439839 (patch) | |
tree | a9198e85582744619903c85349583bb453fe36cb /include/linux/highmem.h | |
parent | 9705bea5f833f4fc21d5bef5fce7348427f76ea4 (diff) |
mm: convert totalram_pages and totalhigh_pages variables to atomic
totalram_pages and totalhigh_pages are made static inline function.
Main motivation was that managed_page_count_lock handling was complicating
things. It was discussed in length here,
https://lore.kernel.org/patchwork/patch/995739/#1181785 So it seemes
better to remove the lock and convert variables to atomic, with preventing
poteintial store-to-read tearing as a bonus.
[akpm@linux-foundation.org: coding style fixes]
Link: http://lkml.kernel.org/r/1542090790-21750-4-git-send-email-arunks@codeaurora.org
Signed-off-by: Arun KS <arunks@codeaurora.org>
Suggested-by: Michal Hocko <mhocko@suse.com>
Suggested-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Reviewed-by: Pavel Tatashin <pasha.tatashin@soleen.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: David Hildenbrand <david@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/highmem.h')
-rw-r--r-- | include/linux/highmem.h | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 0690679832d4..ea5cdbd8c2c3 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
@@ -36,7 +36,31 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size) | |||
36 | 36 | ||
37 | /* declarations for linux/mm/highmem.c */ | 37 | /* declarations for linux/mm/highmem.c */ |
38 | unsigned int nr_free_highpages(void); | 38 | unsigned int nr_free_highpages(void); |
39 | extern unsigned long totalhigh_pages; | 39 | extern atomic_long_t _totalhigh_pages; |
40 | static inline unsigned long totalhigh_pages(void) | ||
41 | { | ||
42 | return (unsigned long)atomic_long_read(&_totalhigh_pages); | ||
43 | } | ||
44 | |||
45 | static inline void totalhigh_pages_inc(void) | ||
46 | { | ||
47 | atomic_long_inc(&_totalhigh_pages); | ||
48 | } | ||
49 | |||
50 | static inline void totalhigh_pages_dec(void) | ||
51 | { | ||
52 | atomic_long_dec(&_totalhigh_pages); | ||
53 | } | ||
54 | |||
55 | static inline void totalhigh_pages_add(long count) | ||
56 | { | ||
57 | atomic_long_add(count, &_totalhigh_pages); | ||
58 | } | ||
59 | |||
60 | static inline void totalhigh_pages_set(long val) | ||
61 | { | ||
62 | atomic_long_set(&_totalhigh_pages, val); | ||
63 | } | ||
40 | 64 | ||
41 | void kmap_flush_unused(void); | 65 | void kmap_flush_unused(void); |
42 | 66 | ||
@@ -51,7 +75,7 @@ static inline struct page *kmap_to_page(void *addr) | |||
51 | return virt_to_page(addr); | 75 | return virt_to_page(addr); |
52 | } | 76 | } |
53 | 77 | ||
54 | #define totalhigh_pages 0UL | 78 | static inline unsigned long totalhigh_pages(void) { return 0UL; } |
55 | 79 | ||
56 | #ifndef ARCH_HAS_KMAP | 80 | #ifndef ARCH_HAS_KMAP |
57 | static inline void *kmap(struct page *page) | 81 | static inline void *kmap(struct page *page) |