From: Gregory Haskins <gregory.haskins@gmail.com>
To: Avi Kivity <avi@redhat.com>
Cc: Gregory Haskins <ghaskins@novell.com>,
kvm@vger.kernel.org, viro@ZenIV.linux.org.uk,
linux-kernel@vger.kernel.org, davidel@xmailserver.org
Subject: Re: [KVM PATCH v4 2/2] kvm: add support for irqfd via eventfd-notification interface
Date: Tue, 05 May 2009 14:21:29 -0400 [thread overview]
Message-ID: <4A0083A9.8020900@gmail.com> (raw)
In-Reply-To: <4A008127.7060406@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3132 bytes --]
Avi Kivity wrote:
> Gregory Haskins wrote:
>> Avi Kivity wrote:
>>
>>> Gregory Haskins wrote:
>>>
>>>
>>>> +int
>>>> +kvm_irqfd(struct kvm *kvm, int gsi, int flags)
>>>> +{
>>>> + struct _irqfd *irqfd;
>>>> + struct file *file = NULL;
>>>> + int fd = -1;
>>>> + int ret;
>>>> +
>>>> + irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL);
>>>> + if (!irqfd)
>>>> + return -ENOMEM;
>>>> +
>>>> + irqfd->kvm = kvm;
>>>>
>>> You need to increase the refcount on struct kvm here. Otherwise evil
>>> userspace will create an irqfd, close the vm and vcpu fds, and inject
>>> an interrupt.
>>>
>>
>> I just reviewed the code in prep for v5, and now I remember why I didnt
>> take a reference: I designed it the opposite direction: the vm-fd owns
>> a reference to the irqfd, and will decouple the kvm context from the
>> eventfd on shutdown (see kvm_irqfd_release()). I still need to spin a
>> v5 regardless in order to add the padding as previously discussed. But
>> let me know if you still see any holes in light of this alternate object
>> lifetime approach I am using.
>>
>
> Right, irqfd_release works. But I think refcounting is simpler, since
> we already kvm_get_kvm() and kvm_put_kvm(), and you wouldn't need the
> irqfd list. On the other hand, I'm not sure you get a callback from
> eventfd on close(), so refcounting may not be implementable.
;)
>
> Drat, irqfd_release doesn't work. You reference kvm->lock in
> irqfd_inject without taking any locks.
I *think* this is ok, tho. I remove myself from the waitq, and then
flush any potentially scheduled deferred work before returning. This
all happens synchronously to the vm_release() code when the vm-fd is
bring dropped, but before we actually release the struct kvm*.
Therefore, I think kvm->lock is guaranteed to remain valid for the
duration of the irqfd_release(), and we guarantee it wont be accessed
after the irqfd_release() completes. Or do you have a different concern?
On this topic of proper ref counts, though....
I wonder if I need an extra fget() in there. I presume that the
evenfd_file_create() returns with only a single reference, which
presumably I am handing one to userspace, and one to the irqfd.... which
is broken. Or does fd_install() bump that for me (doesnt look like
it)? Al, Davide, any comments?
>
> btw, there's still your original idea of creating the eventfd in
> userspace and passing it down. That would be workable if we can see a
> way to both signal the eventfd and get called back in irq context.
> Maybe that's preferable to what we're doing here, but we need to see
> how it would work.
We can do that, but I don't see it as changing the general problem
here. However, I think if you find that the above comments about the
kvm->lock w.r.t. irqfd_release() are ok, we don't need to worry about
it. If you prefer the userspace allocation of eventfd() for other
reasons, we can easily go back to that model as well...but its not
strictly necessary for this particular issue iiuc.
-Greg
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 266 bytes --]
next prev parent reply other threads:[~2009-05-05 18:21 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-04 17:57 [KVM PATCH v4 0/2] irqfd Gregory Haskins
2009-05-04 17:57 ` [KVM PATCH v4 1/2] eventfd: export eventfd interfaces for module use Gregory Haskins
2009-05-04 22:24 ` Al Viro
2009-05-05 2:17 ` Gregory Haskins
2009-05-04 17:57 ` [KVM PATCH v4 2/2] kvm: add support for irqfd via eventfd-notification interface Gregory Haskins
2009-05-05 15:45 ` Avi Kivity
2009-05-05 17:34 ` Gregory Haskins
2009-05-05 17:43 ` Avi Kivity
2009-05-05 17:56 ` Gregory Haskins
2009-05-05 18:10 ` Avi Kivity
2009-05-05 18:21 ` Gregory Haskins [this message]
2009-05-06 11:35 ` Gregory Haskins
2009-05-06 15:24 ` Davide Libenzi
2009-05-06 15:37 ` Gregory Haskins
2009-05-07 1:34 ` Davide Libenzi
2009-05-07 2:06 ` Gregory Haskins
2009-05-08 15:06 ` Davide Libenzi
2009-05-12 3:55 ` Gregory Haskins
2009-05-12 6:55 ` Davide Libenzi
2009-05-07 9:48 ` Avi Kivity
2009-05-07 13:46 ` Marcelo Tosatti
2009-05-07 14:01 ` Gregory Haskins
2009-05-07 14:34 ` Avi Kivity
2009-05-07 14:54 ` Gregory Haskins
2009-05-07 15:26 ` Avi Kivity
2009-05-07 14:46 ` Davide Libenzi
2009-05-07 15:47 ` Avi Kivity
2009-05-07 16:44 ` Davide Libenzi
2009-05-07 18:12 ` Avi Kivity
2009-05-08 3:13 ` Davide Libenzi
2009-05-08 8:19 ` Avi Kivity
2009-05-04 18:06 ` [KVM PATCH v4 0/2] irqfd Gregory Haskins
2009-05-04 18:52 ` Gregory Haskins
2009-05-05 14:16 ` Davide Libenzi
2009-05-05 14:27 ` Gregory Haskins
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=4A0083A9.8020900@gmail.com \
--to=gregory.haskins@gmail.com \
--cc=avi@redhat.com \
--cc=davidel@xmailserver.org \
--cc=ghaskins@novell.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@ZenIV.linux.org.uk \
/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