[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 for-xen-4.5 3/3] dpci: Replace tasklet with an softirq (v6)
>>> On 23.09.14 at 04:10, <konrad.wilk@xxxxxxxxxx> wrote: > +/* > + * If we are racing with softirq_dpci (masked is still set) we return > + * -EAGAIN. Otherwise we return 0. > + * > + * If it is -EAGAIN, it is the callers responsibility to kick the softirq > + * (with the event_lock dropped). But pt_pirq_cleanup_check() doesn't do this - is the comment misleading or that particular call site reacting wrongly? Actually the other call site doesn't kick any softirq either - what am I missing here? > @@ -104,9 +148,20 @@ void free_hvm_irq_dpci(struct hvm_irq_dpci *dpci) > * > * As such on every 'pt_irq_create_bind' call we MUST reset the values. > */ > -static void pt_pirq_reset(struct domain *d, struct hvm_pirq_dpci *dpci) > +static int pt_pirq_reset(struct domain *d, struct hvm_pirq_dpci *dpci) > { > + /* > + * We MUST check for this condition as the softirq could be scheduled > + * and hasn't run yet. As such we MUST delay this reset until it has > + * completed its job. > + */ > + if ( !pt_pirq_cleanup_check(dpci) ) > + return -EAGAIN; > + > + INIT_LIST_HEAD(&dpci->softirq_list); What is this good for? This isn't a list head, and simple list elements don't need resetting of their link fields. > @@ -116,7 +171,9 @@ int pt_irq_create_bind( > struct hvm_pirq_dpci *pirq_dpci; > struct pirq *info; > int rc, pirq = pt_irq_bind->machine_irq; > + s_time_t start = NOW(); > > + restart: > if ( pirq < 0 || pirq >= d->nr_pirqs ) > return -EINVAL; I don't think this check needs re-doing on each restart. > @@ -146,7 +203,17 @@ int pt_irq_create_bind( > return -ENOMEM; > } > pirq_dpci = pirq_dpci(info); > - pt_pirq_reset(d, pirq_dpci); > + /* A crude 'while' loop with us dropping the spinlock and giving > + * the softirq_dpci a chance to run. We do this up to one second > + * at which point we give up. */ Please fix the comment style, but ... > + if ( pt_pirq_reset(d, pirq_dpci) ) > + { > + spin_unlock(&d->event_lock); > + process_pending_softirqs(); > + if ( ( NOW() - start ) >> 30 ) > + return -EAGAIN; > + goto restart; > + } ... this still looks more like a hack, and I'm still not really certain why between two uses (which is what I understand this is for) the pIRQ (and hence it's softirq instance) won't be fully quiesced. > +static void dpci_softirq(void) > +{ > + struct hvm_pirq_dpci *pirq_dpci; > + unsigned int cpu = smp_processor_id(); > + LIST_HEAD(our_list); > + > + local_irq_disable(); > + list_splice_init(&per_cpu(dpci_list, cpu), &our_list); > + local_irq_enable(); > + > + while ( !list_empty(&our_list) ) > + { > + pirq_dpci = list_entry(our_list.next, struct hvm_pirq_dpci, > softirq_list); > + list_del(&pirq_dpci->softirq_list); > + > + hvm_dirq_assist(pirq_dpci); > + > + put_domain(pirq_dpci->dom); > + pirq_dpci->masked = 0; > + } > +} > +static int cpu_callback( There is again/still a blank line missing here. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |