[Spice-devel] [PATCH 3/6] worker: make it clear it returns from process when no cmd

Frediano Ziglio fziglio at redhat.com
Fri Oct 2 02:49:03 PDT 2015


> 
> > 
> > On Tue, 2015-09-29 at 11:56 +0100, Frediano Ziglio wrote:
> > > From: Marc-André Lureau <marcandre.lureau at gmail.com>
> > > 
> > > ---
> > >  server/red_worker.c | 8 ++++----
> > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/server/red_worker.c b/server/red_worker.c
> > > index 2efb311..d8a081e 100644
> > > --- a/server/red_worker.c
> > > +++ b/server/red_worker.c
> > > @@ -4966,12 +4966,12 @@ static int red_process_cursor(RedWorker *worker,
> > > uint32_t max_pipe_size, int *ri
> > >              if (worker->repoll_cursor_ring < CMD_RING_POLL_RETRIES) {
> > >                  worker->repoll_cursor_ring++;
> > >                  worker->event_timeout = MIN(worker->event_timeout,
> > >                  CMD_RING_POLL_TIMEOUT);
> > > -                break;
> > > +                return n;
> > >              }
> > >              if (worker->repoll_cursor_ring > CMD_RING_POLL_RETRIES ||
> > >                  worker->qxl->st->qif->req_cursor_notification(worker->qxl))
> > >                  {
> > >                  worker->repoll_cursor_ring++;
> > > -                break;
> > > +                return n;
> > >              }
> > >              continue;
> > >          }
> > > @@ -5028,12 +5028,12 @@ static int red_process_commands(RedWorker
> > > *worker,
> > > uint32_t max_pipe_size, int *
> > >              if (worker->repoll_cmd_ring < CMD_RING_POLL_RETRIES) {
> > >                  worker->repoll_cmd_ring++;
> > >                  worker->event_timeout = MIN(worker->event_timeout,
> > >                  CMD_RING_POLL_TIMEOUT);
> > > -                break;
> > > +                return n;
> > >              }
> > >              if (worker->repoll_cmd_ring > CMD_RING_POLL_RETRIES ||
> > >                           worker->qxl->st->qif->req_cmd_notification(worker->qxl))
> > >                           {
> > >                  worker->repoll_cmd_ring++;
> > > -                break;
> > > +                return n;
> > >              }
> > >              continue;
> > >          }
> > 
> > 
> > This change looks fine to me, but while looking at the code, I noticed
> > something unrelated. It seems that e.g.
> > worker->qxl->st->qif->req_cursor_notification() will never be called.
> > worker->repoll_cursor_ring is incremented if it is less than
> > CMD_RING_POLL_RETRIES and is incremented if it's greater than
> > CMD_RING_POLL_RETRIES, but it is not incremented if it is equal. Which
> > means that once it reaches CMD_RING_POLL_RETRIES, it will stay there and
> > the second if statement will never be satisfied. The same appears to be
> > true in the second hunk.
> > 
> > Jonathon
> > 
> 
> It's called when worker->repoll_cmd_ring == CMD_RING_POLL_RETRIES, in this
> case the counter
> will be incremented or not based on
> worker->qxl->st->qif->req_cursor_notification result.
> 
> Yes, the code is not really clear.
> 
> I also don't like these kind of polling, but this is another issue.
> The current pollings are 200 each 10 milliseconds which means it continue
> polling if no
> activities for 2 seconds. The guest should fill the buffer then signal the
> card, if there
> are no commands there should be no polling. Looks like this code is here to
> handle some
> buggy drivers which do not signal the card correctly.
> 

Tried to understand the history of this code however the first commit is:

commit c1b79eb035fa158fb2ac3bc8e559809611070016
Author: Yaniv Kamay <ykamay at redhat.com>
Date:   Sat Sep 19 21:25:46 2009 +0300

    fresh start

so the former history is not in this repository. Does somebody know where
to find the former repository?

Frediano


More information about the Spice-devel mailing list