Re: tasklet_action() failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux