Re: [PATCH 02/13] jump label v9: base patch
From: Jason Baron
Date: Thu Jun 10 2010 - 11:45:37 EST
On Thu, Jun 10, 2010 at 12:35:49AM +0200, Frederic Weisbecker wrote:
> On Wed, Jun 09, 2010 at 05:38:57PM -0400, Jason Baron wrote:
> > +static int build_jump_label_hashtable(struct jump_entry *start, struct jump_entry *stop)
> > +{
> > + struct jump_entry *iter, *iter_begin;
> > + struct jump_label_entry *entry;
> > + int count;
> > +
> > + sort_jump_label_entries(start, stop);
> > + iter = start;
> > + while (iter < stop) {
> > + entry = get_jump_label_entry((char *)iter->name);
> > + if (!entry) {
> > + iter_begin = iter;
> > + count = 0;
> > + while ((iter < stop) &&
> > + (strcmp((char *)iter->name,
> > + (char *)iter_begin->name) == 0)) {
> > + iter++;
> > + count++;
> > + }
>
>
>
>
> So, you can have multiple entries with the same name? How can that happen
> in fact?
>
>
this is the case where a single tracepoint such as kmalloc(), is used in
all over the kernel. So, there is one name or key value associated with
a kmalloc tracepoint. however, we have to patch the jump or nop into a
bunch of places in the kernel text.
>
>
> > + entry = add_jump_label_entry((char *)iter_begin->name,
> > + count, iter_begin);
> > + if (IS_ERR(entry))
> > + return PTR_ERR(entry);
> > + continue;
> > + }
> > + WARN(1, KERN_ERR "build_jump_hashtable: unexpected entry!\n");
>
>
>
> It seems you are going to endless loop in this fail case.
>
agreed. I need to stick that 'WARN' into the else clause of "if
(!entry)" and return an error.
>
>
> > + }
> > + return 0;
> > +}
> > +
> > +/***
> > + * jump_label_update - update jump label text
> > + * @name - name of the jump label
> > + * @type - enum set to JUMP_LABEL_ENABLE or JUMP_LABEL_DISABLE
> > + *
> > + * Will enable/disable the jump for jump label @name, depending on the
> > + * value of @type.
> > + *
> > + */
> > +
> > +void jump_label_update(const char *name, enum jump_label_type type)
> > +{
> > + struct jump_entry *iter;
> > + struct jump_label_entry *entry;
> > + struct hlist_node *module_node;
> > + struct jump_label_module_entry *e_module;
> > + int count;
> > +
> > + mutex_lock(&jump_label_mutex);
> > + entry = get_jump_label_entry(name);
> > + if (entry) {
> > + count = entry->nr_entries;
> > + iter = entry->table;
> > + while (count--) {
> > + if (kernel_text_address(iter->code))
> > + arch_jump_label_transform(iter, type);
> > + iter++;
> > + }
>
>
>
> So, this is going to patch multiple times the same value on the
> same address in case you have multiple entries for the same name?
>
> That look weird.
no. as mentioned before, there are multiple text addresses potentially
associated with a single jump label conditional variable. So we need to
patch all of them.
>
> BTW, if you can't find the entry, you should perhaps propagate an error.
>
>
>
> > + }
> > + mutex_unlock(&jump_label_mutex);
> > +}
> > +
> > +static int init_jump_label(void)
>
>
>
> This can be __init.
>
ok.
thanks for the review.
-Jason
--
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/