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(-)
diff --git a/include/linux/relay.h b/include/linux/relay.h
index 953fc05..17f0515 100644
--- a/include/linux/relay.h
+++ b/include/linux/relay.h
@@ -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: ...