All of lore.kernel.org
 help / color / mirror / Atom feed
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, davidel@xmailserver.org, mtosatti@redhat.com
Subject: Re: [KVM PATCH v10] kvm: add support for irqfd
Date: Tue, 26 May 2009 14:05:27 -0400	[thread overview]
Message-ID: <4A1C2F67.70601@novell.com> (raw)
In-Reply-To: <20090526164201.GD9842@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 3066 bytes --]

Michael S. Tsirkin wrote:
> On Wed, May 20, 2009 at 10:30:49AM -0400, Gregory Haskins wrote:
>   
>> +static int
>> +irqfd_wakeup(wait_queue_t *wait, unsigned mode, int sync, void *key)
>> +{
>> +	struct _irqfd *irqfd = container_of(wait, struct _irqfd, wait);
>> +
>> +	/*
>> +	 * 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);
>> +
>> +	return 0;
>> +}
>>     
>
> This schedule_work is there just to work around the spinlock
> in eventfd_signal, which we don't really need. Isn't this right?
>   

Yep.

> And this is on each interrupt. Seems like a pity.
>   

I agree.  Moving towards a way to be able to inject without deferring to
a workqueue will be a good thing.  Note, however, that addressing it at
the eventfd/wqh-lock layer is only part of the picture since ideally we
can inject (i.e. eventfd_signal()) from any atomic context (e.g.
hard-irq), not just the artificial one created by the wqh based
implementation.  I think Marcelo's irq_lock split-up code is taking us
in that direction by (eventually) allowing the kvm_set_irq() path to be
atomic-context friendly.

> How about a flag in eventfd that would
> convert it from waking up someone to a plain function call?
>
> Davide, could we add something like
>
>
> diff --git a/fs/eventfd.c b/fs/eventfd.c
> index 2a701d5..8bfa308 100644
> --- a/fs/eventfd.c
> +++ b/fs/eventfd.c
> @@ -29,6 +29,7 @@ struct eventfd_ctx {
>  	 */
>  	__u64 count;
>  	unsigned int flags;
> +	int nolock;
>  };
>  
>  /*
> @@ -46,6 +47,12 @@ int eventfd_signal(struct file *file, int n)
>  
>  	if (n < 0)
>  		return -EINVAL;
> +	if (ctx->nolock) {
> +               /* Whoever set nolock
> +                  better set wqh.func as well. */
> +		ctx->wqh.func(&ctx->wqh, 0, 0, NULL);
> +		return 0;
> +	}
>  	spin_lock_irqsave(&ctx->wqh.lock, flags);
>  	if (ULLONG_MAX - ctx->count < n)
>  		n = (int) (ULLONG_MAX - ctx->count);
>
>   

If we think we still need to address it at the eventfd layer (which I am
not 100% convinced we do), I think we should probably generalize it a
little more and make it so it doesn't completely re-route the
notification (there may be other end-points interrested in the event, I
suppose).

I am thinking something along the lines that the internal eventfd uses
an srcu_notifier, and we register a default notifier which points to a
wqh path very much like what we have today.  Then something like kvm
could register an additional srcu_notifier which should allow it to be
invoked lockless (*).  This would theoretically allow the eventfd to
remain free to support an arbitrary number of end-points which support
both locked and lockless operation.

-Greg

(*) disclaimer: I've never looked at the srcu_notifier implementation,
so perhaps this is not what they really offer.  I base this only on
basic RCU understanding.




[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 266 bytes --]

  reply	other threads:[~2009-05-26 18:05 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-20 14:30 [KVM PATCH v10] kvm: add support for irqfd Gregory Haskins
2009-05-20 14:35 ` Avi Kivity
2009-05-26 16:42 ` Michael S. Tsirkin
2009-05-26 18:05   ` Gregory Haskins [this message]
2009-05-26 20:00   ` Davide Libenzi
2009-05-27 13:55 ` Michael S. Tsirkin
2009-05-27 14:06   ` Gregory Haskins
2009-05-27 14:36     ` [PATCH 0/2] kvm: validate irqfd type Gregory Haskins
2009-05-27 14:37       ` [PATCH 1/2] eventfd: export eventfd interfaces for module use Gregory Haskins
2009-05-27 14:37       ` [PATCH 2/2] kvm: validate irqfd type Gregory Haskins
2009-05-27 15:06       ` [PATCH 0/2] " Gregory Haskins
2009-05-31  9:36       ` Avi Kivity
2009-05-27 18:41     ` [KVM PATCH v10] kvm: add support for irqfd Michael S. Tsirkin
2009-05-27 19:28       ` Davide Libenzi
2009-05-27 20:07       ` Gregory Haskins
2009-05-27 20:43         ` Michael S. Tsirkin
2009-05-27 20:46           ` Gregory Haskins
2009-06-11 13:16 ` Michael S. Tsirkin
2009-06-11 13:36   ` Michael S. Tsirkin
2009-06-14 12:25     ` Gregory Haskins
2009-06-14 13:20       ` Michael S. Tsirkin
2009-06-14  9:25 ` Michael S. Tsirkin
2009-06-14 12:40   ` Gregory Haskins
2009-06-14 13:19     ` Michael S. Tsirkin
2009-06-14 13:23       ` Avi Kivity
2009-06-14 13:30         ` Michael S. Tsirkin
2009-06-14 13:40           ` Avi Kivity
2009-06-14 13:50             ` Michael S. Tsirkin

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=4A1C2F67.70601@novell.com \
    --to=ghaskins@novell.com \
    --cc=avi@redhat.com \
    --cc=davidel@xmailserver.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=mtosatti@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.