Ping ...... Best wishes Emily Deng >-----Original Message----- >From: Deng, Emily <Emily.Deng@xxxxxxx> >Sent: Friday, February 15, 2019 11:51 AM >To: Deng, Emily <Emily.Deng@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx >Subject: RE: [PATCH libdrm] libdrm: Fix issue about differrent domainID but same >BDF > >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