From: Sasha Levin <levinsasha928@gmail.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: penberg@kernel.org, john@jfloren.net, kvm@vger.kernel.org,
asias.hejun@gmail.com, gorcunov@gmail.com,
prasadjoshi124@gmail.com
Subject: Re: [PATCH 1/4] kvm tools: Add ioeventfd support
Date: Fri, 27 May 2011 14:02:56 +0300 [thread overview]
Message-ID: <1306494176.3217.16.camel@lappy> (raw)
In-Reply-To: <20110527105450.GA25909@elte.hu>
On Fri, 2011-05-27 at 12:54 +0200, Ingo Molnar wrote:
> * Sasha Levin <levinsasha928@gmail.com> wrote:
>
> > ioeventfd is way provided by KVM to receive notifications about
> > reads and writes to PIO and MMIO areas within the guest.
> >
> > Such notifications are usefull if all we need to know is that
> > a specific area of the memory has been changed, and we don't need
> > a heavyweight exit to happen.
> >
> > The implementation uses epoll to scale to large number of ioeventfds.
>
> Nice! :-)
>
> > +struct ioevent {
> > + u64 start;
> > + u8 len;
>
> If that's an mmio address then it might be worth naming it
> ioevent->mmio_addr, ioevent->mmio_end.
>
> > + void (*ioevent_callback_fn)(struct kvm *kvm, void *ptr);
>
> Please only 'fn', we already know this is an ioevent.
>
> > + struct kvm *kvm;
> > + void *ptr;
>
> what is the purpose of the pointer?
>
> AFAICS it the private data of the callback function. In such cases
> please name them in a harmonizing fashion, such as:
>
> void (*fn)(struct kvm *kvm, void *data);
> struct kvm *fn_kvm;
> void *fn_data;
>
> Also, will tools/kvm/ ever run with multiple 'struct kvm' instances
> present?
I'm not sure. We pass it around to all our functions instead of using a
global, so I assumed we might have several guests under one process.
> A sidenote: i think 'struct kvm *kvm' was a naming mistake - it's way
> too aspecific, it tells us nothing. What is a 'kvm'?
>
> A much better name would be 'struct machine *machine', hm? Even if
> everyone agrees this would be a separate patch, obviously.
>
> Also, can ioevent->kvm *ever* be different from the kvm that the
> mmio-event receiving vcpu thread is associated with? If not then the
> fn_kvm field is really superfluous - we get the machine from the mmio
> handler and can pass it down to the callback function.
>
> > + int event_fd;
>
> 'fd'
>
> > + u64 datamatch;
>
> what's a datamatch? 'cookie'? 'key'?
The kernel-side ioeventfd matches the value written to the PIO port and
signals the event only if both values match.
It's named this way in the kernel code so I wanted to be consistent.
>
> > +
> > + struct list_head list_used;
>
> just 'list' is enough i think - it's obvious that ioevent->list is a
> list of ioevents, right?
>
We might have a list of free ioevents if we ever decide to scale it
beyond the max 20 event limit we currently have, so I would rather be
specific with the list names.
> > + kvm_ioevent = (struct kvm_ioeventfd) {
> > + .addr = ioevent->start,
> > + .len = ioevent->len,
>
> Do you see how confusing the start/len naming is? Here you are
> assigning a 'start' field to an 'addr' and the reviewer is kept
> wondering whether that's right. If it was ->mmio_addr then it would
> be a lot more obvious what is going on.
Yes, I'll rename them to addr/len to match with KVM naming.
> > +static void *ioeventfd__thread(void *param)
> > +{
> > + for (;;) {
> > + int nfds, i;
> > +
> > + nfds = epoll_wait(epoll_fd, events, IOEVENTFD_MAX_EVENTS, -1);
> > + for (i = 0; i < nfds; i++) {
> > + u64 tmp;
> > + struct ioevent *ioevent;
> > +
> > + ioevent = events[i].data.ptr;
> > +
> > + if (read(ioevent->event_fd, &tmp, sizeof(tmp)) < 0)
> > + die("Failed reading event");
> > +
> > + ioevent->ioevent_callback_fn(ioevent->kvm, ioevent->ptr);
> > + }
> > + }
> > +
> > + return NULL;
> > +}
> > +
> > +void ioeventfd__start(void)
> > +{
> > + pthread_t thread;
> > +
> > + pthread_create(&thread, NULL, ioeventfd__thread, NULL);
> > +}
>
> Shouldnt this use the thread pool, so that we know about each and
> every worker thread we have started, in one central place?
>
Our thread pool currently responds to events - it runs a callback if it
has received a notification to do so. It doesn't manage threads which
have to run all the time like in this case.
Though once we return from epoll_wait() here we do minimal work before
sending the IO event into the thread pool.
> (This might have relevance, see the big-reader-lock mail i sent
> earlier today.)
>
> Thanks,
>
> Ingo
--
Sasha.
next prev parent reply other threads:[~2011-05-27 11:03 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-27 10:36 [PATCH 1/4] kvm tools: Add ioeventfd support Sasha Levin
2011-05-27 10:36 ` [PATCH 2/4] kvm tools: Use ioeventfd in virtio-blk Sasha Levin
2011-05-27 10:37 ` [PATCH 3/4] kvm tools: Use ioeventfd in virtio-net Sasha Levin
2011-05-27 10:37 ` [PATCH 4/4] kvm tools: Use ioeventfd in virtio-rng Sasha Levin
2011-05-27 10:47 ` [PATCH 1/4] kvm tools: Add ioeventfd support Stefan Hajnoczi
2011-05-27 10:57 ` Sasha Levin
2011-05-27 10:52 ` Pekka Enberg
2011-05-27 10:54 ` Ingo Molnar
2011-05-27 11:02 ` Sasha Levin [this message]
2011-05-27 11:29 ` Ingo Molnar
2011-05-27 11:30 ` Pekka Enberg
2011-05-27 11:38 ` Ingo Molnar
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=1306494176.3217.16.camel@lappy \
--to=levinsasha928@gmail.com \
--cc=asias.hejun@gmail.com \
--cc=gorcunov@gmail.com \
--cc=john@jfloren.net \
--cc=kvm@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=penberg@kernel.org \
--cc=prasadjoshi124@gmail.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.