On Wed, Nov 26, 2025 at 02:52:49PM -0500, Steven Rostedt wrote: > From: Steven Rostedt <[email protected]> > > The trace_marker_raw file in tracefs takes a buffer from user space that > contains an id as well as a raw data string which is usually a binary > structure. The structure used has the following: > > struct raw_data_entry { > struct trace_entry ent; > unsigned int id; > char buf[]; > }; > > Since the passed in "cnt" variable is both the size of buf as well as the > size of id, the code to allocate the location on the ring buffer had: > > size = struct_size(entry, buf, cnt - sizeof(entry->id)); > > Which is quite ugly and hard to understand. Instead, add a helper macro > called struct_offset() which then changes the above to a simple and easy > to understand: > > size = struct_offset(entry, id) + cnt; > > This will likely come in handy for other use cases too. > > Link: > https://lore.kernel.org/all/CAHk-=whyzvoedfo1pmtbirpdbmtv9nxt9f09ck0k6s+hjd3...@mail.gmail.com/ > > Suggested-by: Linus Torvalds <[email protected]> > Signed-off-by: Steven Rostedt (Google) <[email protected]>
Works for me! Reviewed-by: Kees Cook <[email protected]> > --- > include/linux/overflow.h | 12 ++++++++++++ > kernel/trace/trace.c | 2 +- > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/include/linux/overflow.h b/include/linux/overflow.h > index 725f95f7e416..736f633b2d5f 100644 > --- a/include/linux/overflow.h > +++ b/include/linux/overflow.h > @@ -458,6 +458,18 @@ static inline size_t __must_check size_sub(size_t > minuend, size_t subtrahend) > #define struct_size_t(type, member, count) > \ > struct_size((type *)NULL, member, count) > > +/** > + * struct_offset() - Calculate the offset of a member within a struct > + * @p: Pointer to the struct > + * @member: Name of the member to get the offset of > + * > + * Calculates the offset of a particular @member of the structure pointed > + * to by @p. > + * > + * Return: number of bytes to the location of @member. > + */ > +#define struct_offset(p, member) (offsetof(typeof(*(p)), member)) I wonder if the kerndoc for this and offsetof() should reference each other? "For a type instead of a pointer, use offsetof()" etc... -- Kees Cook
