diff mbox series

[2/2] mm: reimplement si_mem_available()

Message ID 20211216124655.32247-3-zhengqi.arch@bytedance.com (mailing list archive)
State New
Headers show
Series add MemAvailable to per-node meminfo | expand

Commit Message

Qi Zheng Dec. 16, 2021, 12:46 p.m. UTC
Reimplement si_mem_available() by reusing si_mem_available_node().

Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
---
 mm/page_alloc.c | 45 +++++++--------------------------------------
 1 file changed, 7 insertions(+), 38 deletions(-)

Comments

Greg KH Dec. 16, 2021, 1:17 p.m. UTC | #1
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
kernel test robot Dec. 16, 2021, 3:06 p.m. UTC | #2
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/202112162327.HwWtuYUQ-lkp@intel.com/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 <lkp@intel.com>

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/kbuild-all@lists.01.org
Qi Zheng Dec. 16, 2021, 3:39 p.m. UTC | #3
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
>
kernel test robot Dec. 16, 2021, 6:21 p.m. UTC | #4
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/202112170216.SkyvfZzv-lkp@intel.com/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 <lkp@intel.com>

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/kbuild-all@lists.01.org
kernel test robot Dec. 16, 2021, 9:05 p.m. UTC | #5
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/202112170401.UyUM1wQ5-lkp@intel.com/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 <lkp@intel.com>

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/kbuild-all@lists.01.org
diff mbox series

Patch

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);