On 5/17/07, Ratnadeep Joshi <ratn.josh@xxxxxxxxx> 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.linux-learn.org/faqs