Use linked lists instead of arrays for relay buffers.
RFC PATCH 12/21 Use linked lists instead of arrays for relay buffers.
--- include/linux/relay.h | 12 ++++- kernel/relay.c | 108 ++++++++++++++++++++++++------------------------ 2 files changed, 63 insertions(+), 57 deletions(-)
include/linux/relay.h +9 -3
@@ -30,14 +30,21 @@#define RCHAN_MODE_OVERWRITE 0x00000001/* 'flight' mode */ #define RCHAN_GLOBAL_BUFFER 0x00000002/* not using per-cpu */ +struct relay_page +{ +struct page *page; +struct list_head list; +}; +/* * Per-cpu relay channel buffer */ struct rchan_buf {void *data;/* address of current page */ -struct page *page;/* current page */ +struct relay_page *page;/* current write page */ size_t offset;/* current offset into page */ +size_t consumed_offset;/* bytes consumed in cur page */ size_t produced;/* count of pages produced */ size_t consumed;/* count of pages consumed */ struct rchan *chan;/* associated channel */
@@ -45,10 +52,9 @@ struct rchan_bufstruct timer_list timer;/* reader wake-up timer */ struct dentry *dentry;/* channel file dentry */ struct kref kref;/* channel buffer refcount */ -struct page **page_array;/* array of current buffer pages */ +struct list_head pages;/* current set of unconsumed pages */ unsigned int page_count;/* number of current buffer pages */ unsigned int finalized;/* buffer has been finalized */ -size_t consumed_offset;/* bytes consumed in cur page */ size_t early_bytes;/* bytes consumed before VFS inited */ unsigned int cpu;/* this buf's cpu */ }____cacheline_aligned ;
kernel/relay.c +54 -54
207 lines not on this page · raw message
Signature · 1 line
1.5.3.5