From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Anthony Liguori <aliguori@us.ibm.com>,
Ping Fan Liu <pingfank@linux.vnet.ibm.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
Michael Roth <mdroth@linux.vnet.ibm.com>,
qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [RFC] Convert AioContext to Gsource sub classes
Date: Mon, 12 Aug 2013 14:46:24 +0800 [thread overview]
Message-ID: <520884C0.60208@linux.vnet.ibm.com> (raw)
In-Reply-To: <5205F3CA.1060009@redhat.com>
> Il 10/08/2013 05:24, Wenchao Xia ha scritto:
>> Hi folks,
>> I'd like form a series which remove AioContext's concept and
>> bind to glib's main loop more closely. Since changed place will be
>> a bit much so want to know your opinion before real coding:
>
> I'm not sure I understand... What does it buy you to split AioContext
> this way? First, BhSource and FdSource are needed by block drivers, and
> BhSource needs the notifier to interrupt the main loop. Second,
> AioContext is _already_ a GSource exactly to integrate closely with
> GLib's main loop. Look at the series that introduced AioContext back in
> October 2012. The main AioContext is already added as a GSource to the
> iothread's main loop; aio_wait is used in dataplane for simplicity, but
> it could also use a separate GMainLoop and add AioContext there as a
> GSource.
>
> Paolo
>
It has two parts:
1) rename AioContext to AioSource.
This is my major purpose, which declare it is not a "context" concept,
and GMainContext is the entity represent the thread's activity. This
can prevent people add wrapper API such as g_main_context_acquire(),
g_main_context_prepare(See qcontext_prepare() in QContext patch). As a
result, standard glib's main loop API can be exposed, so I can add
GMainContext into block layer or any other API layer, instead of
custom encapsulation. For example:
int bdrv_read(GMainContext *ctx,
BlockDriverState *bs,
int64_t sector_num,
uint8_t *buf,
int nb_sectors)
In short, it avoid wrapper for GMainContext. I agree AioContext is
_already_ a GSource sub class now, there is no difficult to add
GMainContext *ctx for AioContext's reason. But I am afraid it becomes
not true with more patches comes, since the name is mis-guiding.
2) Break AioSource into FdSource and BhSource.
This make custom code less and simpler, one Gsource for one kind of
job. It is not necessary but IMHO it will make things clear when add
more things into main loop: add a new Gsource sub class, avoid to
always have relationship with AioContext.
>> changes:
>> **before patch:
>> typedef struct AioContext {
>> GSource source;
>> int walking_handlers;
>> QemuMutex bh_lock;
>> struct QEMUBH *first_bh;
>> int walking_bh;
>> EventNotifier notifier;
>> GArray *pollfds;
>> struct ThreadPool *thread_pool;
>> } AioContext;
>>
>> **After patch:
>> typedef struct BhSource {
>> GSource source;
>> QemuMutex bh_lock;
>> struct QEMUBH *first_bh;
>> int walking_bh;
>> } BhSource;
>>
>> typedef struct FdSource {
>> GSource source;
>> int walking_handlers;
>> EventNotifier notifier;
>> GArray *pollfds;
>> struct ThreadPool *thread_pool;
>> } FdSource;
>>
>> Benefits:
>> Original code have a mix of Gsource and GMainContext's concept, we
>> may want to add wrapper functions around GMainContext's functions, such
>> as g_main_context_acquire(), g_main_context_prepare(), which brings
>> extra effort if you want to form a good and clear API layer. With
>> this changes, all qemu's custom code is attached under Gsource, we
>> have a clear GMainContext's API layer for event loop, no wrapper is
>> needed, and the event's loop API is glib's API, a clear layer let
>> me form a library or adding more things.
>>
>> before:
>> qemu's mainloop caller, BH user, fd user
>> |
>> AioContext
>> |
>> GMainContext
>>
>>
>> after:
>> qemu's mainloop caller
>> | BH user fd user
>> GmainContext | |
>> |--------------------------------|--BhSource |
>> |-------------FdSource
>>
>>
>> Note:
>> FdSource could be split more into ThreadSource and FdSource, which
>> distinguish more. It can be done easily if the change of this series
>> is online, when found necessary.
>>
>> More reasons:
>> When I thinking how to bind library code to a thread context, it may
>> need to add Context's concept into API of block.c. If I use AioContext,
>> there will need a wrapper API to run the event loop. But If I got
>> glib's GmainContext, things become simple.
>
--
Best Regards
Wenchao Xia
next prev parent reply other threads:[~2013-08-12 6:48 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-10 3:24 [Qemu-devel] [RFC] Convert AioContext to Gsource sub classes Wenchao Xia
2013-08-10 8:03 ` Paolo Bonzini
2013-08-12 6:46 ` Wenchao Xia [this message]
2013-08-12 7:30 ` Paolo Bonzini
2013-08-12 17:01 ` Michael Roth
2013-08-13 8:44 ` Wenchao Xia
2013-08-15 15:23 ` Michael Roth
2013-08-15 16:32 ` Michael Roth
2013-08-16 7:15 ` Wenchao Xia
2013-08-16 8:12 ` Wenchao Xia
2013-08-20 9:59 ` Wenchao Xia
2013-08-20 17:54 ` Alex Bligh
2013-08-21 8:45 ` Stefan Hajnoczi
2013-08-21 9:33 ` Wenchao Xia
2013-08-22 11:40 ` Stefan Hajnoczi
2013-08-21 10:06 ` Alex Bligh
2013-08-10 10:15 ` Alex Bligh
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=520884C0.60208@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=kwolf@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=pingfank@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).