Skip to content

Commit

Permalink
Linux 4.8+ compatibility fix for vm stats
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Chunwei Chen <[email protected]>
Signed-off-by: Debabrata Banerjee <[email protected]>
Closes openzfs#6528
  • Loading branch information
dbavatar authored and behlendorf committed Aug 24, 2017
1 parent 076e9b9 commit 2209e40
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
22 changes: 22 additions & 0 deletions config/kernel-vm_node_stat.m4
Original file line number Diff line number Diff line change
@@ -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)
])
])
1 change: 1 addition & 0 deletions config/kernel.m4
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
ZFS_AC_KERNEL_RENAME_WANTS_FLAGS
ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
ZFS_AC_KERNEL_CURRENT_TIME
ZFS_AC_KERNEL_VM_NODE_STAT
AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
Expand Down
5 changes: 5 additions & 0 deletions module/zfs/arc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5064,8 +5064,13 @@ arc_evictable_memory(void)
* Scale reported evictable memory in proportion to page cache, cap
* 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) *
zfs_arc_pc_percent;
#endif
min = MAX(arc_c_min, MIN(arc_c_max, min));

if (arc_dirty >= min)
Expand Down

0 comments on commit 2209e40

Please sign in to comment.