]) # LC_HAS_LINUX_SELINUX_ENABLED
#
+# LC_ACCOUNT_PAGE_DIRTIED
+#
+# After 5.2 kernel page dirtied is not exported
+#
+AC_DEFUN([LC_ACCOUNT_PAGE_DIRTIED], [
+LB_CHECK_COMPILE([if 'account_page_dirtied' is exported],
+account_page_dirtied, [
+ #include <linux/mm.h>
+],[
+ account_page_dirtied(NULL, NULL);
+],[
+ AC_DEFINE(HAVE_ACCOUNT_PAGE_DIRTIED, 1,
+ [account_page_dirtied is available])
+])
+]) # LC_ACCOUNT_PAGE_DIRTIED
+
+#
# LC_BIO_BI_PHYS_SEGMENTS
#
# kernel 5.3-rc1 commit 14ccb66b3f585b2bc21e7256c96090abed5a512c
# 5.1
LC_HAS_LINUX_SELINUX_ENABLED
+ # 5.2
+ LC_ACCOUNT_PAGE_DIRTIED
+
# 5.3
LC_BIO_BI_PHYS_SEGMENTS
LC_LM_COMPARE_OWNER_EXISTS
/*
* Kernels 4.2 - 4.5 pass memcg argument to account_page_dirtied()
+ * Kernel v5.2-5678-gac1c3e4 no longer exports account_page_dirtied
*/
static inline void ll_account_page_dirtied(struct page *page,
struct address_space *mapping)
account_page_dirtied(page, mapping, memcg);
mem_cgroup_end_page_stat(memcg);
+#elif defined HAVE_ACCOUNT_PAGE_DIRTIED
+ account_page_dirtied(page, mapping, memcg);
#else
- account_page_dirtied(page, mapping);
+ typedef unsigned int (dirtied_t)(struct page *pg,
+ struct address_space *as);
+ const char *symbol = "account_page_dirtied";
+ static dirtied_t *dirtied = NULL;
+
+ if (!dirtied)
+ dirtied = (dirtied_t *)symbol_get(symbol);
+
+ if (dirtied)
+ dirtied(page, mapping);
#endif
}