[Spice-devel] [PATCH 18/18] worker: remove redundant check

Frediano Ziglio fziglio at redhat.com
Wed Nov 25 06:30:30 PST 2015


> 
> On Tue, 2015-11-24 at 11:13 +0000, Frediano Ziglio wrote:
> > From: Marc-André Lureau <marcandre.lureau at gmail.com>
> > 
> > The check is done in draw()
> I don't see it in display_channel_draw(), it also prevented calling
> notify_update().
> 
> I think the patch should be dropped.
> 
> Pavel
> 
> Reviewed-by: Pavel Grunt <pgrunt at redhat.com>

I'm not really sure. Surely is changing the behavior as you stated.
There is some checks in the draw function but I like to keep calling
the validate function (either outside or inside).

About the notify you made a good point. What about if the guest driver
for some mistake (like a race) send a draw command with a wrong
surface_id? Probably not sending the notify is fine, the server didn't
do any update however even the release_resource is skipped.
Also red_put_update_cmd is not called while it should (at the moment is
empty but is not the point).

I think the code

            RedUpdateCmd update;
            QXLReleaseInfoExt release_info_ext;

            if (red_get_update_cmd(&worker->mem_slots, ext_cmd.group_id,
                                   &update, ext_cmd.cmd.data)) {
                break;
            }
            if (!validate_surface(worker->display_channel, update.surface_id)) {
                spice_warning("Invalid surface in QXL_CMD_UPDATE");
                break;
            }
            display_channel_draw(worker->display_channel, &update.area, update.surface_id);
            worker->qxl->st->qif->notify_update(worker->qxl, update.update_id);
            release_info_ext.group_id = ext_cmd.group_id;
            release_info_ext.info = update.release_info;
            worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
            red_put_update_cmd(&update);

Could be improved with

            RedUpdateCmd update;
            QXLReleaseInfoExt release_info_ext;

            if (red_get_update_cmd(&worker->mem_slots, ext_cmd.group_id,
                                   &update, ext_cmd.cmd.data)) {
                break;
            }
            if (validate_surface(worker->display_channel, update.surface_id)) {
                display_channel_draw(worker->display_channel, &update.area, update.surface_id);
                worker->qxl->st->qif->notify_update(worker->qxl, update.update_id);
            }
            release_info_ext.group_id = ext_cmd.group_id;
            release_info_ext.info = update.release_info;
            worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
            red_put_update_cmd(&update);


Frediano

> > ---
> >  server/red_worker.c | 4 ----
> >  1 file changed, 4 deletions(-)
> > 
> > diff --git a/server/red_worker.c b/server/red_worker.c
> > index 4cc9fe9..a9fbd64 100644
> > --- a/server/red_worker.c
> > +++ b/server/red_worker.c
> > @@ -647,10 +647,6 @@ static int red_process_commands(RedWorker *worker,
> > uint32_t max_pipe_size, int *
> >                                     &update, ext_cmd.cmd.data)) {
> >                  break;
> >              }
> > -            if (!validate_surface(worker->display_channel,
> > update.surface_id)) {
> > -                spice_warning("Invalid surface in QXL_CMD_UPDATE");
> > -                break;
> > -            }
> >              display_channel_draw(worker->display_channel, &update.area,
> > update.surface_id);
> >              worker->qxl->st->qif->notify_update(worker->qxl,
> > update.update_id);
> >              release_info_ext.group_id = ext_cmd.group_id;
> 


More information about the Spice-devel mailing list