On Thu, 15 Aug 2019, Ben Luo wrote: > if (vdev->ctx[vector].trigger) { > - free_irq(irq, vdev->ctx[vector].trigger); > - irq_bypass_unregister_producer(&vdev->ctx[vector].producer); > - kfree(vdev->ctx[vector].name); > - eventfd_ctx_put(vdev->ctx[vector].trigger); > - vdev->ctx[vector].trigger = NULL; > + if (vdev->ctx[vector].trigger == trigger) { > + > irq_bypass_unregister_producer(&vdev->ctx[vector].producer);
What's the point of unregistering the producer, just to register it again below? > + } else if (trigger) { > + ret = update_irq_devid(irq, > + vdev->ctx[vector].trigger, trigger); > + if (unlikely(ret)) { > + dev_info(&pdev->dev, > + "update_irq_devid %d (token %p) fails: > %d\n", s/fails/failed/ > + irq, vdev->ctx[vector].trigger, ret); > + eventfd_ctx_put(trigger); > + return ret; > + } This lacks any form of comment why this is correct. dev_id is updated and the producer with the old token is still registered. > + > irq_bypass_unregister_producer(&vdev->ctx[vector].producer); Now it's unregistered. > + eventfd_ctx_put(vdev->ctx[vector].trigger); > + vdev->ctx[vector].producer.token = trigger; The token is updated and then it's newly registered below. > + vdev->ctx[vector].trigger = trigger; > - vdev->ctx[vector].producer.token = trigger; > - vdev->ctx[vector].producer.irq = irq; > + /* always update irte for posted mode */ > ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); > if (unlikely(ret)) > dev_info(&pdev->dev, > "irq bypass producer (token %p) registration fails: %d\n", > vdev->ctx[vector].producer.token, ret); I know this code already existed, but again this looks inconsistent. If the registration fails then a subsequent update will try to unregister a not registered producer. Does not make any sense to me. Thanks, tglx