<div dir="ltr"><div>Looks good though what happened to the del around if (!oclass)  in nv30_screen_create ?<br></div>Also it seems to fix the other problem around else if (dupfd) which was not closed on failure.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 27 October 2015 at 09:10, samuel.pitoiset <span dir="ltr"><<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What about this one <a href="http://hastebin.com/uboruxicof.coffee" rel="noreferrer" target="_blank">http://hastebin.com/uboruxicof.coffee</a> ?<br>
<br>
This patch is loosely based on your first attempt, except that I removed the call<br>
to nouveau_device_del() in nouveau_drm_screen_create().<div class="HOEnZb"><div class="h5"><br>
<br>
On 27/10/2015 09:52, Julien Isorce wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This patch prevents to call nouveau_device_del twice on the same device.<br>
<br>
Encountered this case when nvc0_screen_create fails with:<br>
nvc0_screen_create:717 - Error allocating PGRAPH context for M2MF: -16<br>
<br>
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=70354" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=70354</a><br>
<br>
Signed-off-by: Julien Isorce <<a href="mailto:j.isorce@samsung.com" target="_blank">j.isorce@samsung.com</a>><br>
---<br>
  src/gallium/drivers/nouveau/nouveau_screen.c   | 8 ++++++--<br>
  src/gallium/drivers/nouveau/nv30/nv30_screen.c | 1 +<br>
  src/gallium/drivers/nouveau/nv50/nv50_screen.c | 1 +<br>
  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 1 +<br>
  4 files changed, 9 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c b/src/gallium/drivers/nouveau/nouveau_screen.c<br>
index b2290e7..2bd6d4f 100644<br>
--- a/src/gallium/drivers/nouveau/nouveau_screen.c<br>
+++ b/src/gallium/drivers/nouveau/nouveau_screen.c<br>
@@ -177,13 +177,17 @@ nouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev)<br>
        screen->device = dev;<br>
        ret = nouveau_client_new(screen->device, &screen->client);<br>
-       if (ret)<br>
+       if (ret) {<br>
+               screen->device = 0;<br>
                return ret;<br>
+       }<br>
        ret = nouveau_pushbuf_new(screen->client, screen->channel,<br>
                                  4, 512 * 1024, 1,<br>
                                  &screen->pushbuf);<br>
-       if (ret)<br>
+       if (ret) {<br>
+               screen->device = 0;<br>
                return ret;<br>
+       }<br>
            /* getting CPU time first appears to be more accurate */<br>
          screen->cpu_gpu_time_delta = os_time_get();<br>
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c<br>
index 0330164..54af655 100644<br>
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c<br>
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c<br>
@@ -411,6 +411,7 @@ nv30_screen_destroy(struct pipe_screen *pscreen)<br>
  #define FAIL_SCREEN_INIT(str, err)                    \<br>
     do {                                               \<br>
        NOUVEAU_ERR(str, err);                          \<br>
+      screen->base.device = 0;                        \<br>
        nv30_screen_destroy(pscreen);                   \<br>
        return NULL;                                    \<br>
     } while(0)<br>
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c<br>
index ec51d00..a1fad42 100644<br>
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c<br>
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c<br>
@@ -905,6 +905,7 @@ nv50_screen_create(struct nouveau_device *dev)<br>
     return pscreen;<br>
    fail:<br>
+   screen->base.device = 0;<br>
     nv50_screen_destroy(pscreen);<br>
     return NULL;<br>
  }<br>
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c<br>
index af8e5f7..28fee35 100644<br>
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c<br>
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c<br>
@@ -609,6 +609,7 @@ nvc0_screen_resize_tls_area(struct nvc0_screen *screen,<br>
  #define FAIL_SCREEN_INIT(str, err)                    \<br>
     do {                                               \<br>
        NOUVEAU_ERR(str, err);                          \<br>
+      screen->base.device = 0;                        \<br>
        nvc0_screen_destroy(pscreen);                   \<br>
        return NULL;                                    \<br>
     } while(0)<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div>