[PATCH libdrm 1/3] amdgpu: verify the tested device

Emil Velikov emil.l.velikov at gmail.com
Fri Jan 20 19:45:11 UTC 2017


On 20 January 2017 at 19:14, Xie, AlexBin <AlexBin.Xie at amd.com> wrote:
> Hi Emil,
>
>
> Thanks for the comments.
>
>
> Please see below.
>
>
> Regards,
>
> Alex Bin Xie
>
>
>
> ________________________________
> From: Emil Velikov <emil.l.velikov at gmail.com>
> Sent: Friday, January 20, 2017 8:18 AM
> To: Xie, AlexBin
> Cc: amd-gfx mailing list
> Subject: Re: [PATCH libdrm 1/3] amdgpu: verify the tested device
>
> Hi Alex,
>
> Thanks for doing this. There's a few nitpicks on top of what David and
> Christian has spotted.
>
> On 19 January 2017 at 22:53, Alex Xie <AlexBin.Xie at amd.com> wrote:
>> Verify the vender ID and driver name.
>> Open all AMDGPU devices.
>> Provide an option to open render node.
>>
>> Tested as root: PASS
>> Tested as non-privileged user:
>> All tests failed as expected
>>
>> Signed-off-by: Alex Xie <AlexBin.Xie at amd.com>
>> ---
>>  tests/amdgpu/amdgpu_test.c | 144
>> +++++++++++++++++++++++++++++++++++++--------
>>  1 file changed, 121 insertions(+), 23 deletions(-)
>>
>> diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c
>> index 71f357c..e42ef9d 100644
>> --- a/tests/amdgpu/amdgpu_test.c
>> +++ b/tests/amdgpu/amdgpu_test.c
>> @@ -115,6 +115,119 @@ static const char usage[] = "Usage: %s [-hl] [<-s
>> <suite id>> [-t <test id>]]\n"
>>  /** Specified options strings for getopt */
>>  static const char options[]   = "hls:t:";
>>
>> +/* Open AMD devices.
>> + * Return the number of AMD device openned.
>> + */
>> +static int amdgpu_open_devices(int open_render_node)
>> +{
>> +       drmDevicePtr devices[MAX_CARDS_SUPPORTED];
>> +       int ret;
>> +       int i;
>> +       int j;
>> +       int amd_index = 0;
>> +       int drm_count;
>> +       int fd;
>> +       char *device_name;
>> +       drmVersionPtr version;
>> +
>> +       drm_count = drmGetDevices2(0, devices, MAX_CARDS_SUPPORTED);
>> +
>> +       if (drm_count < 0) {
>> +               fprintf(stderr,
>> +                       "drmGetDevices2() returned an error %d\n",
>> +                       drm_count);
>> +               return 0;
>> +       }
>> +
>> +       for (i = 0; i < drm_count; i++) {
>> +               /* If this is not AMD GPU vender ID, skip*/
>> +               if (devices[i]->bustype == DRM_BUS_PCI)
>> +                       if (devices[i]->deviceinfo.pci->vendor_id !=
>> 0x1002)
>> +                               continue;
>> +
>> +               for (j = 0; j < DRM_NODE_MAX; j++) {
>> +                       if (devices[i]->available_nodes & 1 << j) {
>> +                               fd = open(
>> +                                       devices[i]->nodes[j],
>> +                                       O_RDONLY | O_CLOEXEC,
>> +                                       0);
>> +                               if (fd < 0) continue;
>> +                       }
> You don't need to iterate over all the available nodes. Just fetch the
> PRIMARY or RENDER based on open_render_node.
> Note that a device can be missing some node types (say RENDER) so make
> sure the available_nodes bitmask is set.
>
> [Alex Bin Xie]:
> That was my original design, but later I changed.
> I knew this work for the current xf86drm.c. But is the nodes[0]  always
> primary?
> I was afraid that this may be changed in future. I searched all drm tests. I
> did not see an example.
>
> So amdgpu_test will be the first to access nodes like:
> open(devices[i]->nodes[DRM_NODE_PRIMARY]), for example.
>
Please avoid nodes[0] and use the symbolic name - nodes[DRM_NODE_PRIMARY].
Comment applies for any DRM_NODE_*.

>> +                       if (open_render_node)
>> +                               device_name =
>> drmGetRenderDeviceNameFromFd(fd);
>> +                       else
>> +                               device_name =
>> drmGetPrimaryDeviceNameFromFd(fd);
>> +
>> +                       close(fd);
>> +
>> +                       drm_amdgpu[amd_index] = open(device_name,
>> +                                                       O_RDWR |
>> O_CLOEXEC);
>> +
>> +                       if (drm_amdgpu[amd_index] >= 0)
>> +                               amd_index++;
>> +
>> +                       free(device_name);
>> +
> With the above comment this becomes redundant.
>
>> +                       /* We have open this device. Go to next device.*/
>> +                       break;
>> +               }
>> +       }
>> +
> Here you want to initialise the remainder of drm_amdgpu[] (since
> drm_count can be less than MAX_CARDS_SUPPORTED) with -1.
> Otherwise you'll have fun experiences during close/print (below).
>
> [Alex Bin Xie]: This initialization is done in existing main() function (not
> introduced this patch).
>
Indeed that's correct. It looks a bit strange to have it separate, but
not my call.

Unrelated:
Fwiw please can drop the legacy drmAvailable() from the test, if you
have a minute.

Thanks !
Emil


More information about the amd-gfx mailing list