Skip to content

Commit

Permalink
relay: allow the use of const callback structs
Browse files Browse the repository at this point in the history
None of the relay users require the use of mutable structs for callbacks,
however the relay code does.  Instead of assigning the default callback
for subbuf_start, add a wrapper to conditionally call the client callback
if available, and fall back to default behaviour otherwise.

This lets all relay users make their struct rchan_callbacks const data.

[[email protected]: cleanups, per Christoph]
  Link: https://lkml.kernel.org/r/[email protected]

Link: https://lkml.kernel.org/r/cc3ff292e4eb4fdc56bee3d690c7b8e39209cd37.1606153547.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Cc: Jens Axboe <[email protected]>
Cc: Kalle Valo <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
jnikula authored and torvalds committed Dec 16, 2020
1 parent 371e038 commit 023542f
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 29 deletions.
4 changes: 2 additions & 2 deletions include/linux/relay.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ struct rchan
size_t subbuf_size; /* sub-buffer size */
size_t n_subbufs; /* number of sub-buffers per buffer */
size_t alloc_size; /* total buffer size allocated */
struct rchan_callbacks *cb; /* client callbacks */
const struct rchan_callbacks *cb; /* client callbacks */
struct kref kref; /* channel refcount */
void *private_data; /* for user-defined data */
size_t last_toobig; /* tried to log event > subbuf size */
Expand Down Expand Up @@ -157,7 +157,7 @@ struct rchan *relay_open(const char *base_filename,
struct dentry *parent,
size_t subbuf_size,
size_t n_subbufs,
struct rchan_callbacks *cb,
const struct rchan_callbacks *cb,
void *private_data);
extern int relay_late_setup_files(struct rchan *chan,
const char *base_filename,
Expand Down
37 changes: 10 additions & 27 deletions kernel/relay.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,23 +252,14 @@ EXPORT_SYMBOL_GPL(relay_buf_full);
* High-level relay kernel API and associated functions.
*/

/*
* rchan_callback implementations defining default channel behavior. Used
* in place of corresponding NULL values in client callback struct.
*/

/*
* subbuf_start() default callback. Does nothing.
*/
static int subbuf_start_default_callback (struct rchan_buf *buf,
void *subbuf,
void *prev_subbuf,
size_t prev_padding)
static int relay_subbuf_start(struct rchan_buf *buf, void *subbuf,
void *prev_subbuf, size_t prev_padding)
{
if (relay_buf_full(buf))
return 0;
if (!buf->chan->cb->subbuf_start)
return !relay_buf_full(buf);

return 1;
return buf->chan->cb->subbuf_start(buf, subbuf,
prev_subbuf, prev_padding);
}

/**
Expand Down Expand Up @@ -314,7 +305,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)
for (i = 0; i < buf->chan->n_subbufs; i++)
buf->padding[i] = 0;

buf->chan->cb->subbuf_start(buf, buf->data, NULL, 0);
relay_subbuf_start(buf, buf->data, NULL, 0);
}

/**
Expand Down Expand Up @@ -442,14 +433,6 @@ static void relay_close_buf(struct rchan_buf *buf)
kref_put(&buf->kref, relay_remove_buf);
}

static void setup_callbacks(struct rchan *chan,
struct rchan_callbacks *cb)
{
if (!cb->subbuf_start)
cb->subbuf_start = subbuf_start_default_callback;
chan->cb = cb;
}

int relay_prepare_cpu(unsigned int cpu)
{
struct rchan *chan;
Expand Down Expand Up @@ -495,7 +478,7 @@ struct rchan *relay_open(const char *base_filename,
struct dentry *parent,
size_t subbuf_size,
size_t n_subbufs,
struct rchan_callbacks *cb,
const struct rchan_callbacks *cb,
void *private_data)
{
unsigned int i;
Expand Down Expand Up @@ -529,7 +512,7 @@ struct rchan *relay_open(const char *base_filename,
chan->has_base_filename = 1;
strlcpy(chan->base_filename, base_filename, NAME_MAX);
}
setup_callbacks(chan, cb);
chan->cb = cb;
kref_init(&chan->kref);

mutex_lock(&relay_channels_mutex);
Expand Down Expand Up @@ -712,7 +695,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
new_subbuf = buf->subbufs_produced % buf->chan->n_subbufs;
new = buf->start + new_subbuf * buf->chan->subbuf_size;
buf->offset = 0;
if (!buf->chan->cb->subbuf_start(buf, new, old, buf->prev_padding)) {
if (!relay_subbuf_start(buf, new, old, buf->prev_padding)) {
buf->offset = buf->chan->subbuf_size + 1;
return 0;
}
Expand Down

0 comments on commit 023542f

Please sign in to comment.