On Thu, Feb 14, 2019 at 2:53 AM Emily Deng <Emily.Deng@xxxxxxx> wrote: > > 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> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> Do you need someone to commit this for you? Alex > --- > 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