From: Gregory Haskins <ghaskins@novell.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
avi@redhat.com, davdel@xmailserver.org,
paulmck@linux.vnet.ibm.com, akpm@linux-foundation.org
Subject: Re: [KVM PATCH v2 2/2] kvm: use POLLHUP to close an irqfd instead of an explicit ioctl
Date: Sun, 14 Jun 2009 08:53:11 -0400 [thread overview]
Message-ID: <4A34F2B7.1030606@novell.com> (raw)
In-Reply-To: <20090614114854.GA10269@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3263 bytes --]
Michael S. Tsirkin wrote:
> On Thu, Jun 04, 2009 at 08:48:12AM -0400, Gregory Haskins wrote:
>
>> +static void
>> +irqfd_disconnect(struct _irqfd *irqfd)
>> +{
>> + struct kvm *kvm;
>> +
>> + mutex_lock(&irqfd->lock);
>> +
>> + kvm = rcu_dereference(irqfd->kvm);
>> + rcu_assign_pointer(irqfd->kvm, NULL);
>> +
>> + mutex_unlock(&irqfd->lock);
>> +
>> + if (!kvm)
>> + return;
>>
>> mutex_lock(&kvm->lock);
>> - kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 1);
>> - kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 0);
>> + list_del(&irqfd->list);
>> mutex_unlock(&kvm->lock);
>> +
>> + /*
>> + * It is important to not drop the kvm reference until the next grace
>> + * period because there might be lockless references in flight up
>> + * until then
>> + */
>> + synchronize_srcu(&irqfd->srcu);
>> + kvm_put_kvm(kvm);
>> }
>>
>
> So irqfd object will persist after kvm goes away, until eventfd is closed?
>
Yep, by design. It becomes part of the eventfd and is thus associated
with its lifetime. Consider it as if we made our own anon-fd
implementation for irqfd and the lifetime looks similar. The difference
is that we are reusing eventfd and its interface semantics.
>
>>
>> static int
>> irqfd_wakeup(wait_queue_t *wait, unsigned mode, int sync, void *key)
>> {
>> struct _irqfd *irqfd = container_of(wait, struct _irqfd, wait);
>> + unsigned long flags = (unsigned long)key;
>>
>> - /*
>> - * The wake_up is called with interrupts disabled. Therefore we need
>> - * to defer the IRQ injection until later since we need to acquire the
>> - * kvm->lock to do so.
>> - */
>> - schedule_work(&irqfd->work);
>> + if (flags & POLLIN)
>> + /*
>> + * The POLLIN wake_up is called with interrupts disabled.
>> + * Therefore we need to defer the IRQ injection until later
>> + * since we need to acquire the kvm->lock to do so.
>> + */
>> + schedule_work(&irqfd->inject);
>> +
>> + if (flags & POLLHUP) {
>> + /*
>> + * The POLLHUP is called unlocked, so it theoretically should
>> + * be safe to remove ourselves from the wqh using the locked
>> + * variant of remove_wait_queue()
>> + */
>> + remove_wait_queue(irqfd->wqh, &irqfd->wait);
>> + flush_work(&irqfd->inject);
>> + irqfd_disconnect(irqfd);
>> +
>> + cleanup_srcu_struct(&irqfd->srcu);
>> + kfree(irqfd);
>> + }
>>
>> return 0;
>> }
>>
>
> And it is removed by this function when eventfd is closed.
> But what prevents the kvm module from going away, meanwhile?
>
Well, we hold a reference to struct kvm until we call
irqfd_disconnect(). If kvm closes first, we disconnect and disassociate
all references to kvm leaving irqfd->kvm = NULL. Likewise, if irqfd
closes first, we disassociate with kvm with the above quoted logic. In
either case, we are holding a kvm reference up until that "disconnect"
point. Therefore kvm should not be able to disappear before that
disconnect, and after that point we do not care. If that is not
sufficient to prevent kvm.ko from going away in the middle, then IMO
kvm_get_kvm() has a bug, not irqfd. ;) However, I believe everything is
actually ok here.
-Greg
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 266 bytes --]
next prev parent reply other threads:[~2009-06-14 12:53 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-04 12:48 [KVM PATCH v2 0/2] irqfd: use POLLHUP notification for close() Gregory Haskins
2009-06-04 12:48 ` [KVM PATCH v2 1/2] Allow waiters to be notified about the eventfd file* going away, and give Gregory Haskins
2009-06-04 12:48 ` [KVM PATCH v2 2/2] kvm: use POLLHUP to close an irqfd instead of an explicit ioctl Gregory Haskins
2009-06-14 11:49 ` Michael S. Tsirkin
2009-06-14 12:53 ` Gregory Haskins [this message]
2009-06-14 13:28 ` Michael S. Tsirkin
2009-06-15 3:39 ` Gregory Haskins
2009-06-15 9:46 ` Michael S. Tsirkin
2009-06-15 12:08 ` Gregory Haskins
2009-06-15 12:54 ` Michael S. Tsirkin
2009-06-18 5:16 ` Rusty Russell
2009-06-18 6:49 ` Michael S. Tsirkin
2009-06-18 12:00 ` Gregory Haskins
2009-06-18 12:22 ` Michael S. Tsirkin
2009-06-18 14:03 ` Gregory Haskins
2009-06-18 14:35 ` Michael S. Tsirkin
2009-06-18 16:29 ` Gregory Haskins
2009-06-19 15:37 ` Michael S. Tsirkin
2009-06-19 16:07 ` Gregory Haskins
2009-06-15 3:48 ` Gregory Haskins
2009-06-04 14:02 ` [KVM PATCH v2 0/2] irqfd: use POLLHUP notification for close() Avi Kivity
2009-06-12 3:58 ` Michael S. Tsirkin
2009-06-12 4:08 ` Michael S. Tsirkin
2009-06-14 12:38 ` Gregory Haskins
2009-06-14 12:51 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A34F2B7.1030606@novell.com \
--to=ghaskins@novell.com \
--cc=akpm@linux-foundation.org \
--cc=avi@redhat.com \
--cc=davdel@xmailserver.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox