LINUX-5.7: replace __pagevec_lru_add with lru_cache_add_file 59/14159/8
authorCheyenne Wills <cwills@sinenomine.net>
Thu, 30 Apr 2020 16:31:17 +0000 (10:31 -0600)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 15 May 2020 16:09:40 +0000 (12:09 -0400)
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 <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/afs/LINUX/osi_vnodeops.c
src/cf/linux-kernel-func.m4

index df50a90..48c25aa 100644 (file)
 #endif
 #include <linux/pagemap.h>
 #include <linux/writeback.h>
-#include <linux/pagevec.h>
+#if defined(HAVE_LINUX_LRU_CACHE_ADD_FILE)
+# include <linux/swap.h>
+#else
+# include <linux/pagevec.h>
+#endif
 #include <linux/aio.h>
 #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
index 0569073..1d96699 100644 (file)
@@ -149,6 +149,11 @@ AC_CHECK_LINUX_FUNC([inode_lock],
                     [#include <linux/fs.h>],
                     [inode_lock(NULL);])
 
+dnl lru_cache_add_file added to Linux 2.6.28.
+AC_CHECK_LINUX_FUNC([lru_cache_add_file],
+                    [#include <linux/swap.h>],
+                    [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"],