[PATCH v3 weston] compositor-drm: Ignore non-KMS devices

Daniel Stone daniel at fooishbar.org
Mon Feb 13 18:57:01 UTC 2017


Hi Emil,
Thanks for the review!

On 10 February 2017 at 19:51, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> On 10 February 2017 at 17:43, Daniel Stone <daniels at collabora.com> wrote:
>> +static bool
>> +drm_device_is_kms(struct drm_backend *b, struct udev_device *device)
>> +{
>> +       [...]
>> +
>> +       b->drm.fd = fd;
>> +       b->drm.filename = strdup(filename);
>> +
> As we find a KMS device, we keep the launcher open, store the fd  and
> dup the filename...
>
>> +       return true;
>> +
>> +out_res:
>> +       drmModeFreeResources(res);
>> +out_fd:
>> +       weston_launcher_close(b->compositor->launcher, fd);
> Mildly related:
> there's a bunch of these weston_launcher_close() missing through the
> codebase. But I'm not sure what' the best location where they should
> be called.

It'd be interesting to know where they are. We need to be really
careful with close, since logind only lets us open a given device once
per session - hence the awkward ownership dance in
drm_device_is_kms().

>> @@ -2973,6 +2995,10 @@ find_primary_gpu(struct drm_backend *b, const char *seat)
>>                         continue;
>>                 }
>>
>> +               /* Make sure this device is actually capable of modesetting. */
>> +               if (!drm_device_is_kms(b, device))
>> +                       continue;
>> +
>>                 pci = udev_device_get_parent_with_subsystem_devtype(device,
>>                                                                 "pci", NULL);
>>                 if (pci) {
> ... yet here we continue to probe the boot_vga flag (if PCI device)
> and eventually continue with the next card node.
> I.e. imho the order is wrong (we should honour boot_vga first?) and we
> leak quite a bit.

You're totally right here.

> Perhaps something roughly like the following will be better ?
>
> udev_for_each... {
>     if (!seat_matches()) {
>         unref(device);
>         continue;
>     }
>
>     if (boot_vga_is_one())
>         break;
>
>     if (drm_device_is_kms())
>         break;
>
>     unref(device);
> }

Hmm. We don't want to break on the first KMS device we see, because it
might not be the boot_vga device. I'll send a v3 now which I think is
probably the best compromise.

Cheers,
Daniel


More information about the wayland-devel mailing list