[stgt] [PATCH] nonblocking epoll_wait loop, sched events, ISER/IB polling
Alexander Nezhinsky
nezhinsky at gmail.com
Sun Sep 28 11:07:44 CEST 2008
On Fri, Sep 26, 2008 at 1:25 PM, FUJITA Tomonori
<fujita.tomonori at lab.ntt.co.jp> wrote:
> On Thu, 25 Sep 2008 19:09:09 +0300
> Alexander Nezhinsky <nezhinsky at gmail.com> wrote:
>
>> This patch introduces a few interconnected improvements, that
>> ...
>> Signed-off-by: Alexander Nezhinsky <nezhinsky at gmail.com>
>
> Thanks,
> Seems that you fixed most of the style issues but there are still some:
> ERROR: trailing whitespace
Sorry. Gonna fix it too.
>> -struct tgt_event {
>> - union {
>> - event_handler_t *handler;
>> - counter_event_handler_t *counter_handler;
>> - };
>> - union {
>> - int fd;
>> - int *counter;
>> - };
>> - void *data;
>> - struct list_head e_list;
>> -};
>
> exporting struct tgt_event fine for now but I don't fancy it much. If
> we have proper APIs for it, we could avoid it, I guess. But I've not
> see rdma code so I'm not sure.
It serves as a scheduled event descriptor, to request scheduling, to pass
the user parameters upon handler's call, to cancel, check etc.
Alternatively, we can define an API which returns a sort of handle
and passes a pre-defined format user data, like void *.
Also, if you feel that it was a bad idea to use the same struct both for
fd-based events and this new scheduler mechanism, they can be
separated, and only the new struct exported.
>> +static void event_loop(void)
>> +{
>> + int timeout, wait_timeout = TGTD_TICK_PERIOD * 1000;
>> +
>> + while (system_active) {
>> + tgt_exec_scheduled();
>> + /* wait if no scheduled work, poll if there is */
>> + timeout = list_empty(&tgt_sched_events_list) ?
>> + wait_timeout : 0;
>> + tgt_poll_events(timeout);
>> + }
>
> Can you avoid rewriting (or cleaning up) even_loop()?
>
> That's not related with this patch. You want to replace the first half
> (counter_events code) in the original even_loop(). I don't think that
> you need to rewrite event_loop in the above way, right?
>
> If you do something like the following, your patch is more smaller, I
> think.
>
>
> static void event_loop(void)
> {
> int nevent, i, done, timeout = TGTD_TICK_PERIOD * 1000;
> struct epoll_event events[1024];
> struct tgt_event *tev, *tevn;
>
> retry:
> done = schedule_event(); /* choose whatever name you like */
> if (!done)
> timeout = 0;
>
> nevent = epoll_wait(ep_fd, events, ARRAY_SIZE(events), timeout);
> if (nevent < 0) {
> if (errno != EINTR) {
> eprintf("%m\n");
> exit(1);
> }
> } else if (nevent) {
> for (i = 0; i < nevent; i++) {
> tev = (struct tgt_event *) events[i].data.ptr;
> tev->handler(tev->fd, events[i].events, tev->data);
> }
> } else
> schedule();
>
> if (system_active)
> goto retry;
> }
>
I thought that the new form is more expressive, but i can do it as you
suggested.
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list