Its a bit strange that the passed parameter is not used. Looking carefully at the code what I understood is, inside the while loop, tasklets are processed one by one from the temporary list. Look at the continue, which actually skips the last part of the loop. Whenver, tasklet_trylock fails, before returning, the function actually merges any remaining entries on the list that it could not proceed with __get_cpu_var(tasklet_vec).list which may or may not be empty at that time for future processing. - Meraj On 10/23/07, Tony Mouawad <tonym.ace@xxxxxxxxx> wrote: > 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 > > -- Meraj -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ