On 27/10/2015 11:08, Julien Isorce wrote:
Looks good though what happened to the del around if (!oclass) in nv30_screen_create ?

Yeah, good catch. I think we could use FAIL_SCREEN_INIT() there.
I'll send a new patch with this fix.

Also it seems to fix the other problem around else if (dupfd) which was not closed on failure.

Yes, it fixes both issues.


On 27 October 2015 at 09:10, samuel.pitoiset <samuel.pitoi...@gmail.com <mailto:samuel.pitoi...@gmail.com>> wrote:

    What about this one http://hastebin.com/uboruxicof.coffee ?

    This patch is loosely based on your first attempt, except that I
    removed the call
    to nouveau_device_del() in nouveau_drm_screen_create().


    On 27/10/2015 09:52, Julien Isorce wrote:

        This patch prevents to call nouveau_device_del twice on the
        same device.

        Encountered this case when nvc0_screen_create fails with:
        nvc0_screen_create:717 - Error allocating PGRAPH context for
        M2MF: -16

        https://bugs.freedesktop.org/show_bug.cgi?id=70354

        Signed-off-by: Julien Isorce <j.iso...@samsung.com
        <mailto:j.iso...@samsung.com>>
        ---
          src/gallium/drivers/nouveau/nouveau_screen.c   | 8 ++++++--
          src/gallium/drivers/nouveau/nv30/nv30_screen.c | 1 +
          src/gallium/drivers/nouveau/nv50/nv50_screen.c | 1 +
          src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 1 +
          4 files changed, 9 insertions(+), 2 deletions(-)

        diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c
        b/src/gallium/drivers/nouveau/nouveau_screen.c
        index b2290e7..2bd6d4f 100644
        --- a/src/gallium/drivers/nouveau/nouveau_screen.c
        +++ b/src/gallium/drivers/nouveau/nouveau_screen.c
        @@ -177,13 +177,17 @@ nouveau_screen_init(struct
        nouveau_screen *screen, struct nouveau_device *dev)
                screen->device = dev;
                ret = nouveau_client_new(screen->device, &screen->client);
        -       if (ret)
        +       if (ret) {
        +               screen->device = 0;
                        return ret;
        +       }
                ret = nouveau_pushbuf_new(screen->client, screen->channel,
                                          4, 512 * 1024, 1,
        &screen->pushbuf);
        -       if (ret)
        +       if (ret) {
        +               screen->device = 0;
                        return ret;
        +       }
                    /* getting CPU time first appears to be more
        accurate */
                  screen->cpu_gpu_time_delta = os_time_get();
        diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
        b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
        index 0330164..54af655 100644
        --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
        +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
        @@ -411,6 +411,7 @@ nv30_screen_destroy(struct pipe_screen
        *pscreen)
          #define FAIL_SCREEN_INIT(str, err)   \
             do {  \
                NOUVEAU_ERR(str, err);   \
        +      screen->base.device = 0;     \
                nv30_screen_destroy(pscreen);  \
                return NULL;   \
             } while(0)
        diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
        b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
        index ec51d00..a1fad42 100644
        --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
        +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
        @@ -905,6 +905,7 @@ nv50_screen_create(struct nouveau_device *dev)
             return pscreen;
            fail:
        +   screen->base.device = 0;
             nv50_screen_destroy(pscreen);
             return NULL;
          }
        diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
        b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
        index af8e5f7..28fee35 100644
        --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
        +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
        @@ -609,6 +609,7 @@ nvc0_screen_resize_tls_area(struct
        nvc0_screen *screen,
          #define FAIL_SCREEN_INIT(str, err)   \
             do {  \
                NOUVEAU_ERR(str, err);   \
        +      screen->base.device = 0;     \
                nvc0_screen_destroy(pscreen);  \
                return NULL;   \
             } while(0)




_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to