Re: tasklet_action() failure

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

 



Very good.

Now I'm trying to figure out why this tasklet_action() code path ends
up calling BUG().  This is a very intermittent problem and seemingly
impossible to reproduce.

404     if(!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
405          BUG();

It's obvious that 404 will result in false if the TASKLET_STATE_SCHED
bit was not set.  The question is what possibilities are there for
TASKLET_STATE_SCHED bit to not be set yet the tasklet was scheduled to
execute?  Is it possible that the tasklet was scheduled to execute and
before execution, somehow the TASKLET_STATE_SCHED bit was reset?

On 10/23/07, Mohammad M Molla <merajuli@xxxxxxxxx> wrote:
> 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