Hi Alex, Please help, thanks. Best wishes Emily Deng >-----Original Message----- >From: Alex Deucher <alexdeucher@xxxxxxxxx> >Sent: Friday, February 22, 2019 12:13 AM >To: Deng, Emily <Emily.Deng@xxxxxxx>; Maling list - DRI developers <dri- >devel@xxxxxxxxxxxxxxxxxxxxx> >Cc: amd-gfx list <amd-gfx@xxxxxxxxxxxxxxxxxxxxx> >Subject: Re: [PATCH libdrm] libdrm: Fix issue about differrent domainID but same >BDF > >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