Re: [patch 02/17] Kernel Tracepoints

From: Mathieu Desnoyers
Date: Thu Jul 24 2008 - 16:30:39 EST


* Steven Rostedt (rostedt@xxxxxxxxxxx) wrote:
>
>
> On Tue, 15 Jul 2008, Mathieu Desnoyers wrote:
> > +static void *
> > +tracepoint_entry_remove_probe(struct tracepoint_entry *entry, void *probe)
> > +{
> > + int nr_probes = 0, nr_del = 0, i;
> > + void **old, **new;
> > +
> > + old = entry->funcs;
> > +
> > + debug_print_probes(entry);
> > + /* (N -> M), (N > 1, M >= 0) probes */
> > + for (nr_probes = 0; old[nr_probes]; nr_probes++) {
> > + if ((!probe || old[nr_probes] == probe))
> > + nr_del++;
> > + }
> > +
> > + if (nr_probes - nr_del == 0) {
> > + /* N -> 0, (N > 1) */
> > + entry->funcs = NULL;
> > + entry->refcount = 0;
> > + debug_print_probes(entry);
> > + return old;
> > + } else {
> > + int j = 0;
> > + /* N -> M, (N > 1, M > 0) */
> > + /* + 1 for NULL */
> > + new = kzalloc((nr_probes - nr_del + 1)
> > + * sizeof(void *), GFP_KERNEL);
> > + if (new == NULL)
> > + return ERR_PTR(-ENOMEM);
>
> Hmm, on failure of allocating a new array, we could simply use the
> old array, and remove the one probe from it instead of just failing.
>

Nay, because of RCU constraints. So we have the readers in the current
RCU window who need to see the old version, and readers of the following
window who need to see the next version. Both can live at the same time
on the system. We cannot reuse the same memory to perform the array
shrink without corrupting the data seen by the previous readers. We
really have to perform a copy here.

Mathieu


> -- Steve
>
> > + for (i = 0; old[i]; i++)
> > + if ((probe && old[i] != probe))
> > + new[j++] = old[i];
> > + entry->refcount = nr_probes - nr_del;
> > + entry->funcs = new;
> > + }
> > + debug_print_probes(entry);
> > + return old;
> > +}
> > +

--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/