relay - Clean up relay_switch_subbuf() and make waking up consumers optional.
RFC PATCH 1/11 relay - Clean up relay_switch_subbuf() and make waking up consumers optional.
Clean up relay_switch_subbuf() and make waking up consumers optional.
Over time, relay_switch_subbuf() has accumulated some cruft - this patch cleans it up and at the same time makes available some of it available as common functions that any subbuf-switch implementor would need (this is partially in preparation for the next patch, which makes the subbuf-switch function completely replaceable). It also removes the hard-coded reader wakeup and moves it into a replaceable callback called notify_consumers(); this allows any given tracer to implement consumer notification as it sees fit.
Signed-off-by Tom Zanussi <[email protected]>
--- include/linux/relay.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ kernel/relay.c | 43 +++++++++++++++++++++++------------------ 2 files changed, 75 insertions(+), 19 deletions(-)
include/linux/relay.h +51 -0
@@ -159,6 +159,15 @@ struct rchan_callbacks* The callback should return 0 if successful, negative if not. */ int (*remove_buf_file)(struct dentry *dentry); + +/* +* notify_consumers - new sub-buffer available, let consumers know +* @buf: the channel buffer +* +* Called during sub-buffer switch. Applications which don't +* want to notify anyone should implement an empty version. +*/ +void (*notify_consumers)(struct rchan_buf *buf); };/*
@@ -186,6 +195,48 @@ extern size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length);/** +* relay_event_toobig - is event too big to fit in a sub-buffer? +* @buf: relay channel buffer +* @length: length of event +* +* Returns 1 if too big, 0 otherwise. +* +* switch_subbuf() helper function. +*/ +static inline int relay_event_toobig (struct rchan_buf *buf,size_t length) +{ +return length > buf->chan->subbuf_size; +} + +/** +* relay_update_filesize - increase relay file i_size by length +* @buf: relay channel buffer +* @length: length to add +* +* switch_subbuf() helper function. +*/ +static inline void relay_update_filesize (struct rchan_buf *buf,size_t length) +{ +if (buf->dentry) + buf->dentry->d_inode->i_size += length; +else + buf->early_bytes += length; + +smp_mb (); +} + +/** +* relay_inc_produced - increase number of sub-buffers produced by 1 +* @buf: relay channel buffer +* +* switch_subbuf() helper function. +*/ +static inline void relay_inc_produced (struct rchan_buf *buf) +{ + buf->subbufs_produced++; +} + +/** * relay_write - write data into the channel * @chan: relay channel * @data: data to be written
kernel/relay.c +24 -19
79 lines not on this page · raw message
Signature · 1 line
1.5.3.5