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-net" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html