>>> On 25.08.16 at 21:23, <konrad.w...@oracle.com> wrote: > +static void percpu_tasklet_feed(void *arg) > +{ > + unsigned long flags; > + struct tasklet *t; > + struct list_head *dst_list; > + struct list_head *list = &__get_cpu_var(tasklet_feeder); > + > + spin_lock_irqsave(&feeder_lock, flags); > + > + if ( list_empty(list) ) > + goto out;
Instead of this, how about e.g. initializing t to NULL above and ... > + while ( !list_empty(list) ) > + { > + t = list_entry(list->next, struct tasklet, list); [Intermediate note: list_first_entry(); I guess there also was at least one such case in patch 1. Or perhaps even better list_first_entry_or_null() and then this moved into the loop condition.] > + BUG_ON(!t->is_percpu); > + list_del(&t->list); > + > + dst_list = &__get_cpu_var(softirq_list); > + list_add_tail(&t->list, dst_list); > + } > + raise_softirq(TASKLET_SOFTIRQ_PERCPU); ... making this conditional upon t not being NULL? That would at once ... > +out: ... eliminate this label, which otherwise I would have to comment on. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel