<div dir="ltr"><div dir="ltr"><div dir="ltr">You could end up having two virgl_hw_res with two different GEM handles pointing to the same kernel GEM object.  That might break some assumptions about dependency tracking.</div><div dir="ltr"><br></div><div dir="ltr">For example, when the cmdbuf being built uses a buffer and you want to transfer some more data into the buffer, you normally need to submit the cmdbuf first before starting the transfer.  The current code detects that with virgl_drm_res_is_ref, which assumes each kernel GEM object has a unique virgl_hw_res.</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 1, 2019 at 12:37 PM Lepton Wu <<a href="mailto:lepton@chromium.org">lepton@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Mar 20, 2019 at 3:03 PM Chia-I Wu <<a href="mailto:olvaffe@gmail.com" target="_blank">olvaffe@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">On Mon, Mar 18, 2019 at 2:22 PM Lepton Wu <<a href="mailto:lepton@chromium.org" target="_blank">lepton@chromium.org</a>> wrote:<br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The old code could use gem name as key when inserting it to bo_handles<br>
hash table while trying to remove it from hash table with bo_handle as<br>
key in virgl_hw_res_destroy. This triggers use after free. Also, we<br>
should only reuse resource from bo_handle hash when the handle type is<br>
FD.<br></blockquote><div>Reuse is not very accurate.  Opening a shared handle (flink name) twice gives two GEM handles.  Importing an fd handle (prime fd) twice gives the same GEM handle.  In all cases, within a virgl_winsys, we want only one GEM handle and only one virgl_resource for each kernel GEM object.</div><div><br></div><div>I think the logic should go like:</div><div><br></div><div>  if (HANDLE_TYPE_SHARED) {</div><div><div>    if (bo_names.has(flink_name))</div><div>      return bo_names[flink_name];</div></div><div>    gem_handle = gem_open(flink_name);</div><div>  } else {</div><div>    gem_handle = drmPrimeFDToHandle(prime_fd);</div><div>  }</div><div> <br></div></div></div></div></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div></div><div>  if (bo_handles.has(gem_handle))</div><div>    return bo_handles[gem_handle];</div><div>  bo_handles[gem_handle] = create_new_resource();</div><div><br></div></div></div></div></div></div></blockquote><div>Hi, the current patch did most of what you said with only one difference:  it didn't insert to bo_handles[]   hash when the type is  HANDLE_TYPE_SHARED.</div><div>I think this is reasonable since opening a shared handle always get a new gem handle very time and I think it doesn't worth to insert it to bo_handles[] hash.</div><div>What do you think?</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Signed-off-by: Lepton Wu <<a href="mailto:lepton@chromium.org" target="_blank">lepton@chromium.org</a>><br>
---<br>
 src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 15 ++++++++-------<br>
 1 file changed, 8 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c<br>
index 120e8eda2cd..01811a0e997 100644<br>
--- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c<br>
+++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c<br>
@@ -424,13 +424,13 @@ virgl_drm_winsys_resource_create_handle(struct virgl_winsys *qws,<br>
          res = NULL;<br>
          goto done;<br>
       }<br>
-   }<br>
<br>
-   res = util_hash_table_get(qdws->bo_handles, (void*)(uintptr_t)handle);<br>
-   if (res) {<br>
-      struct virgl_hw_res *r = NULL;<br>
-      virgl_drm_resource_reference(qdws, &r, res);<br>
-      goto done;<br>
+      res = util_hash_table_get(qdws->bo_handles, (void*)(uintptr_t)handle);<br>
+      if (res) {<br>
+        struct virgl_hw_res *r = NULL;<br>
+        virgl_drm_resource_reference(qdws, &r, res);<br>
+        goto done;<br>
+      }<br>
    }<br>
<br>
    res = CALLOC_STRUCT(virgl_hw_res);<br>
@@ -469,7 +469,8 @@ virgl_drm_winsys_resource_create_handle(struct virgl_winsys *qws,<br>
    res->num_cs_references = 0;<br>
    res->fence_fd = -1;<br>
<br>
-   util_hash_table_set(qdws->bo_handles, (void *)(uintptr_t)handle, res);<br>
+   util_hash_table_set(qdws->bo_handles, (void *)(uintptr_t)res->bo_handle,<br>
+                       res);<br>
<br>
 done:<br>
    mtx_unlock(&qdws->bo_handles_mutex);<br>
-- <br>
2.21.0.225.g810b269d1ac-goog<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></blockquote></div></div></div></div></div>
</blockquote></div></div>
</blockquote></div>