Ping ...... >-----Original Message----- >From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Emily >Deng >Sent: Thursday, February 14, 2019 3:54 PM >To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx >Cc: Deng, Emily <Emily.Deng@xxxxxxx> >Subject: [PATCH libdrm] libdrm: Fix issue about differrent domainID but same >BDF > >For multiple GPUs which has the same BDF, but has different domain ID, the >drmOpenByBusid will return the wrong fd when startx. > >The reproduce sequence as below: >1. Call drmOpenByBusid to open Card0, then will return the right fd0, and the >fd0 is master privilege; >2. Call drmOpenByBusid to open Card1. In function drmOpenByBusid, it will open >Card0 first, this time, the fd1 for opening Card0 is not master privilege, and will >call drmSetInterfaceVersion to identify the domain ID feature, as the fd1 is not >master privilege, then drmSetInterfaceVersion will fail, and then won't compare >domain ID, then return the wrong fd for Card1. > >Solution: >First loop search the best match fd about drm 1.4. > >Signed-off-by: Emily Deng <Emily.Deng@xxxxxxx> >--- > xf86drm.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > >diff --git a/xf86drm.c b/xf86drm.c >index 336d64d..b60e029 100644 >--- a/xf86drm.c >+++ b/xf86drm.c >@@ -584,11 +584,34 @@ static int drmOpenByBusid(const char *busid, int type) > if (base < 0) > return -1; > >+ /* We need to try for 1.4 first for proper PCI domain support */ > drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid); > for (i = base; i < base + DRM_MAX_MINOR; i++) { > fd = drmOpenMinor(i, 1, type); > drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd); > if (fd >= 0) { >+ sv.drm_di_major = 1; >+ sv.drm_di_minor = 4; >+ sv.drm_dd_major = -1; /* Don't care */ >+ sv.drm_dd_minor = -1; /* Don't care */ >+ if (!drmSetInterfaceVersion(fd, &sv)) { >+ buf = drmGetBusid(fd); >+ drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf); >+ if (buf && drmMatchBusID(buf, busid, 1)) { >+ drmFreeBusid(buf); >+ return fd; >+ } >+ if (buf) >+ drmFreeBusid(buf); >+ } >+ close(fd); >+ } >+ } >+ >+ for (i = base; i < base + DRM_MAX_MINOR; i++) { >+ fd = drmOpenMinor(i, 1, type); >+ drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd); >+ if (fd >= 0) { > /* We need to try for 1.4 first for proper PCI domain support > * and if that fails, we know the kernel is busted > */ >-- >2.7.4 > >_______________________________________________ >amd-gfx mailing list >amd-gfx@xxxxxxxxxxxxxxxxxxxxx >https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx