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

Deng, Emily Emily.Deng at amd.com
Wed Feb 20 06:55:31 UTC 2019


Ping ......

>-----Original Message-----
>From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Deng,
>Emily
>Sent: Monday, February 18, 2019 10:17 AM
>To: Alex Deucher <alexdeucher at gmail.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
>
>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
>_______________________________________________
>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