From 17b42fe67c18fab0003fb712092d36f06c93f2eb Mon Sep 17 00:00:00 2001 From: Cheyenne Wills Date: Thu, 30 Apr 2020 10:31:17 -0600 Subject: [PATCH] LINUX-5.7: replace __pagevec_lru_add with lru_cache_add_file The Linux function __pagevec_lru_add is no longer exported in Linux 5.7-rc1 commit bde07cfc65da5fe6c63fe23f035f5ccc0ffd89e0 "mm/swap.c: not necessary to export __pagevec_lru_add()". As a replacement, the Linux function lru_cache_add_file can be used for adding a page to the lru cache. The internal processing of lru_cache_add_file manages its own internal pagevec and performs the following: get_page(...) if(!pagevec_add(...)) __pagevec_lru_add_file(...) Introduce an autoconf test for lru_cache_add_file and replace the calls associated with __pagevec_lru_add with lru_cache_add_file. NOTE: see Linux commit a0b8cab3b9b2efadabdcff264c450ca515e2619c "mm: remove lru parameter from __pagevec_lru_add and remove parts of pagevec API" as a reference for this change. The lru_cache_add_file was introduced in Linux 2.6.28, therefore this change affects systems with Linux 2.6.28 kernels and later. Change-Id: I12b32fd5061fc136f8b96ef3605e0bab736ca9ed Reviewed-on: https://gerrit.openafs.org/14159 Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk Tested-by: BuildBot --- src/afs/LINUX/osi_vnodeops.c | 49 +++++++++++++++++++++++++++++++++++++------- src/cf/linux-kernel-func.m4 | 5 +++++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index df50a90..48c25aa 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -31,7 +31,11 @@ #endif #include #include -#include +#if defined(HAVE_LINUX_LRU_CACHE_ADD_FILE) +# include +#else +# include +#endif #include #include "afs/lock.h" #include "afs/afs_bypasscache.h" @@ -67,6 +71,36 @@ extern struct vcache *afs_globalVp; /* Handle interfacing with Linux's pagevec/lru facilities */ +#if defined(HAVE_LINUX_LRU_CACHE_ADD_FILE) + +/* + * Linux's lru_cache_add_file provides a simplified LRU interface without + * needing a pagevec + */ +struct afs_lru_pages { + char unused; +}; + +static inline void +afs_lru_cache_init(struct afs_lru_pages *alrupages) +{ + return; +} + +static inline void +afs_lru_cache_add(struct afs_lru_pages *alrupages, struct page *page) +{ + lru_cache_add_file(page); +} + +static inline void +afs_lru_cache_finalize(struct afs_lru_pages *alrupages) +{ + return; +} +#else + +/* Linux's pagevec/lru interfaces require a pagevec */ struct afs_lru_pages { struct pagevec lrupv; }; @@ -74,16 +108,16 @@ struct afs_lru_pages { static inline void afs_lru_cache_init(struct afs_lru_pages *alrupages) { -#if defined(PAGEVEC_INIT_COLD_ARG) +# if defined(PAGEVEC_INIT_COLD_ARG) pagevec_init(&alrupages->lrupv, 0); -#else +# else pagevec_init(&alrupages->lrupv); -#endif +# endif } -#ifndef HAVE_LINUX_PAGEVEC_LRU_ADD_FILE -# define __pagevec_lru_add_file __pagevec_lru_add -#endif +# ifndef HAVE_LINUX_PAGEVEC_LRU_ADD_FILE +# define __pagevec_lru_add_file __pagevec_lru_add +# endif static inline void afs_lru_cache_add(struct afs_lru_pages *alrupages, struct page *page) @@ -99,6 +133,7 @@ afs_lru_cache_finalize(struct afs_lru_pages *alrupages) if (pagevec_count(&alrupages->lrupv)) __pagevec_lru_add_file(&alrupages->lrupv); } +#endif /* !HAVE_LINUX_LRU_ADD_FILE */ /* This function converts a positive error code from AFS into a negative * code suitable for passing into the Linux VFS layer. It checks that the diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4 index 0569073..1d96699 100644 --- a/src/cf/linux-kernel-func.m4 +++ b/src/cf/linux-kernel-func.m4 @@ -149,6 +149,11 @@ AC_CHECK_LINUX_FUNC([inode_lock], [#include ], [inode_lock(NULL);]) +dnl lru_cache_add_file added to Linux 2.6.28. +AC_CHECK_LINUX_FUNC([lru_cache_add_file], + [#include ], + [lru_cache_add_file(NULL);]) + dnl Consequences - things which get set as a result of the dnl above tests AS_IF([test "x$ac_cv_linux_func_d_alloc_anon" = "xno"], -- 1.9.4