Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1365333 > unrolled thread
| Started by | js1304@gmail.com |
|---|---|
| First post | 2016-03-28 08:00 +0200 |
| Last post | 2016-03-28 08:20 +0200 |
| Articles | 6 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 1/2] mm/page_ref: use page_ref helper instead of direct modification of _count js1304@gmail.com - 2016-03-28 08:00 +0200
[PATCH 2/2] mm: rename _count, field of the struct page, to _refcount js1304@gmail.com - 2016-03-28 08:00 +0200
Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount kbuild test robot <lkp@intel.com> - 2016-03-28 08:10 +0200
Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount Joonsoo Kim <js1304@gmail.com> - 2016-03-28 08:30 +0200
Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount Joonsoo Kim <js1304@gmail.com> - 2016-03-28 08:10 +0200
Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount kbuild test robot <lkp@intel.com> - 2016-03-28 08:20 +0200
| From | js1304@gmail.com |
|---|---|
| Date | 2016-03-28 08:00 +0200 |
| Subject | [PATCH 1/2] mm/page_ref: use page_ref helper instead of direct modification of _count |
| Message-ID | <rhynw-2Dh-1@gated-at.bofh.it> |
From: Joonsoo Kim <iamjoonsoo.kim@lge.com> page_reference manipulation functions are introduced to track down reference count change of the page. Use it instead of direct modification of _count. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> --- drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 2 +- drivers/net/ethernet/qlogic/qede/qede_main.c | 2 +- mm/filemap.c | 2 +- net/wireless/util.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c index fa05e34..8acd7c0 100644 --- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c +++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c @@ -23,7 +23,7 @@ static void nicvf_get_page(struct nicvf *nic) if (!nic->rb_pageref || !nic->rb_page) return; - atomic_add(nic->rb_pageref, &nic->rb_page->_count); + page_ref_add(nic->rb_page, nic->rb_pageref); nic->rb_pageref = 0; } diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 518af32..394c97ff 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c @@ -791,7 +791,7 @@ static inline int qede_realloc_rx_buffer(struct qede_dev *edev, * network stack to take the ownership of the page * which can be recycled multiple times by the driver. */ - atomic_inc(&curr_cons->data->_count); + page_ref_inc(curr_cons->data); qede_reuse_page(edev, rxq, curr_cons); } diff --git a/mm/filemap.c b/mm/filemap.c index a8c69c8..0ebd326 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -213,7 +213,7 @@ void __delete_from_page_cache(struct page *page, void *shadow) * some other bad page check should catch it later. */ page_mapcount_reset(page); - atomic_sub(mapcount, &page->_count); + page_ref_sub(page, mapcount); } } diff --git a/net/wireless/util.c b/net/wireless/util.c index 9f440a9..e22432a 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -651,7 +651,7 @@ __frame_add_frag(struct sk_buff *skb, struct page *page, struct skb_shared_info *sh = skb_shinfo(skb); int page_offset; - atomic_inc(&page->_count); + page_ref_inc(page); page_offset = ptr - page_address(page); skb_add_rx_frag(skb, sh->nr_frags, page, page_offset, len, size); } -- 1.9.1
[toc] | [next] | [standalone]
| From | js1304@gmail.com |
|---|---|
| Date | 2016-03-28 08:00 +0200 |
| Subject | [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount |
| Message-ID | <rhynw-2Dh-5@gated-at.bofh.it> |
| In reply to | #1365333 |
From: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Many developer already know that field for reference count of
the struct page is _count and atomic type. They would try to handle it
directly and this could break the purpose of page reference count
tracepoint. To prevent direct _count modification, this patch rename it
to _refcount and add warning message on the code. After that, developer
who need to handle reference count will find that field should not be
accessed directly.
Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
---
include/linux/mm_types.h | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 944b2b3..9e8eb5a 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -97,7 +97,11 @@ struct page {
};
int units; /* SLOB */
};
- atomic_t _count; /* Usage count, see below. */
+ /*
+ * Usage count, *USE WRAPPER FUNCTION*
+ * when manual accounting. See page_ref.h
+ */
+ atomic_t _refcount;
};
unsigned int active; /* SLAB */
};
@@ -248,7 +252,7 @@ struct page_frag_cache {
__u32 offset;
#endif
/* we maintain a pagecount bias, so that we dont dirty cache line
- * containing page->_count every time we allocate a fragment.
+ * containing page->_refcount every time we allocate a fragment.
*/
unsigned int pagecnt_bias;
bool pfmemalloc;
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2016-03-28 08:10 +0200 |
| Subject | Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount |
| Message-ID | <rhyxb-2Ws-3@gated-at.bofh.it> |
| In reply to | #1365335 |
[Multipart message — attachments visible in raw view] — view raw
Hi Joonsoo,
[auto build test ERROR on net/master]
[also build test ERROR on v4.6-rc1 next-20160327]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/js1304-gmail-com/mm-page_ref-use-page_ref-helper-instead-of-direct-modification-of-_count/20160328-140113
config: i386-tinyconfig (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All errors (new ones prefixed by >>):
In file included from include/linux/mm.h:25:0,
from include/linux/suspend.h:8,
from arch/x86/kernel/asm-offsets.c:12:
include/linux/page_ref.h: In function 'page_ref_count':
>> include/linux/page_ref.h:66:26: error: 'struct page' has no member named '_count'
return atomic_read(&page->_count);
^
include/linux/page_ref.h: In function 'page_count':
include/linux/page_ref.h:71:41: error: 'struct page' has no member named '_count'
return atomic_read(&compound_head(page)->_count);
^
include/linux/page_ref.h: In function 'set_page_count':
include/linux/page_ref.h:76:18: error: 'struct page' has no member named '_count'
atomic_set(&page->_count, v);
^
include/linux/page_ref.h: In function 'page_ref_add':
include/linux/page_ref.h:92:22: error: 'struct page' has no member named '_count'
atomic_add(nr, &page->_count);
^
include/linux/page_ref.h: In function 'page_ref_sub':
include/linux/page_ref.h:99:22: error: 'struct page' has no member named '_count'
atomic_sub(nr, &page->_count);
^
include/linux/page_ref.h: In function 'page_ref_inc':
include/linux/page_ref.h:106:18: error: 'struct page' has no member named '_count'
atomic_inc(&page->_count);
^
include/linux/page_ref.h: In function 'page_ref_dec':
include/linux/page_ref.h:113:18: error: 'struct page' has no member named '_count'
atomic_dec(&page->_count);
^
include/linux/page_ref.h: In function 'page_ref_sub_and_test':
include/linux/page_ref.h:120:41: error: 'struct page' has no member named '_count'
int ret = atomic_sub_and_test(nr, &page->_count);
^
include/linux/page_ref.h: In function 'page_ref_dec_and_test':
include/linux/page_ref.h:129:37: error: 'struct page' has no member named '_count'
int ret = atomic_dec_and_test(&page->_count);
^
In file included from include/linux/atomic.h:4:0,
from include/linux/crypto.h:20,
from arch/x86/kernel/asm-offsets.c:8:
include/linux/page_ref.h: In function 'page_ref_dec_return':
include/linux/page_ref.h:138:35: error: 'struct page' has no member named '_count'
int ret = atomic_dec_return(&page->_count);
^
arch/x86/include/asm/atomic.h:172:53: note: in definition of macro 'atomic_dec_return'
#define atomic_dec_return(v) (atomic_sub_return(1, v))
^
In file included from include/linux/mm.h:25:0,
from include/linux/suspend.h:8,
from arch/x86/kernel/asm-offsets.c:12:
include/linux/page_ref.h: In function 'page_ref_add_unless':
include/linux/page_ref.h:147:35: error: 'struct page' has no member named '_count'
int ret = atomic_add_unless(&page->_count, nr, u);
^
In file included from arch/x86/include/asm/atomic.h:4:0,
from include/linux/atomic.h:4,
from include/linux/crypto.h:20,
from arch/x86/kernel/asm-offsets.c:8:
include/linux/page_ref.h: In function 'page_ref_freeze':
include/linux/page_ref.h:156:39: error: 'struct page' has no member named '_count'
int ret = likely(atomic_cmpxchg(&page->_count, count, 0) == count);
^
include/linux/compiler.h:169:40: note: in definition of macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^
In file included from include/linux/mm.h:25:0,
from include/linux/suspend.h:8,
from arch/x86/kernel/asm-offsets.c:12:
include/linux/page_ref.h: In function 'page_ref_unfreeze':
include/linux/page_ref.h:168:18: error: 'struct page' has no member named '_count'
atomic_set(&page->_count, count);
^
make[2]: *** [arch/x86/kernel/asm-offsets.s] Error 1
make[2]: Target '__build' not remade because of errors.
make[1]: *** [prepare0] Error 2
make[1]: Target 'prepare' not remade because of errors.
make: *** [sub-make] Error 2
vim +66 include/linux/page_ref.h
95813b8f Joonsoo Kim 2016-03-17 60 }
95813b8f Joonsoo Kim 2016-03-17 61
95813b8f Joonsoo Kim 2016-03-17 62 #endif
fe896d18 Joonsoo Kim 2016-03-17 63
fe896d18 Joonsoo Kim 2016-03-17 64 static inline int page_ref_count(struct page *page)
fe896d18 Joonsoo Kim 2016-03-17 65 {
fe896d18 Joonsoo Kim 2016-03-17 @66 return atomic_read(&page->_count);
fe896d18 Joonsoo Kim 2016-03-17 67 }
fe896d18 Joonsoo Kim 2016-03-17 68
fe896d18 Joonsoo Kim 2016-03-17 69 static inline int page_count(struct page *page)
:::::: The code at line 66 was first introduced by commit
:::::: fe896d1878949ea92ba547587bc3075cc688fb8f mm: introduce page reference manipulation functions
:::::: TO: Joonsoo Kim <iamjoonsoo.kim@lge.com>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [next] | [standalone]
| From | Joonsoo Kim <js1304@gmail.com> |
|---|---|
| Date | 2016-03-28 08:30 +0200 |
| Subject | Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount |
| Message-ID | <rhyQy-33b-9@gated-at.bofh.it> |
| In reply to | #1365336 |
2016-03-28 15:07 GMT+09:00 kbuild test robot <lkp@intel.com>: > Hi Joonsoo, > > [auto build test ERROR on net/master] > [also build test ERROR on v4.6-rc1 next-20160327] > [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] Hello, bot. Is there any way to stop further warning if I recognize that there is a mistake? Thanks.
[toc] | [prev] | [next] | [standalone]
| From | Joonsoo Kim <js1304@gmail.com> |
|---|---|
| Date | 2016-03-28 08:10 +0200 |
| Subject | Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount |
| Message-ID | <rhyxc-2Ws-9@gated-at.bofh.it> |
| In reply to | #1365335 |
2016-03-28 14:59 GMT+09:00 <js1304@gmail.com>: > From: Joonsoo Kim <iamjoonsoo.kim@lge.com> > > Many developer already know that field for reference count of > the struct page is _count and atomic type. They would try to handle it > directly and this could break the purpose of page reference count > tracepoint. To prevent direct _count modification, this patch rename it > to _refcount and add warning message on the code. After that, developer > who need to handle reference count will find that field should not be > accessed directly. > > Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Oops. This patch needs more change. Please ignore this patchset. I will resend it soon. Thanks.
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2016-03-28 08:20 +0200 |
| Subject | Re: [PATCH 2/2] mm: rename _count, field of the struct page, to _refcount |
| Message-ID | <rhyGR-2ZJ-11@gated-at.bofh.it> |
| In reply to | #1365335 |
[Multipart message — attachments visible in raw view] — view raw
Hi Joonsoo,
[auto build test WARNING on net/master]
[also build test WARNING on v4.6-rc1 next-20160327]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/js1304-gmail-com/mm-page_ref-use-page_ref-helper-instead-of-direct-modification-of-_count/20160328-140113
config: x86_64-randconfig-x019-201613 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
In file included from include/linux/mm.h:25:0,
from include/linux/suspend.h:8,
from arch/x86/kernel/asm-offsets.c:12:
include/linux/page_ref.h: In function 'page_ref_count':
include/linux/page_ref.h:66:26: error: 'struct page' has no member named '_count'
return atomic_read(&page->_count);
^
include/linux/page_ref.h: In function 'page_count':
include/linux/page_ref.h:71:41: error: 'struct page' has no member named '_count'
return atomic_read(&compound_head(page)->_count);
^
include/linux/page_ref.h: In function 'set_page_count':
include/linux/page_ref.h:76:18: error: 'struct page' has no member named '_count'
atomic_set(&page->_count, v);
^
include/linux/page_ref.h: In function 'page_ref_add':
include/linux/page_ref.h:92:22: error: 'struct page' has no member named '_count'
atomic_add(nr, &page->_count);
^
include/linux/page_ref.h: In function 'page_ref_sub':
include/linux/page_ref.h:99:22: error: 'struct page' has no member named '_count'
atomic_sub(nr, &page->_count);
^
include/linux/page_ref.h: In function 'page_ref_inc':
include/linux/page_ref.h:106:18: error: 'struct page' has no member named '_count'
atomic_inc(&page->_count);
^
include/linux/page_ref.h: In function 'page_ref_dec':
include/linux/page_ref.h:113:18: error: 'struct page' has no member named '_count'
atomic_dec(&page->_count);
^
include/linux/page_ref.h: In function 'page_ref_sub_and_test':
include/linux/page_ref.h:120:41: error: 'struct page' has no member named '_count'
int ret = atomic_sub_and_test(nr, &page->_count);
^
include/linux/page_ref.h: In function 'page_ref_dec_and_test':
include/linux/page_ref.h:129:37: error: 'struct page' has no member named '_count'
int ret = atomic_dec_and_test(&page->_count);
^
In file included from include/linux/atomic.h:4:0,
from include/linux/crypto.h:20,
from arch/x86/kernel/asm-offsets.c:8:
include/linux/page_ref.h: In function 'page_ref_dec_return':
include/linux/page_ref.h:138:35: error: 'struct page' has no member named '_count'
int ret = atomic_dec_return(&page->_count);
^
arch/x86/include/asm/atomic.h:172:53: note: in definition of macro 'atomic_dec_return'
#define atomic_dec_return(v) (atomic_sub_return(1, v))
^
In file included from include/linux/mm.h:25:0,
from include/linux/suspend.h:8,
from arch/x86/kernel/asm-offsets.c:12:
include/linux/page_ref.h: In function 'page_ref_add_unless':
include/linux/page_ref.h:147:35: error: 'struct page' has no member named '_count'
int ret = atomic_add_unless(&page->_count, nr, u);
^
In file included from arch/x86/include/asm/atomic.h:4:0,
from include/linux/atomic.h:4,
from include/linux/crypto.h:20,
from arch/x86/kernel/asm-offsets.c:8:
include/linux/page_ref.h: In function 'page_ref_freeze':
include/linux/page_ref.h:156:39: error: 'struct page' has no member named '_count'
int ret = likely(atomic_cmpxchg(&page->_count, count, 0) == count);
^
include/linux/compiler.h:138:43: note: in definition of macro 'likely'
# define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
^
include/linux/page_ref.h:156:39: error: 'struct page' has no member named '_count'
int ret = likely(atomic_cmpxchg(&page->_count, count, 0) == count);
^
include/linux/compiler.h:138:51: note: in definition of macro 'likely'
# define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
^
include/linux/page_ref.h:156:39: error: 'struct page' has no member named '_count'
int ret = likely(atomic_cmpxchg(&page->_count, count, 0) == count);
^
include/linux/compiler.h:114:47: note: in definition of macro 'likely_notrace'
#define likely_notrace(x) __builtin_expect(!!(x), 1)
^
include/linux/compiler.h:138:56: note: in expansion of macro '__branch_check__'
# define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
^
>> include/linux/page_ref.h:156:12: note: in expansion of macro 'likely'
int ret = likely(atomic_cmpxchg(&page->_count, count, 0) == count);
^
In file included from include/linux/mm.h:25:0,
from include/linux/suspend.h:8,
from arch/x86/kernel/asm-offsets.c:12:
include/linux/page_ref.h: In function 'page_ref_unfreeze':
include/linux/page_ref.h:168:18: error: 'struct page' has no member named '_count'
atomic_set(&page->_count, count);
^
make[2]: *** [arch/x86/kernel/asm-offsets.s] Error 1
make[2]: Target '__build' not remade because of errors.
make[1]: *** [prepare0] Error 2
make[1]: Target 'prepare' not remade because of errors.
make: *** [sub-make] Error 2
vim +/likely +156 include/linux/page_ref.h
95813b8f Joonsoo Kim 2016-03-17 140 if (page_ref_tracepoint_active(__tracepoint_page_ref_mod_and_return))
95813b8f Joonsoo Kim 2016-03-17 141 __page_ref_mod_and_return(page, -1, ret);
95813b8f Joonsoo Kim 2016-03-17 142 return ret;
fe896d18 Joonsoo Kim 2016-03-17 143 }
fe896d18 Joonsoo Kim 2016-03-17 144
fe896d18 Joonsoo Kim 2016-03-17 145 static inline int page_ref_add_unless(struct page *page, int nr, int u)
fe896d18 Joonsoo Kim 2016-03-17 146 {
95813b8f Joonsoo Kim 2016-03-17 147 int ret = atomic_add_unless(&page->_count, nr, u);
95813b8f Joonsoo Kim 2016-03-17 148
95813b8f Joonsoo Kim 2016-03-17 149 if (page_ref_tracepoint_active(__tracepoint_page_ref_mod_unless))
95813b8f Joonsoo Kim 2016-03-17 150 __page_ref_mod_unless(page, nr, ret);
95813b8f Joonsoo Kim 2016-03-17 151 return ret;
fe896d18 Joonsoo Kim 2016-03-17 152 }
fe896d18 Joonsoo Kim 2016-03-17 153
fe896d18 Joonsoo Kim 2016-03-17 154 static inline int page_ref_freeze(struct page *page, int count)
fe896d18 Joonsoo Kim 2016-03-17 155 {
95813b8f Joonsoo Kim 2016-03-17 @156 int ret = likely(atomic_cmpxchg(&page->_count, count, 0) == count);
95813b8f Joonsoo Kim 2016-03-17 157
95813b8f Joonsoo Kim 2016-03-17 158 if (page_ref_tracepoint_active(__tracepoint_page_ref_freeze))
95813b8f Joonsoo Kim 2016-03-17 159 __page_ref_freeze(page, count, ret);
95813b8f Joonsoo Kim 2016-03-17 160 return ret;
fe896d18 Joonsoo Kim 2016-03-17 161 }
fe896d18 Joonsoo Kim 2016-03-17 162
fe896d18 Joonsoo Kim 2016-03-17 163 static inline void page_ref_unfreeze(struct page *page, int count)
fe896d18 Joonsoo Kim 2016-03-17 164 {
:::::: The code at line 156 was first introduced by commit
:::::: 95813b8faa0cd315f61a8b9d9c523792370b693e mm/page_ref: add tracepoint to track down page reference manipulation
:::::: TO: Joonsoo Kim <iamjoonsoo.kim@lge.com>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web