On 5/17/07, Ratnadeep Joshi <[EMAIL PROTECTED]> wrote:


>  All,
>
> Following definition of notifier_chain_register is from kernel/sys.c
> and for kernel 2.6.20.1 .
>
> static int notifier_chain_register(struct notifier_block **nl,
>                 struct notifier_block *n)
> {
>         while ((*nl) != NULL) {
>                 if (n->priority > (*nl)->priority)
>                         break;
>                 nl = &((*nl)->next);
>         }
>         n->next = *nl;
>         rcu_assign_pointer(*nl, n);
>         return 0;
> }
>
> Since the first parameter is passed as a double ptr, the pointer
> itself is changed by the traversal and by rcu_assign_pointer(*nl, n) ,
> right? And the new value will be address of notifier_block n. This
> means the new head of the notifier list is n with the highest
> priority( in terms of magnitude atleast ).

Nopes. If you observe closely, *nl (head) is never touched. It is the nl
that is changed.

Say,
head = 1000
nl = 5000 (&head)

So, first nl = 5000. Then nl = &(head->next) that will be 1004 (address of
'next' element of the structure)
and so on.
So, 'head' is never touched.
Thanks Ratan, missed that easily though :-(
Should have been more careful.

Thank you
~psr

Regards,
- Ratnadeep

> My query is ,why are we loosing the notifiers  during traversal in the
> first while loop, which have a priority > n->priority ?
>
> I am terribly confused here.
> Can somebody help me out here?
>
> Thank you
> ~psr
>
> --
> play the game
>



--
play the game
-
To unsubscribe from this list: send the line "unsubscribe linux-newbie" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.linux-learn.org/faqs

Reply via email to