relay - Clean up relay_switch_subbuf() and make waking up consumers optional.
RFC PATCH 1/21 relay - 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.
--- 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
Hi Tom,
include/linux/relay.h extern size_t relay_switch_subbuf(struct rchan_buf *buf, · line 226
Quoted 9 lines · Tom Zanussi
include/linux/relay.h +9
-0+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 (); +}
A minor nit: you should probably add a comment for that memory barrier. That is, explain why it is needed. It makes a world of a difference to anyone trying to understand what's going on here.
Hi Pekka,
Quoted 16 lines · Pekka Enberg
Hi Tom,
include/linux/relay.h extern size_t relay_switch_subbuf(struct rchan_buf *buf, · line 226
Quoted 9 lines · Tom Zanussi
include/linux/relay.h +9
-0+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 (); +}A minor nit: you should probably add a comment for that memory barrier. That is, explain why it is needed. It makes a world of a difference to anyone trying to understand what's going on here.
You're right, but it actually goes away in one of the following patches.
I'm wondering whether it even makes sense to post the individual patches or instead just the full squashed patch and/or the end-result files, which are really the things it would useful to review.
I've made some new changes following more testing and actually plan to post another round sometime soon - I'll probably skip posting the individual patches then unless it makes sense to.
Thanks for the comments.
Tom