<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 25 October 2015 at 21:56, 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"><span><br>
<br>
On 10/22/2015 01:16 AM, Julien Isorce wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The real fix is in nouveau_drm_winsys.c by setting dev to 0.<br>
Which means dev's ownership has been passed to previous call.<br>
Other changes are there to be consistent with what the<br>
screen_create functions already do on errors.<br>
</blockquote>
<br></span>
This actually happens because nouveau_device_del() is (sometimes) called twice<br>
when nvXX_screen_create() fails.<br>
<br>
I don't really like this solution but I don't have a better one for now, I'll think about<br>
that in the next few days. :)<br></blockquote><div> </div><div>Yeah and it is certainly hard to maintain. Ideally it should take ownership of the device only on success. I'll send another patch to compare with the other way around.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Note that you forgot to call nouveau_device_del() in nvc0_screen_create().</blockquote><div> </div><div>Ah right, I missed it on the first return, thx.<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Encountered this crash because nvc0_screen_create sometimes fails with:<br>
nvc0_screen_create:717 - Error allocating PGRAPH context for M2MF: -16<br>
Also see: <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/nv30/nv30_screen.c      | 5 ++++-<br>
  src/gallium/drivers/nouveau/nv50/nv50_screen.c      | 4 +++-<br>
  src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c | 2 ++<br>
  3 files changed, 9 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c<br>
index 0330164..9b8ddac 100644<br>
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c<br>
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c<br>
@@ -425,8 +425,10 @@ nv30_screen_create(struct nouveau_device *dev)<br>
     unsigned oclass = 0;<br>
     int ret, i;<br>
  -   if (!screen)<br>
+   if (!screen) {<br>
+      nouveau_device_del(&dev);<br>
        return NULL;<br>
+   }<br>
       switch (dev->chipset & 0xf0) {<br>
     case 0x30:<br>
@@ -456,6 +458,7 @@ nv30_screen_create(struct nouveau_device *dev)<br>
       if (!oclass) {<br>
        NOUVEAU_ERR("unknown 3d class for 0x%02x\n", dev->chipset);<br>
+      nouveau_device_del(&dev);<br>
        FREE(screen);<br>
        return NULL;<br>
     }<br>
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c<br>
index ec51d00..e9604d5 100644<br>
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c<br>
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c<br>
@@ -711,8 +711,10 @@ nv50_screen_create(struct nouveau_device *dev)<br>
     int ret;<br>
       screen = CALLOC_STRUCT(nv50_screen);<br>
-   if (!screen)<br>
+   if (!screen) {<br>
+      nouveau_device_del(&dev);<br>
        return NULL;<br>
+   }<br>
     pscreen = &screen->base.base;<br>
       ret = nouveau_screen_init(&screen->base, dev);<br>
diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c<br>
index c6603e3..bd1d761 100644<br>
--- a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c<br>
+++ b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c<br>
@@ -117,6 +117,8 @@ nouveau_drm_screen_create(int fd)<br>
        }<br>
        screen = (struct nouveau_screen*)init(dev);<br>
+       /* Previous init func took ownership of dev */<br>
+       dev = 0;<br>
        if (!screen)<br>
                goto err;<br>
  <br>
</blockquote>
<br>
</div></div></blockquote></div><br></div></div>