This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: container_of in systemtap scripts
On Mon, 2010-01-18 at 21:39 +0100, PrzemysÅaw PaweÅczyk wrote:
> On Mon, Jan 18, 2010 at 20:55, Josh Stone <jistone@redhat.com> wrote:
> > On 01/18/2010 07:04 AM, Frank Ch. Eigler wrote:
> >> Andi Kleen <andi@firstfloor.org> writes:
> >>> [...] @cast doesn't support that. Are there any other clean ways to
> >>> write container_of() natively
> >>
> >> Actually it this sort of thing should work, since we have "&" operators:
> >>
> >> @cast($subfieldptr - (& @cast(0, "struct container")->subfield),
> >> "struct container")
> >>
> >>> or are there plans to extend cast to include an offset?
> >>
> >> Sure, we can do something like that if needed.
> >
> > The hardest part of such things is deciding on the syntax. Currently it
> > can be written:
> >
> > @cast(ptr, "type")
> > @cast(ptr, "type", "module")
> > @cast(ptr, "type", "<header>")
> >
> > I propose adding a qualifier on the type field, something like
> > "type->field" or "type:field". The former is consistent with how fields
> > are specified elsewhere, but it may imply more flexibility than a
> > "container_of" can support. (e.g. "mystruct->foo->bar" could only work
> > if there are no pointers in that chain.) The latter with a colon looks
> > nice to me, but it introduces a new syntax.
>
> My syntax proposal for container_of equivalent in stap is following one:
> @cast(ptr, "type<-field"[, "module"])
Just for those that like me had to think twice before grokking the
actual semantics of container_of: http://kernelnewbies.org/MagicMacros
The @cast extensions are clever. But if we want to support it directly
and introduce new syntax I think it makes sense to just have new "magic
@" syntax instead of reusing @cast.
@container_of(ptr, "type", "member" [, "module" | "<header>"])
That keeps @cast simple as it is now, and when reading (kernel) sources
it makes transposing it into a stap script straightforward since the
syntax is almost identical.
My 0.01 euro,
Mark