Linux 4.8+ compatibility fix for vm stats

vm_node_stat must be used instead of vm_zone_stat. Unfortunately the
old code still compiles potentially leading to silent failure of
arc_evictable_memory()

AKAMAI: CR 3816601: Regression in zfs dropcache test

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Debabrata Banerjee <dbanerje@akamai.com>
Closes #6528
This commit is contained in:
dbavatar 2017-08-24 13:48:23 -04:00 committed by Brian Behlendorf
parent 076e9b946e
commit 2209e40981
3 changed files with 28 additions and 0 deletions

View File

@ -0,0 +1,22 @@
dnl #
dnl # 4.8 API change
dnl # kernel vm counters change
dnl #
AC_DEFUN([ZFS_AC_KERNEL_VM_NODE_STAT], [
AC_MSG_CHECKING([whether to use vm_node_stat based fn's])
ZFS_LINUX_TRY_COMPILE([
#include <linux/mm.h>
#include <linux/vmstat.h>
],[
int a __attribute__ ((unused)) = NR_VM_NODE_STAT_ITEMS;
long x __attribute__ ((unused)) =
atomic_long_read(&vm_node_stat[0]);
(void) global_node_page_state(0);
],[
AC_MSG_RESULT(yes)
AC_DEFINE(ZFS_GLOBAL_NODE_PAGE_STATE, 1,
[using global_node_page_state()])
],[
AC_MSG_RESULT(no)
])
])

View File

@ -120,6 +120,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
ZFS_AC_KERNEL_RENAME_WANTS_FLAGS ZFS_AC_KERNEL_RENAME_WANTS_FLAGS
ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
ZFS_AC_KERNEL_CURRENT_TIME ZFS_AC_KERNEL_CURRENT_TIME
ZFS_AC_KERNEL_VM_NODE_STAT
AS_IF([test "$LINUX_OBJ" != "$LINUX"], [ AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"

View File

@ -5064,8 +5064,13 @@ arc_evictable_memory(void)
* Scale reported evictable memory in proportion to page cache, cap * Scale reported evictable memory in proportion to page cache, cap
* at specified min/max. * at specified min/max.
*/ */
#ifdef ZFS_GLOBAL_NODE_PAGE_STATE
uint64_t min = (ptob(global_node_page_state(NR_FILE_PAGES)) / 100) *
zfs_arc_pc_percent;
#else
uint64_t min = (ptob(global_page_state(NR_FILE_PAGES)) / 100) * uint64_t min = (ptob(global_page_state(NR_FILE_PAGES)) / 100) *
zfs_arc_pc_percent; zfs_arc_pc_percent;
#endif
min = MAX(arc_c_min, MIN(arc_c_max, min)); min = MAX(arc_c_min, MIN(arc_c_max, min));
if (arc_dirty >= min) if (arc_dirty >= min)