[PATCH libdrm] libdrm: Fix issue about differrent domainID but same BDF

Deng, Emily Emily.Deng at amd.com
Mon Feb 18 02:16:38 UTC 2019


Thanks Alex to help to add the dri-devel. 

Best wishes
Emily Deng


>-----Original Message-----
>From: Alex Deucher <alexdeucher at gmail.com>
>Sent: Friday, February 15, 2019 11:14 PM
>To: Deng, Emily <Emily.Deng at amd.com>; Maling list - DRI developers <dri-
>devel at lists.freedesktop.org>
>Cc: amd-gfx list <amd-gfx at lists.freedesktop.org>
>Subject: Re: [PATCH libdrm] libdrm: Fix issue about differrent domainID but same
>BDF
>
>Adding dri-devel.
>
>On Thu, Feb 14, 2019 at 2:53 AM Emily Deng <Emily.Deng at amd.com> 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 at amd.com>
>> ---
>>  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 at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list