]) # LC_HAVE_FILE_OPERATIONS_READ_WRITE_ITER
#
+# LC_PAGECACHE_GET_PAGE
+#
+# Kernel version 3.16 commit 2457aec63745e235bcafb7ef312b182d8682f0fc
+# @pagecache_get_page was introduced since Linux 3.16
+#
+AC_DEFUN([LC_SRC_PAGECACHE_GET_PAGE], [
+ LB2_LINUX_TEST_SRC([pagecache_get_page], [
+ #include <linux/pagemap.h>
+ ],[
+ pagecache_get_page(NULL, 0, 0, 0);
+ ])
+])
+AC_DEFUN([LC_PAGECACHE_GET_PAGE], [
+ AC_MSG_CHECKING([if 'pagecache_get_page' exists])
+ LB2_LINUX_TEST_RESULT([pagecache_get_page], [
+ AC_DEFINE(HAVE_PAGECACHE_GET_PAGE, 1,
+ ['pagecache_get_page' is available])
+ ])
+]) # LC_PAGECACHE_GET_PAGE
+
+#
# LC_HAVE_INTERVAL_BLK_INTEGRITY
#
# 3.17 replace sector_size with interval in struct blk_integrity
LC_SRC_HAVE_IOV_ITER_INIT_DIRECTION
LC_SRC_HAVE_IOV_ITER_TRUNCATE
LC_SRC_HAVE_FILE_OPERATIONS_READ_WRITE_ITER
+ LC_SRC_PAGECACHE_GET_PAGE
# 3.17
LC_SRC_HAVE_INTERVAL_BLK_INTEGRITY
LC_HAVE_IOV_ITER_INIT_DIRECTION
LC_HAVE_IOV_ITER_TRUNCATE
LC_HAVE_FILE_OPERATIONS_READ_WRITE_ITER
+ LC_PAGECACHE_GET_PAGE
# 3.17
LC_HAVE_INTERVAL_BLK_INTEGRITY
# define inode_trylock(inode) mutex_trylock(&(inode)->i_mutex)
#endif
+#ifndef HAVE_PAGECACHE_GET_PAGE
+#define pagecache_get_page(mapping, index, fp, gfp) \
+ grab_cache_page_nowait(mapping, index)
+#endif
+
/* Old kernels lacked both Xarray support and the page cache
* using Xarrays. Our back ported Xarray support introduces
* the real xa_is_value() but we need a wrapper as well for
switch (hint) {
case MAYNEED:
- vmpage = grab_cache_page_nowait(inode->i_mapping, index);
+ /*
+ * We need __GFP_NORETRY here for read-ahead page, otherwise
+ * the process will fail with OOM killed due to memcg limit.
+ * See @readahead_gfp_mask for an example.
+ */
+ vmpage = pagecache_get_page(inode->i_mapping, index,
+ FGP_LOCK | FGP_CREAT |
+ FGP_NOFS | FGP_NOWAIT,
+ mapping_gfp_mask(inode->i_mapping) |
+ __GFP_NORETRY | __GFP_NOWARN);
if (vmpage == NULL) {
which = RA_STAT_FAILED_GRAB_PAGE;
msg = "g_c_p_n failed";