What is the purpose of the parameter "struct softirq_action *a" being passed into tasklet_action() since it doesn't appear to be used anywhere in the function? How does the list in __get_cpu_var(tasklet_vec).list get populated? It looks like at the top of the tasklet_action() call the list is set to empty and at the bottom __get_cpu_var(tasklet_vec).list is assigned to the next element of a temporary list ( t->next ). Is it possible for __get_cpu_var(tasklet_vec).list to get populated during a call to tasklet_action() or is what I am seeing just a NULL assignment to t->next ? On 10/22/07, Tony Mouawad <tonym.ace@xxxxxxxxx> wrote: > Hello, > > I'm trying to get a handle on a problem that is occuring inside of a > call to tasklet_action(). Can someone explain a bit about what line > 404 is doing ( and the function itself ) in the following code? It > seems that the OS is intermittently resulting in a false result on > line 404 and then executing line 405 which ultimately halts the > kernel. > > Regards, > Tony > > > 388 static void tasklet_action(struct softirq_action *a) > 389 { > 390 struct tasklet_struct *list; > 391 > 392 local_irq_disable(); > 393 list = __get_cpu_var(tasklet_vec).list; > 394 __get_cpu_var(tasklet_vec).list = NULL; > 395 local_irq_enable(); > 396 > 397 while (list) { > 398 struct tasklet_struct *t = list; > 399 > 400 list = list->next; > 401 > 402 if (tasklet_trylock(t)) { > 403 if (!atomic_read(&t->count)) { > 404 if > (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) > 405 BUG(); > 406 t->func(t->data); > 407 tasklet_unlock(t); > 408 continue; > 409 } > 410 tasklet_unlock(t); > 411 } > 412 > 413 local_irq_disable(); > 414 t->next = __get_cpu_var(tasklet_vec).list; > 415 __get_cpu_var(tasklet_vec).list = t; > 416 __raise_softirq_irqoff(TASKLET_SOFTIRQ); > 417 local_irq_enable(); > 418 } > 419 } > -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ