The patch titled Subject: relay: allow the use of const callback structs has been added to the -mm tree. Its filename is relay-allow-the-use-of-const-callback-structs.patch This patch should soon appear at https://ozlabs.org/~akpm/mmots/broken-out/relay-allow-the-use-of-const-callback-structs.patch and later at https://ozlabs.org/~akpm/mmotm/broken-out/relay-allow-the-use-of-const-callback-structs.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Jani Nikula <jani.nikula@xxxxxxxxx> Subject: relay: allow the use of const callback structs 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. Link: https://lkml.kernel.org/r/cc3ff292e4eb4fdc56bee3d690c7b8e39209cd37.1606153547.git.jani.nikula@xxxxxxxxx Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> Cc: Jens Axboe <axboe@xxxxxxxxx> Cc: Kalle Valo <kvalo@xxxxxxxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/relay.h | 4 ++-- kernel/relay.c | 35 +++++++++++------------------------ 2 files changed, 13 insertions(+), 26 deletions(-) --- a/include/linux/relay.h~relay-allow-the-use-of-const-callback-structs +++ a/include/linux/relay.h @@ -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 */ @@ -157,7 +157,7 @@ struct rchan *relay_open(const char *bas 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, --- a/kernel/relay.c~relay-allow-the-use-of-const-callback-structs +++ a/kernel/relay.c @@ -252,19 +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 callback wrapper */ +static int cb_subbuf_start(struct rchan_buf *buf, void *subbuf, + void *prev_subbuf, size_t prev_padding) +{ + if (buf->chan->cb->subbuf_start) + return buf->chan->cb->subbuf_start(buf, subbuf, + prev_subbuf, prev_padding); -/* - * 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) -{ if (relay_buf_full(buf)) return 0; @@ -314,7 +309,7 @@ static void __relay_reset(struct rchan_b for (i = 0; i < buf->chan->n_subbufs; i++) buf->padding[i] = 0; - buf->chan->cb->subbuf_start(buf, buf->data, NULL, 0); + cb_subbuf_start(buf, buf->data, NULL, 0); } /** @@ -442,14 +437,6 @@ static void relay_close_buf(struct rchan 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; @@ -495,7 +482,7 @@ struct rchan *relay_open(const char *bas 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; @@ -529,7 +516,7 @@ struct rchan *relay_open(const char *bas 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); @@ -712,7 +699,7 @@ size_t relay_switch_subbuf(struct rchan_ 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 (!cb_subbuf_start(buf, new, old, buf->prev_padding)) { buf->offset = buf->chan->subbuf_size + 1; return 0; } _ Patches currently in -mm which might be from jani.nikula@xxxxxxxxx are relay-remove-unused-buf_mapped-and-buf_unmapped-callbacks.patch relay-require-non-null-callbacks-in-relay_open.patch relay-make-create_buf_file-and-remove_buf_file-callbacks-mandatory.patch relay-allow-the-use-of-const-callback-structs.patch drm-i915-make-relay-callbacks-const.patch ath10k-make-relay-callbacks-const.patch ath11k-make-relay-callbacks-const.patch ath9k-make-relay-callbacks-const.patch blktrace-make-relay-callbacks-const.patch