alloc_tag: export mem_alloc_profiling_key used by modules
Suren Baghdasaryan
maintainerPATCH 1/2 alloc_tag: export mem_alloc_profiling_key used by modules
Export mem_alloc_profiling_key as it is used by modules (indirectly via mem_alloc_profiling_enabled()).
--- lib/alloc_tag.c | 1 + 1 file changed, 1 insertion(+)
lib/alloc_tag.c +1 -0
@@ -15,6 +15,7 @@ EXPORT_SYMBOL(_shared_alloc_tag);DEFINE_STATIC_KEY_MAYBE (CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT , mem_alloc_profiling_key); +EXPORT_SYMBOL (mem_alloc_profiling_key);struct allocinfo_private {struct codetag_iterator iter;
base-commit: 0434dbe32053d07d658165be681505120c6b1abc
Signature · 1 line
2.45.2.993.g49e7a77208-goog
Suren Baghdasaryan
maintainerPATCH 2/2 alloc_tag: outline and export {get|put}_page_tag_ref() used by modules
Outline and export get_page_tag_ref() and put_page_tag_ref() so that modules can use them without exporting page_ext_get() and page_ext_put().
--- include/linux/pgalloc_tag.h | 23 +++-------------------- lib/alloc_tag.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-)
include/linux/pgalloc_tag.h +3 -20
@@ -13,6 +13,9 @@extern struct page_ext_operations page_alloc_tagging_ops; +union codetag_ref *get_page_tag_ref (struct page *page); +void put_page_tag_ref (union codetag_ref *ref); +static inline union codetag_ref *codetag_ref_from_page_ext (struct page_ext *page_ext) {return (void *)page_ext + page_alloc_tagging_ops.offset;
@@ -23,26 +26,6 @@ static inline struct page_ext *page_ext_from_codetag_ref(union codetag_ref *ref)return (void *)ref - page_alloc_tagging_ops.offset; } -/* Should be called only if mem_alloc_profiling_enabled() */ -static inline union codetag_ref *get_page_tag_ref (struct page *page) -{ -if (page) { -struct page_ext *page_ext =page_ext_get (page); - -if (page_ext) -return codetag_ref_from_page_ext (page_ext); - } -return NULL ; -} - -static inline void put_page_tag_ref (union codetag_ref *ref) -{ -if (WARN_ON (!ref)) -return ; - -page_ext_put (page_ext_from_codetag_ref (ref)); -} -static inline void pgalloc_tag_add (struct page *page,struct task_struct *task,unsigned int nr) {
lib/alloc_tag.c +23 -0
@@ -4,6 +4,7 @@#include <linux/gfp.h> #include <linux/module.h> #include <linux/page_ext.h> +#include <linux/pgalloc_tag.h> #include <linux/proc_fs.h> #include <linux/seq_buf.h> #include <linux/seq_file.h>
@@ -22,6 +23,28 @@ struct allocinfo_private {bool print_header; }; +/* Should be called only if mem_alloc_profiling_enabled() */ +union codetag_ref *get_page_tag_ref (struct page *page) +{ +if (page) { +struct page_ext *page_ext =page_ext_get (page); + +if (page_ext) +return codetag_ref_from_page_ext (page_ext); + } +return NULL ; +} +EXPORT_SYMBOL_GPL (get_page_tag_ref); + +void put_page_tag_ref (union codetag_ref *ref) +{ +if (WARN_ON (!ref)) +return ; + +page_ext_put (page_ext_from_codetag_ref (ref)); +} +EXPORT_SYMBOL_GPL (put_page_tag_ref); +static void *allocinfo_start (struct seq_file *m,loff_t *pos) {struct allocinfo_private *priv;
Signature · 1 line
2.45.2.993.g49e7a77208-goog
Re: [PATCH 2/2] alloc_tag: outline and export {get|put}_page_tag_ref() used by modules
Thanks, this looks much better:
Re: [PATCH 2/2] alloc_tag: outline and export {get|put}_page_tag_ref() used by modules
In reply to Suren BaghdasaryanQuoted 8 lines · Suren Baghdasaryan
Outline and export
get_page_tag_ref()andput_page_tag_ref()so that modules can use them without exportingpage_ext_get()andpage_ext_put().Fixes dcfe378c81f7 ("lib: introduce support for page allocation tagging")Reported-by kernel test robot <[email protected]>Suggested-by Christoph Hellwig <[email protected]>Signed-off-by Suren Baghdasaryan <[email protected]>
Better than exporting page_ext but still seems like suboptimal level to me. You have various inline functions that use get/put_page_tag_ref and now will call into them both. IMHO outlining those (and leaving only the static key check inline) is the better way.
As for the report that triggered this, AFAICS it was due to free_reserved_page() so it could be enough to only outline that memalloc profiling part there and leave the rest as that seems to be used only from core code and no modules.
Quoted 87 lines
--- include/linux/pgalloc_tag.h | 23 +++-------------------- lib/alloc_tag.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-)include/linux/pgalloc_tag.h +3
-20@@ -13,6 +13,9 @@extern struct page_ext_operations page_alloc_tagging_ops; +union codetag_ref *get_page_tag_ref (struct page *page); +void put_page_tag_ref (union codetag_ref *ref); +static inline union codetag_ref *codetag_ref_from_page_ext (struct page_ext *page_ext) {return (void *)page_ext + page_alloc_tagging_ops.offset;@@ -23,26 +26,6 @@ static inline struct page_ext *page_ext_from_codetag_ref(union codetag_ref *ref)return (void *)ref - page_alloc_tagging_ops.offset; } -/* Should be called only if mem_alloc_profiling_enabled() */ -static inline union codetag_ref *get_page_tag_ref (struct page *page) -{ -if (page) { -struct page_ext *page_ext =page_ext_get (page); - -if (page_ext) -return codetag_ref_from_page_ext (page_ext); - } -return NULL ; -} - -static inline void put_page_tag_ref (union codetag_ref *ref) -{ -if (WARN_ON (!ref)) -return ; - -page_ext_put (page_ext_from_codetag_ref (ref)); -} -static inline void pgalloc_tag_add (struct page *page,struct task_struct *task,unsigned int nr) {lib/alloc_tag.c +23
-0@@ -4,6 +4,7 @@#include <linux/gfp.h> #include <linux/module.h> #include <linux/page_ext.h> +#include <linux/pgalloc_tag.h> #include <linux/proc_fs.h> #include <linux/seq_buf.h> #include <linux/seq_file.h> @@ -22,6 +23,28 @@ struct allocinfo_private {bool print_header; }; +/* Should be called only if mem_alloc_profiling_enabled() */ +union codetag_ref *get_page_tag_ref (struct page *page) +{ +if (page) { +struct page_ext *page_ext =page_ext_get (page); + +if (page_ext) +return codetag_ref_from_page_ext (page_ext); + } +return NULL ; +} +EXPORT_SYMBOL_GPL (get_page_tag_ref); + +void put_page_tag_ref (union codetag_ref *ref) +{ +if (WARN_ON (!ref)) +return ; + +page_ext_put (page_ext_from_codetag_ref (ref)); +} +EXPORT_SYMBOL_GPL (put_page_tag_ref); +static void *allocinfo_start (struct seq_file *m,loff_t *pos) {struct allocinfo_private *priv;
Suren Baghdasaryan
maintainerRe: [PATCH 2/2] alloc_tag: outline and export {get|put}_page_tag_ref() used by modules
Quoted 16 lines · Vlastimil Babka
Quoted 8 lines · Suren Baghdasaryan
Outline and export
get_page_tag_ref()andput_page_tag_ref()so that modules can use them without exportingpage_ext_get()andpage_ext_put().Fixes dcfe378c81f7 ("lib: introduce support for page allocation tagging")Reported-by kernel test robot <[email protected]>Suggested-by Christoph Hellwig <[email protected]>Signed-off-by Suren Baghdasaryan <[email protected]>Better than exporting
page_extbut still seems like suboptimal level to me. You have various inline functions that use get/put_page_tag_ref and now will call into them both. IMHO outlining those (and leaving only the static key check inline) is the better way.
Quoted 4 lines
As for the report that triggered this, AFAICS it was due to
free_reserved_page()so it could be enough to only outline that memalloc profiling part there and leave the rest as that seems to be used only from core code and no modules.
Doh! I didn't realize that's the only place these functions are used directly but looks like you are right. Outlining free_reserved_page() is definitely a much better solution with less performance impact. I'll post a replacement patch shortly.
Thanks Vlastimil!
Quoted 89 lines
Quoted 88 lines
--- include/linux/pgalloc_tag.h | 23 +++-------------------- lib/alloc_tag.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-)include/linux/pgalloc_tag.h +3
-20@@ -13,6 +13,9 @@extern struct page_ext_operations page_alloc_tagging_ops; +union codetag_ref *get_page_tag_ref (struct page *page); +void put_page_tag_ref (union codetag_ref *ref); +static inline union codetag_ref *codetag_ref_from_page_ext (struct page_ext *page_ext) {return (void *)page_ext + page_alloc_tagging_ops.offset;@@ -23,26 +26,6 @@ static inline struct page_ext *page_ext_from_codetag_ref(union codetag_ref *ref)return (void *)ref - page_alloc_tagging_ops.offset; } -/* Should be called only if mem_alloc_profiling_enabled() */ -static inline union codetag_ref *get_page_tag_ref (struct page *page) -{ -if (page) { -struct page_ext *page_ext =page_ext_get (page); - -if (page_ext) -return codetag_ref_from_page_ext (page_ext); - } -return NULL ; -} - -static inline void put_page_tag_ref (union codetag_ref *ref) -{ -if (WARN_ON (!ref)) -return ; - -page_ext_put (page_ext_from_codetag_ref (ref)); -} -static inline void pgalloc_tag_add (struct page *page,struct task_struct *task,unsigned int nr) {lib/alloc_tag.c +23
-0@@ -4,6 +4,7 @@#include <linux/gfp.h> #include <linux/module.h> #include <linux/page_ext.h> +#include <linux/pgalloc_tag.h> #include <linux/proc_fs.h> #include <linux/seq_buf.h> #include <linux/seq_file.h> @@ -22,6 +23,28 @@ struct allocinfo_private {bool print_header; }; +/* Should be called only if mem_alloc_profiling_enabled() */ +union codetag_ref *get_page_tag_ref (struct page *page) +{ +if (page) { +struct page_ext *page_ext =page_ext_get (page); + +if (page_ext) +return codetag_ref_from_page_ext (page_ext); + } +return NULL ; +} +EXPORT_SYMBOL_GPL (get_page_tag_ref); + +void put_page_tag_ref (union codetag_ref *ref) +{ +if (WARN_ON (!ref)) +return ; + +page_ext_put (page_ext_from_codetag_ref (ref)); +} +EXPORT_SYMBOL_GPL (put_page_tag_ref); +static void *allocinfo_start (struct seq_file *m,loff_t *pos) {struct allocinfo_private *priv;
Suren Baghdasaryan
maintainerRe: [PATCH 2/2] alloc_tag: outline and export {get|put}_page_tag_ref() used by modules
Quoted 23 lines · Suren Baghdasaryan
Quoted 16 lines · Vlastimil Babka
Quoted 8 lines · Suren Baghdasaryan
Outline and export
get_page_tag_ref()andput_page_tag_ref()so that modules can use them without exportingpage_ext_get()andpage_ext_put().Fixes dcfe378c81f7 ("lib: introduce support for page allocation tagging")Reported-by kernel test robot <[email protected]>Suggested-by Christoph Hellwig <[email protected]>Signed-off-by Suren Baghdasaryan <[email protected]>Better than exporting
page_extbut still seems like suboptimal level to me. You have various inline functions that use get/put_page_tag_ref and now will call into them both. IMHO outlining those (and leaving only the static key check inline) is the better way.Quoted 4 lines
As for the report that triggered this, AFAICS it was due to
free_reserved_page()so it could be enough to only outline that memalloc profiling part there and leave the rest as that seems to be used only from core code and no modules.
Quoted 5 lines
Doh! I didn't realize that's the only place these functions are used directly but looks like you are right. Outlining
free_reserved_page()is definitely a much better solution with less performance impact. I'll post a replacement patch shortly.
Thanks Vlastimil!
v2 posted at [1]
As a reminder for Andrew, the patchset [1] should replace the older patch [2] currently present in mm-unstable and mm-hotfixes-unstable.
[1] https://lore.kernel.org/all/[email protected]/
[2] ac5ca7954e4e ("alloc_tag: export memory allocation profiling symbols used by modules")
Thanks,
Suren.
Quoted 90 lines
Quoted 90 lines
Quoted 89 lines
--- include/linux/pgalloc_tag.h | 23 +++-------------------- lib/alloc_tag.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-)include/linux/pgalloc_tag.h +3
-20@@ -13,6 +13,9 @@extern struct page_ext_operations page_alloc_tagging_ops; +union codetag_ref *get_page_tag_ref (struct page *page); +void put_page_tag_ref (union codetag_ref *ref); +static inline union codetag_ref *codetag_ref_from_page_ext (struct page_ext *page_ext) {return (void *)page_ext + page_alloc_tagging_ops.offset;@@ -23,26 +26,6 @@ static inline struct page_ext *page_ext_from_codetag_ref(union codetag_ref *ref)return (void *)ref - page_alloc_tagging_ops.offset; } -/* Should be called only if mem_alloc_profiling_enabled() */ -static inline union codetag_ref *get_page_tag_ref (struct page *page) -{ -if (page) { -struct page_ext *page_ext =page_ext_get (page); - -if (page_ext) -return codetag_ref_from_page_ext (page_ext); - } -return NULL ; -} - -static inline void put_page_tag_ref (union codetag_ref *ref) -{ -if (WARN_ON (!ref)) -return ; - -page_ext_put (page_ext_from_codetag_ref (ref)); -} -static inline void pgalloc_tag_add (struct page *page,struct task_struct *task,unsigned int nr) {lib/alloc_tag.c +23
-0@@ -4,6 +4,7 @@#include <linux/gfp.h> #include <linux/module.h> #include <linux/page_ext.h> +#include <linux/pgalloc_tag.h> #include <linux/proc_fs.h> #include <linux/seq_buf.h> #include <linux/seq_file.h> @@ -22,6 +23,28 @@ struct allocinfo_private {bool print_header; }; +/* Should be called only if mem_alloc_profiling_enabled() */ +union codetag_ref *get_page_tag_ref (struct page *page) +{ +if (page) { +struct page_ext *page_ext =page_ext_get (page); + +if (page_ext) +return codetag_ref_from_page_ext (page_ext); + } +return NULL ; +} +EXPORT_SYMBOL_GPL (get_page_tag_ref); + +void put_page_tag_ref (union codetag_ref *ref) +{ +if (WARN_ON (!ref)) +return ; + +page_ext_put (page_ext_from_codetag_ref (ref)); +} +EXPORT_SYMBOL_GPL (put_page_tag_ref); +static void *allocinfo_start (struct seq_file *m,loff_t *pos) {struct allocinfo_private *priv;
Suren Baghdasaryan
maintainerQuoted 8 lines · Suren Baghdasaryan
Export
mem_alloc_profiling_keyas it is used by modules (indirectly viamem_alloc_profiling_enabled()).Fixes 22d407b164ff ("lib: add allocation tagging support for memory allocation profiling")Reported-by kernel test robot <[email protected]>Signed-off-by Suren Baghdasaryan <[email protected]>
This patchset should replace
https://lore.kernel.org/all/[email protected]
patch which was objected to by Christoph. I think this version should be acceptable.
Thanks,
Suren.
Quoted 21 lines
--- lib/alloc_tag.c | 1 + 1 file changed, 1 insertion(+)lib/alloc_tag.c +1
-0@@ -15,6 +15,7 @@ EXPORT_SYMBOL(_shared_alloc_tag);DEFINE_STATIC_KEY_MAYBE (CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT , mem_alloc_profiling_key); +EXPORT_SYMBOL (mem_alloc_profiling_key);struct allocinfo_private {struct codetag_iterator iter;base-commit:
0434dbe32053d07d658165be681505120c6b1abc--
2.45.2.993.g49e7a77208-goog
Quoted 7 lines · Suren Baghdasaryan
Export
mem_alloc_profiling_keyas it is used by modules (indirectly viamem_alloc_profiling_enabled()).Fixes 22d407b164ff ("lib: add allocation tagging support for memory allocation profiling")Reported-by kernel test robot <[email protected]>Signed-off-by Suren Baghdasaryan <[email protected]>
Quoted 18 lines
--- lib/alloc_tag.c | 1 + 1 file changed, 1 insertion(+)lib/alloc_tag.c +1
-0@@ -15,6 +15,7 @@ EXPORT_SYMBOL(_shared_alloc_tag);DEFINE_STATIC_KEY_MAYBE (CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT , mem_alloc_profiling_key); +EXPORT_SYMBOL (mem_alloc_profiling_key);struct allocinfo_private {struct codetag_iterator iter;base-commit:
0434dbe32053d07d658165be681505120c6b1abc