Hi,
This patch series aims to add "MemAvailable" to per-node meminfo.
This series is based on next-20211215.
Comments and suggestions are welcome.
Thanks,
Qi
Qi Zheng (2):
mm: add MemAvailable to per-node meminfo
mm: reimplement si_mem_available()
drivers/base/node.c | 4 ++++
include/linux/mm.h | 1 +
include/linux/mmzone.h | 5 +++++
mm/page_alloc.c | 44 +++++++++++++++++++++++++++++++-------------
4 files changed, 41 insertions(+), 13 deletions(-)
--
2.11.0
In /proc/meminfo, we can show the sum of all the available memory
as "MemAvailable". Add the same counter also to per-node meminfo
under /sys.
With this counter, some processes that bind nodes can make some
decisions by reading the "MemAvailable" of the corresponding nodes
directly.
Signed-off-by: Qi Zheng <[email protected]>
---
drivers/base/node.c | 4 ++++
include/linux/mm.h | 1 +
include/linux/mmzone.h | 5 +++++
mm/page_alloc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 59 insertions(+)
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 87acc47e8951..deb2a7965ae4 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -375,8 +375,10 @@ static ssize_t node_read_meminfo(struct device *dev,
struct sysinfo i;
unsigned long sreclaimable, sunreclaimable;
unsigned long swapcached = 0;
+ long available;
si_meminfo_node(&i, nid);
+ available = si_mem_available_node(&i, nid);
sreclaimable = node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B);
sunreclaimable = node_page_state_pages(pgdat, NR_SLAB_UNRECLAIMABLE_B);
#ifdef CONFIG_SWAP
@@ -386,6 +388,7 @@ static ssize_t node_read_meminfo(struct device *dev,
"Node %d MemTotal: %8lu kB\n"
"Node %d MemFree: %8lu kB\n"
"Node %d MemUsed: %8lu kB\n"
+ "Node %d MemAvailable: %8lu kB\n"
"Node %d SwapCached: %8lu kB\n"
"Node %d Active: %8lu kB\n"
"Node %d Inactive: %8lu kB\n"
@@ -398,6 +401,7 @@ static ssize_t node_read_meminfo(struct device *dev,
nid, K(i.totalram),
nid, K(i.freeram),
nid, K(i.totalram - i.freeram),
+ nid, K(available),
nid, K(swapcached),
nid, K(node_page_state(pgdat, NR_ACTIVE_ANON) +
node_page_state(pgdat, NR_ACTIVE_FILE)),
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 1d4f731a8e18..34a5f5df388b 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2532,6 +2532,7 @@ extern void mem_init(void);
extern void __init mmap_init(void);
extern void show_mem(unsigned int flags, nodemask_t *nodemask);
extern long si_mem_available(void);
+extern long si_mem_available_node(struct sysinfo *val, int nid);
extern void si_meminfo(struct sysinfo * val);
extern void si_meminfo_node(struct sysinfo *val, int nid);
#ifdef __HAVE_ARCH_RESERVED_KERNEL_PAGES
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 936dc0b6c226..321c12f6272f 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -1132,6 +1132,11 @@ extern struct zone *next_zone(struct zone *zone);
; /* do nothing */ \
else
+#define for_each_pgdat_zone(pgdat, zone) \
+ for (zone = (pgdat)->node_zones; \
+ zone < (pgdat)->node_zones + MAX_NR_ZONES - 1 && zone; \
+ zone++)
+
static inline struct zone *zonelist_zone(struct zoneref *zoneref)
{
return zoneref->zone;
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index edfd6c81af82..31f5e3e335cf 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5731,6 +5731,55 @@ static inline void show_node(struct zone *zone)
printk("Node %d ", zone_to_nid(zone));
}
+/**
+ * si_mem_available_node - helper to calculate the size of available memory
+ * of the given node
+ * @val: pointer to struct sysinfo
+ * @nid: the node id
+ */
+long si_mem_available_node(struct sysinfo *val, int nid)
+{
+ long available;
+ unsigned long pagecache;
+ unsigned long reclaimable;
+ unsigned long wmark_low = 0;
+ struct pglist_data *pgdat = NODE_DATA(nid);
+ struct zone *zone;
+
+ for_each_pgdat_zone(pgdat, zone)
+ wmark_low += low_wmark_pages(zone);
+
+ /*
+ * Estimate the amount of memory available for userspace allocations,
+ * without causing swapping.
+ */
+ available = val->freeram - pgdat->totalreserve_pages;
+
+ /*
+ * Not all the page cache can be freed, otherwise the system will
+ * start swapping. Assume at least half of the page cache, or the
+ * low watermark worth of cache, needs to stay.
+ */
+ pagecache = node_page_state(pgdat, NR_ACTIVE_FILE) +
+ node_page_state(pgdat, NR_INACTIVE_FILE);
+ pagecache -= min(pagecache / 2, wmark_low);
+ available += pagecache;
+
+ /*
+ * Part of the reclaimable slab and other kernel memory consists of
+ * items that are in use, and cannot be freed. Cap this estimate at the
+ * low watermark.
+ */
+ reclaimable = node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B) +
+ node_page_state(pgdat, NR_KERNEL_MISC_RECLAIMABLE);
+ reclaimable -= min(reclaimable / 2, wmark_low);
+ available += reclaimable;
+
+ if (available < 0)
+ available = 0;
+ return available;
+}
+
long si_mem_available(void)
{
long available;
--
2.11.0
Reimplement si_mem_available() by reusing si_mem_available_node().
Signed-off-by: Qi Zheng <[email protected]>
---
mm/page_alloc.c | 45 +++++++--------------------------------------
1 file changed, 7 insertions(+), 38 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 31f5e3e335cf..0982372c8e49 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5782,46 +5782,15 @@ long si_mem_available_node(struct sysinfo *val, int nid)
long si_mem_available(void)
{
- long available;
- unsigned long pagecache;
- unsigned long wmark_low = 0;
- unsigned long pages[NR_LRU_LISTS];
- unsigned long reclaimable;
- struct zone *zone;
- int lru;
-
- for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
- pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
-
- for_each_zone(zone)
- wmark_low += low_wmark_pages(zone);
-
- /*
- * Estimate the amount of memory available for userspace allocations,
- * without causing swapping.
- */
- available = global_zone_page_state(NR_FREE_PAGES) - totalreserve_pages;
-
- /*
- * Not all the page cache can be freed, otherwise the system will
- * start swapping. Assume at least half of the page cache, or the
- * low watermark worth of cache, needs to stay.
- */
- pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
- pagecache -= min(pagecache / 2, wmark_low);
- available += pagecache;
+ long available = 0;
+ struct sysinfo i;
+ int nid;
- /*
- * Part of the reclaimable slab and other kernel memory consists of
- * items that are in use, and cannot be freed. Cap this estimate at the
- * low watermark.
- */
- reclaimable = global_node_page_state_pages(NR_SLAB_RECLAIMABLE_B) +
- global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE);
- available += reclaimable - min(reclaimable / 2, wmark_low);
+ for_each_online_node(nid) {
+ si_meminfo_node(&i, nid);
+ available += si_mem_available_node(&i, nid);
+ }
- if (available < 0)
- available = 0;
return available;
}
EXPORT_SYMBOL_GPL(si_mem_available);
--
2.11.0
On Thu, Dec 16, 2021 at 08:46:54PM +0800, Qi Zheng wrote:
> In /proc/meminfo, we can show the sum of all the available memory
> as "MemAvailable". Add the same counter also to per-node meminfo
> under /sys.
>
> With this counter, some processes that bind nodes can make some
> decisions by reading the "MemAvailable" of the corresponding nodes
> directly.
>
> Signed-off-by: Qi Zheng <[email protected]>
> ---
> drivers/base/node.c | 4 ++++
> include/linux/mm.h | 1 +
> include/linux/mmzone.h | 5 +++++
> mm/page_alloc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 59 insertions(+)
>
> diff --git a/drivers/base/node.c b/drivers/base/node.c
> index 87acc47e8951..deb2a7965ae4 100644
> --- a/drivers/base/node.c
> +++ b/drivers/base/node.c
> @@ -375,8 +375,10 @@ static ssize_t node_read_meminfo(struct device *dev,
> struct sysinfo i;
> unsigned long sreclaimable, sunreclaimable;
> unsigned long swapcached = 0;
> + long available;
>
> si_meminfo_node(&i, nid);
> + available = si_mem_available_node(&i, nid);
> sreclaimable = node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B);
> sunreclaimable = node_page_state_pages(pgdat, NR_SLAB_UNRECLAIMABLE_B);
> #ifdef CONFIG_SWAP
> @@ -386,6 +388,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> "Node %d MemTotal: %8lu kB\n"
> "Node %d MemFree: %8lu kB\n"
> "Node %d MemUsed: %8lu kB\n"
> + "Node %d MemAvailable: %8lu kB\n"
You just changed a user/kernel api without documenting it anywhere, or
ensuring that you did not just break anything.
Also, this api is crazy, and not ok, please never add anything new to
it, it is broken as-is.
thanks,
greg k-h
On Thu, Dec 16, 2021 at 08:46:55PM +0800, Qi Zheng wrote:
> Reimplement si_mem_available() by reusing si_mem_available_node().
That says what you did, but not why. Why are you doing this?
And what does it have to do with patch 1/2?
thanks,
greg k-h
Hi Qi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on hnaz-mm/master]
[also build test ERROR on driver-core/driver-core-testing linux/master linus/master v5.16-rc5 next-20211215]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Qi-Zheng/add-MemAvailable-to-per-node-meminfo/20211216-204828
base: https://github.com/hnaz/linux-mm master
config: um-i386_defconfig (https://download.01.org/0day-ci/archive/20211216/[email protected]/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/7980664f23d619d15a3931fe1ab7d1dbafad7c88
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Qi-Zheng/add-MemAvailable-to-per-node-meminfo/20211216-204828
git checkout 7980664f23d619d15a3931fe1ab7d1dbafad7c88
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=um SUBARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
All errors (new ones prefixed by >>):
/usr/bin/ld: mm/page_alloc.o: in function `si_mem_available':
>> page_alloc.c:(.text+0x3083): undefined reference to `si_meminfo_node'
collect2: error: ld returned 1 exit status
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]
On 12/16/21 9:16 PM, Greg KH wrote:
> On Thu, Dec 16, 2021 at 08:46:54PM +0800, Qi Zheng wrote:
>> In /proc/meminfo, we can show the sum of all the available memory
>> as "MemAvailable". Add the same counter also to per-node meminfo
>> under /sys.
>>
>> With this counter, some processes that bind nodes can make some
>> decisions by reading the "MemAvailable" of the corresponding nodes
>> directly.
>>
>> Signed-off-by: Qi Zheng <[email protected]>
>> ---
>> drivers/base/node.c | 4 ++++
>> include/linux/mm.h | 1 +
>> include/linux/mmzone.h | 5 +++++
>> mm/page_alloc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>> 4 files changed, 59 insertions(+)
>>
>> diff --git a/drivers/base/node.c b/drivers/base/node.c
>> index 87acc47e8951..deb2a7965ae4 100644
>> --- a/drivers/base/node.c
>> +++ b/drivers/base/node.c
>> @@ -375,8 +375,10 @@ static ssize_t node_read_meminfo(struct device *dev,
>> struct sysinfo i;
>> unsigned long sreclaimable, sunreclaimable;
>> unsigned long swapcached = 0;
>> + long available;
>>
>> si_meminfo_node(&i, nid);
>> + available = si_mem_available_node(&i, nid);
>> sreclaimable = node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B);
>> sunreclaimable = node_page_state_pages(pgdat, NR_SLAB_UNRECLAIMABLE_B);
>> #ifdef CONFIG_SWAP
>> @@ -386,6 +388,7 @@ static ssize_t node_read_meminfo(struct device *dev,
>> "Node %d MemTotal: %8lu kB\n"
>> "Node %d MemFree: %8lu kB\n"
>> "Node %d MemUsed: %8lu kB\n"
>> + "Node %d MemAvailable: %8lu kB\n"
>
> You just changed a user/kernel api without documenting it anywhere, or
> ensuring that you did not just break anything.
Hi greg k-h,
The MemAvailable has long existed in the /proc/meminfo, it's meaning
has been described in the Documentation/filesystems/proc.rst. Since
the semantics of per-node MemAvailable has not changed, so I did not
add a new document description.
>
> Also, this api is crazy, and not ok, please never add anything new to
> it, it is broken as-is.
The consideration of adding per-node MemAvailable is that some processes
that bind nodes need this information to do some decisions.
Now their approach is to read other information in per-node meminfo
and /proc/sys/vm/watermark_scale_factor, and then approximate this
value. With this counter, they can directly read
/sys/devices/system/node/node*/meminfo to get the MemAvailable
information of each node.
And MemTotal, MemFree and SReclaimable(etc.) all have corresponding
per-node versions, so I think that adding per-node MemAvailable might
also make sense. :)
Thanks,
Qi
>
> thanks,
>
> greg k-h
>
--
Thanks,
Qi
On Thu, Dec 16, 2021 at 11:31:36PM +0800, Qi Zheng wrote:
>
>
> On 12/16/21 9:16 PM, Greg KH wrote:
> > On Thu, Dec 16, 2021 at 08:46:54PM +0800, Qi Zheng wrote:
> > > In /proc/meminfo, we can show the sum of all the available memory
> > > as "MemAvailable". Add the same counter also to per-node meminfo
> > > under /sys.
> > >
> > > With this counter, some processes that bind nodes can make some
> > > decisions by reading the "MemAvailable" of the corresponding nodes
> > > directly.
> > >
> > > Signed-off-by: Qi Zheng <[email protected]>
> > > ---
> > > drivers/base/node.c | 4 ++++
> > > include/linux/mm.h | 1 +
> > > include/linux/mmzone.h | 5 +++++
> > > mm/page_alloc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
> > > 4 files changed, 59 insertions(+)
> > >
> > > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > > index 87acc47e8951..deb2a7965ae4 100644
> > > --- a/drivers/base/node.c
> > > +++ b/drivers/base/node.c
> > > @@ -375,8 +375,10 @@ static ssize_t node_read_meminfo(struct device *dev,
> > > struct sysinfo i;
> > > unsigned long sreclaimable, sunreclaimable;
> > > unsigned long swapcached = 0;
> > > + long available;
> > > si_meminfo_node(&i, nid);
> > > + available = si_mem_available_node(&i, nid);
> > > sreclaimable = node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B);
> > > sunreclaimable = node_page_state_pages(pgdat, NR_SLAB_UNRECLAIMABLE_B);
> > > #ifdef CONFIG_SWAP
> > > @@ -386,6 +388,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> > > "Node %d MemTotal: %8lu kB\n"
> > > "Node %d MemFree: %8lu kB\n"
> > > "Node %d MemUsed: %8lu kB\n"
> > > + "Node %d MemAvailable: %8lu kB\n"
> >
> > You just changed a user/kernel api without documenting it anywhere, or
> > ensuring that you did not just break anything.
>
> Hi greg k-h,
>
> The MemAvailable has long existed in the /proc/meminfo, it's meaning
> has been described in the Documentation/filesystems/proc.rst. Since
> the semantics of per-node MemAvailable has not changed, so I did not
> add a new document description.
This is not a proc file, it is in sysfs.
And it violates all of the sysfs rules, and has all of the problems that
proc files have. So the worst of both worlds :(
> > Also, this api is crazy, and not ok, please never add anything new to
> > it, it is broken as-is.
>
> The consideration of adding per-node MemAvailable is that some processes
> that bind nodes need this information to do some decisions.
>
> Now their approach is to read other information in per-node meminfo
> and /proc/sys/vm/watermark_scale_factor, and then approximate this
> value. With this counter, they can directly read
> /sys/devices/system/node/node*/meminfo to get the MemAvailable
> information of each node.
>
> And MemTotal, MemFree and SReclaimable(etc.) all have corresponding
> per-node versions, so I think that adding per-node MemAvailable might
> also make sense. :)
Please no, I do not want new things added to this file, as you might
break parsers of this file.
Also, again, you did not document this at all in Documentation/ABI/ so
for that reason alone it is not ok.
thanks,
greg k-h
On 12/16/21 9:17 PM, Greg KH wrote:
> On Thu, Dec 16, 2021 at 08:46:55PM +0800, Qi Zheng wrote:
>> Reimplement si_mem_available() by reusing si_mem_available_node().
>
> That says what you did, but not why. Why are you doing this?
Oh, sorry, I will add that.
>
> And what does it have to do with patch 1/2?
With [PATCH 1/2], we can simply sum the MemAvailable of each node
to get the gobal MemAvailable. Essentially this is a cleanup, no
functional changes.
Thanks,
Qi
>
> thanks,
>
> greg k-h
>
--
Thanks,
Qi
On 12/16/21 11:37 PM, Greg KH wrote:
> On Thu, Dec 16, 2021 at 11:31:36PM +0800, Qi Zheng wrote:
>>
>>
>> On 12/16/21 9:16 PM, Greg KH wrote:
>>> On Thu, Dec 16, 2021 at 08:46:54PM +0800, Qi Zheng wrote:
>>>> In /proc/meminfo, we can show the sum of all the available memory
>>>> as "MemAvailable". Add the same counter also to per-node meminfo
>>>> under /sys.
>>>>
>>>> With this counter, some processes that bind nodes can make some
>>>> decisions by reading the "MemAvailable" of the corresponding nodes
>>>> directly.
>>>>
>>>> Signed-off-by: Qi Zheng <[email protected]>
>>>> ---
>>>> drivers/base/node.c | 4 ++++
>>>> include/linux/mm.h | 1 +
>>>> include/linux/mmzone.h | 5 +++++
>>>> mm/page_alloc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>>>> 4 files changed, 59 insertions(+)
>>>>
>>>> diff --git a/drivers/base/node.c b/drivers/base/node.c
>>>> index 87acc47e8951..deb2a7965ae4 100644
>>>> --- a/drivers/base/node.c
>>>> +++ b/drivers/base/node.c
>>>> @@ -375,8 +375,10 @@ static ssize_t node_read_meminfo(struct device *dev,
>>>> struct sysinfo i;
>>>> unsigned long sreclaimable, sunreclaimable;
>>>> unsigned long swapcached = 0;
>>>> + long available;
>>>> si_meminfo_node(&i, nid);
>>>> + available = si_mem_available_node(&i, nid);
>>>> sreclaimable = node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B);
>>>> sunreclaimable = node_page_state_pages(pgdat, NR_SLAB_UNRECLAIMABLE_B);
>>>> #ifdef CONFIG_SWAP
>>>> @@ -386,6 +388,7 @@ static ssize_t node_read_meminfo(struct device *dev,
>>>> "Node %d MemTotal: %8lu kB\n"
>>>> "Node %d MemFree: %8lu kB\n"
>>>> "Node %d MemUsed: %8lu kB\n"
>>>> + "Node %d MemAvailable: %8lu kB\n"
>>>
>>> You just changed a user/kernel api without documenting it anywhere, or
>>> ensuring that you did not just break anything.
>>
>> Hi greg k-h,
>>
>> The MemAvailable has long existed in the /proc/meminfo, it's meaning
>> has been described in the Documentation/filesystems/proc.rst. Since
>> the semantics of per-node MemAvailable has not changed, so I did not
>> add a new document description.
>
> This is not a proc file, it is in sysfs.
>
> And it violates all of the sysfs rules, and has all of the problems that
> proc files have. So the worst of both worlds :(
>
>>> Also, this api is crazy, and not ok, please never add anything new to
>>> it, it is broken as-is.
>>
>> The consideration of adding per-node MemAvailable is that some processes
>> that bind nodes need this information to do some decisions.
>>
>> Now their approach is to read other information in per-node meminfo
>> and /proc/sys/vm/watermark_scale_factor, and then approximate this
>> value. With this counter, they can directly read
>> /sys/devices/system/node/node*/meminfo to get the MemAvailable
>> information of each node.
>>
>> And MemTotal, MemFree and SReclaimable(etc.) all have corresponding
>> per-node versions, so I think that adding per-node MemAvailable might
>> also make sense. :)
>
> Please no, I do not want new things added to this file, as you might
> break parsers of this file.
OK, Got it.
Thank,
Qi
>
> Also, again, you did not document this at all in Documentation/ABI/ so
> for that reason alone it is not ok.
>
> thanks,
>
> greg k-h
>
--
Thanks,
Qi
Hi Qi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on hnaz-mm/master]
[also build test ERROR on driver-core/driver-core-testing linux/master linus/master v5.16-rc5 next-20211215]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Qi-Zheng/add-MemAvailable-to-per-node-meminfo/20211216-204828
base: https://github.com/hnaz/linux-mm master
config: hexagon-randconfig-r045-20211216 (https://download.01.org/0day-ci/archive/20211217/[email protected]/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project dd245bab9fbb364faa1581e4f92ba3119a872fba)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/7980664f23d619d15a3931fe1ab7d1dbafad7c88
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Qi-Zheng/add-MemAvailable-to-per-node-meminfo/20211216-204828
git checkout 7980664f23d619d15a3931fe1ab7d1dbafad7c88
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
All errors (new ones prefixed by >>):
>> ld.lld: error: undefined symbol: si_meminfo_node
>>> referenced by page_alloc.c
>>> page_alloc.o:(si_mem_available) in archive mm/built-in.a
>>> referenced by page_alloc.c
>>> page_alloc.o:(si_mem_available) in archive mm/built-in.a
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]
Hi Qi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on hnaz-mm/master]
[also build test ERROR on driver-core/driver-core-testing linux/master linus/master v5.16-rc5 next-20211215]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Qi-Zheng/add-MemAvailable-to-per-node-meminfo/20211216-204828
base: https://github.com/hnaz/linux-mm master
config: arc-randconfig-r043-20211216 (https://download.01.org/0day-ci/archive/20211217/[email protected]/config)
compiler: arc-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/7980664f23d619d15a3931fe1ab7d1dbafad7c88
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Qi-Zheng/add-MemAvailable-to-per-node-meminfo/20211216-204828
git checkout 7980664f23d619d15a3931fe1ab7d1dbafad7c88
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
All errors (new ones prefixed by >>):
arc-elf-ld: mm/page_alloc.o: in function `si_mem_available':
>> (.text+0x8248): undefined reference to `si_meminfo_node'
>> arc-elf-ld: (.text+0x8248): undefined reference to `si_meminfo_node'
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]