lkml.org 
[lkml]   [2010]   [Jun]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 02/13] jump label v9: base patch
    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


    \
     
     \ /
      Last update: 2010-06-10 17:47    [W:0.039 / U:31.556 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site