hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I7Y9JD CVE: NA
---------------------------
This patch introduces a new configuration option called BPF_READAHEAD_OPTIMIZATION, which is designed to optimize the read performance in Spark SQL scenarios using eBPF to implement a programmable kernel.
The changes include:
- Add CONFIG_BPF_READAHEAD_OPTIMIZATION to mm/Kconfig, which depends on CONFIG_TRACEPOINTS.
- Add conditional compilation directives to fs/ext4/file.c, fs/read_write.c, fs/xfs/xfs_file.c, and include/linux/fs.h to include tracepoint-related headers and functions only when BPF_READAHEAD_OPTIMIZATION is enabled.
- Miodify page_cache_sync_ra() in mm/readahead.c to disable forced readahead when BPF_READAHEAD_OPTIMIZATION is not enabled.
V2: Explicitly set CONFIG_ in openeuler_defconfig. Do not add redundant macros to mm/readahead.
Signed-off-by: ZhaoLong Wang wangzhaolong1@huawei.com --- arch/arm64/configs/openeuler_defconfig | 1 + arch/powerpc/configs/openeuler_defconfig | 1 + arch/riscv/configs/openeuler_defconfig | 1 + arch/x86/configs/openeuler_defconfig | 1 + fs/ext4/file.c | 6 ++++++ fs/read_write.c | 2 +- fs/xfs/xfs_file.c | 7 ++++++- include/linux/fs.h | 9 +++++++++ mm/Kconfig | 9 +++++++++ 9 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/configs/openeuler_defconfig b/arch/arm64/configs/openeuler_defconfig index afd13d9e3840..fe3ad1d678b9 100644 --- a/arch/arm64/configs/openeuler_defconfig +++ b/arch/arm64/configs/openeuler_defconfig @@ -1191,6 +1191,7 @@ CONFIG_DYNAMIC_POOL=y CONFIG_ETMEM_SCAN=m CONFIG_ETMEM_SWAP=m CONFIG_ETMEM=y +# CONFIG_BPF_READAHEAD_OPTIMIZATION is not set
# # Data Access Monitoring diff --git a/arch/powerpc/configs/openeuler_defconfig b/arch/powerpc/configs/openeuler_defconfig index 152b941da1d5..793cca85862c 100644 --- a/arch/powerpc/configs/openeuler_defconfig +++ b/arch/powerpc/configs/openeuler_defconfig @@ -860,6 +860,7 @@ CONFIG_ARCH_HAS_HUGEPD=y CONFIG_USERFAULTFD=y # CONFIG_LRU_GEN is not set CONFIG_LOCK_MM_AND_FIND_VMA=y +# CONFIG_BPF_READAHEAD_OPTIMIZATION is not set
# # Data Access Monitoring diff --git a/arch/riscv/configs/openeuler_defconfig b/arch/riscv/configs/openeuler_defconfig index cb132f4576da..06caed7e855a 100644 --- a/arch/riscv/configs/openeuler_defconfig +++ b/arch/riscv/configs/openeuler_defconfig @@ -825,6 +825,7 @@ CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y CONFIG_PER_VMA_LOCK=y CONFIG_LOCK_MM_AND_FIND_VMA=y # CONFIG_PAGE_CACHE_LIMIT is not set +# CONFIG_BPF_READAHEAD_OPTIMIZATION is not set
# # Data Access Monitoring diff --git a/arch/x86/configs/openeuler_defconfig b/arch/x86/configs/openeuler_defconfig index 360c382f4d9e..da6c5bd3eaa1 100644 --- a/arch/x86/configs/openeuler_defconfig +++ b/arch/x86/configs/openeuler_defconfig @@ -1179,6 +1179,7 @@ CONFIG_DYNAMIC_POOL=y CONFIG_ETMEM_SCAN=m CONFIG_ETMEM_SWAP=m CONFIG_ETMEM=y +# CONFIG_BPF_READAHEAD_OPTIMIZATION is not set
# # Data Access Monitoring diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 324b45b51d1f..14f1441c3391 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -30,7 +30,9 @@ #include <linux/uio.h> #include <linux/mman.h> #include <linux/backing-dev.h> +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION #include <trace/events/fs.h> +#endif #include "ext4.h" #include "ext4_jbd2.h" #include "xattr.h" @@ -145,7 +147,9 @@ static ssize_t ext4_file_read_iter(struct kiocb *iocb, struct iov_iter *to) if (iocb->ki_flags & IOCB_DIRECT) return ext4_dio_read_iter(iocb, to);
+#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION fs_file_read_do_trace(iocb); +#endif return generic_file_read_iter(iocb, to); }
@@ -167,7 +171,9 @@ static ssize_t ext4_file_splice_read(struct file *in, loff_t *ppos, */ static int ext4_release_file(struct inode *inode, struct file *filp) { +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION trace_fs_file_release(inode, filp); +#endif
if (ext4_test_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE)) { ext4_alloc_da_blocks(inode); diff --git a/fs/read_write.c b/fs/read_write.c index 3d69fb284d10..2ee9a07f7208 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1721,7 +1721,7 @@ int generic_file_rw_checks(struct file *file_in, struct file *file_out) return 0; }
-#ifdef CONFIG_TRACEPOINTS +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION static void fs_file_read_ctx_init(struct fs_file_read_ctx *ctx, struct file *filp, loff_t pos) { diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ecf10d3aec17..7a4bd39bc694 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -31,7 +31,9 @@ #include <linux/mman.h> #include <linux/fadvise.h> #include <linux/mount.h> +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION #include <trace/events/fs.h> +#endif
static const struct vm_operations_struct xfs_file_vm_ops;
@@ -308,8 +310,9 @@ xfs_file_buffered_read( ssize_t ret;
trace_xfs_file_buffered_read(iocb, to); +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION fs_file_read_do_trace(iocb); - +#endif ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED); if (ret) return ret; @@ -1266,7 +1269,9 @@ xfs_file_release( struct inode *inode, struct file *filp) { +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION trace_fs_file_release(inode, filp); +#endif return xfs_release(XFS_I(inode)); }
diff --git a/include/linux/fs.h b/include/linux/fs.h index d74314a8fa94..5e09be647907 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -43,7 +43,9 @@ #include <linux/cred.h> #include <linux/mnt_idmapping.h> #include <linux/slab.h> +#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION #include <linux/tracepoint-defs.h> +#endif #include <linux/kabi.h>
#include <asm/byteorder.h> @@ -190,11 +192,16 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, /* File supports async nowait buffered writes */ #define FMODE_BUF_WASYNC ((__force fmode_t)0x80000000)
+#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION /* File mode control flag, expect random access pattern */ #define FMODE_CTL_RANDOM ((__force fmode_t)0x1000)
/* File mode control flag, will try to read head of the file into pagecache */ #define FMODE_CTL_WILLNEED ((__force fmode_t)0x400000) +#else +#define FMODE_CTL_RANDOM 0 +#define FMODE_CTL_WILLNEED 0 +#endif
/* * Attribute flags. These should be or-ed together to figure out what @@ -3524,6 +3531,7 @@ struct fs_file_read_ctx { long long index; };
+#ifdef CONFIG_BPF_READAHEAD_OPTIMIZATION #ifdef CONFIG_TRACEPOINTS DECLARE_TRACEPOINT(fs_file_read); extern void fs_file_read_update_args_by_trace(struct kiocb *iocb); @@ -3536,4 +3544,5 @@ static inline void fs_file_read_do_trace(struct kiocb *iocb) if (tracepoint_enabled(fs_file_read)) fs_file_read_update_args_by_trace(iocb); } +#endif #endif /* _LINUX_FS_H */ diff --git a/mm/Kconfig b/mm/Kconfig index cdbb1ceaa554..0c22baa52542 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -1424,6 +1424,15 @@ config ETMEM high-performance storage media to release memory space and reduce memory costs.
+config BPF_READAHEAD_OPTIMIZATION + bool "Enable bpf readahead optimization" + select TRACEPOINTS + default n + help + EBPF is used to implement a programmable kernel. The readahead behavior + of the kernel is adjusted based on the application read mode to optimize + the read performance in the Spark SQL scenario, + source "mm/damon/Kconfig"
endmenu
反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://gitee.com/openeuler/kernel/pulls/5953 邮件列表地址:https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/2...
FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://gitee.com/openeuler/kernel/pulls/5953 Mailing list address: https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/2...