|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 for-xen-4.5 2/2] dpci: Replace tasklet with an softirq (v8)
>>> On 29.10.14 at 22:11, <konrad.wilk@xxxxxxxxxx> wrote:
> Or do you want me to remove the 'goto restart' loop as it
> is unlikely to ever be triggered because the softirq would be
> executed right away?
No, that one definitely needs to stay.
> +static void pt_pirq_softirq_reset(struct hvm_pirq_dpci *pirq_dpci)
> +{
> + struct domain *d = pirq_dpci->dom;
> +
> + ASSERT(spin_is_locked(&d->event_lock));
> +
> + switch ( cmpxchg(&pirq_dpci->state, 1 << STATE_SCHED, 0) )
> + {
> + /*
> + * We are going to try to de-schedule the softirq before it goes
> in
> + * STATE_RUN. Whoever clears STATE_SCHED MUST refcount the 'dom'.
> + */
> + case (1 << STATE_SCHED):
> + put_domain(d);
> + /* fallthrough. */
> + /*
> + * The reason it is OK to reset 'dom' when STATE_RUN bit is set
> is
> + * due to a shortcut the 'dpci_softirq' implements. It stashes
> the
> + * a 'dom' in local variable before it sets STATE_RUN - and
> + * therefore will not dereference '->dom' which would crash.
> + */
> + case (1 << STATE_RUN):
> + case (1 << STATE_RUN) | (1 << STATE_SCHED):
> + pirq_dpci->dom = NULL;
> + break;
> + default:
> + break;
Indentation is still wrong. Also I think the comments are a little
odd in their placement. In particular, a fall-through comment should
imo immediately precede the subsequent case label(s). Hence I think
the larger comment would better go after the two labels involving
STATE_RUN.
> @@ -165,8 +287,14 @@ int pt_irq_create_bind(
> {
> pirq_dpci->gmsi.gflags = 0;
> pirq_dpci->gmsi.gvec = 0;
> - pirq_dpci->dom = NULL;
> pirq_dpci->flags = 0;
> + /*
> + * Between the 'pirq_guest_bind' and before
> 'pirq_guest_unbind'
> + * an interrupt can be scheduled. No more of them are going
> to
> + * be scheduled but we must deal with the one that is in the
> + * queue.
> + */
> + pt_pirq_softirq_reset(pirq_dpci);
> pirq_cleanup_check(info, d);
> spin_unlock(&d->event_lock);
> return rc;
I wonder whether that wouldn't better be moved into the conditional
where pirq_guest_unbind() gets called, while - along the lines of the
subsequent change - handling failure of pirq_guest_bind() the more
straightforward way.
> +static int cpu_callback(
> + struct notifier_block *nfb, unsigned long action, void *hcpu)
> +{
> + unsigned int cpu = (unsigned long)hcpu;
> +
> + switch ( action )
> + {
> + case CPU_UP_PREPARE:
> + INIT_LIST_HEAD(&per_cpu(dpci_list, cpu));
> + break;
> + case CPU_UP_CANCELED:
> + case CPU_DEAD:
> + /*
> + * On CPU_DYING this callback is called (on the CPU that is dying)
> + * with an possible HVM_DPIC_SOFTIRQ pending - at which point we can
> + * clear out any outstanding domains (by the virtue of the idle loop
> + * calling the softirq later). In CPU_DEAD case the CPU is deaf and
> + * there are no pending softirqs for us to handle so we can chill.
> + */
> + ASSERT(list_empty(&per_cpu(dpci_list, cpu)));
> + break;
> + default:
> + break;
Could I additionally talk you into omitting unnecessary default cases
like this one?
> -void pci_release_devices(struct domain *d)
> +int pci_release_devices(struct domain *d)
> {
> struct pci_dev *pdev;
> u8 bus, devfn;
> + int ret;
>
> spin_lock(&pcidevs_lock);
> - pci_clean_dpci_irqs(d);
> + ret = pci_clean_dpci_irqs(d);
> + if ( ret == -ERESTART )
> + {
> + spin_unlock(&pcidevs_lock);
> + return ret;
> + }
> while ( (pdev = pci_get_pdev_by_domain(d, -1, -1, -1)) )
> {
> bus = pdev->bus;
Even if errors other than -ERESTART aren't possible right now, the
code now looks like it is ignoring such. I think it would be better if
you simply dropped the special casing of -ERESTART and propagated
all errors here.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |