Re: [PATCH 0/2] drm/vkms: Introduce basic support for configfs

From: Rodrigo Siqueira
Date: Thu Jul 11 2019 - 23:08:33 EST


On 07/10, Daniel Vetter wrote:
> On Mon, Jul 01, 2019 at 12:23:39AM -0300, Rodrigo Siqueira wrote:
> > This patchset introduces the support for configfs in vkms by adding a
> > primary structure for handling the vkms subsystem and exposing
> > connectors as a use case. This series allows enabling/disabling virtual
> > and writeback connectors on the fly. The first patch of this series
> > reworks the initialization and cleanup code of each type of connector,
> > with this change, the second patch adds the configfs support for vkms.
> > It is important to highlight that this patchset depends on
> > https://patchwork.freedesktop.org/series/61738/.
> >
> > After applying this series, the user can utilize these features with the
> > following steps:
> >
> > 1. Load vkms without parameter
> >
> > modprobe vkms
> >
> > 2. Mount a configfs filesystem
> >
> > mount -t configfs none /mnt/
> >
> > After that, the vkms subsystem will look like this:
> >
> > vkms/
> > |__connectors
> > |__Virtual
> > |__ enable
> >
> > The connectors directories have information related to connectors, and
> > as can be seen, the virtual connector is enabled by default. Inside a
> > connector directory (e.g., Virtual) has an attribute named âenableâ
> > which is used to enable and disable the target connector. For example,
> > the Virtual connector has the enable attribute set to 1. If the user
> > wants to enable the writeback connector it is required to use the mkdir
> > command, as follows:
> >
> > cd /mnt/vkms/connectors
> > mkdir Writeback
> >
> > After the above command, the writeback connector will be enabled, and
> > the user could see the following tree:
> >
> > vkms/
> > |__connectors
> > |__Virtual
> > | |__ enable
> > |__Writeback
> > |__ enable
> >
> > If the user wants to remove the writeback connector, it is required to
> > use the command rmdir, for example
> >
> > rmdir Writeback
> >
> > Another way to enable and disable a connector it is by using the enable
> > attribute, for example, we can disable the Virtual connector with:
> >
> > echo 0 > /mnt/vkms/connectors/Virtual/enable
> >
> > And enable it again with:
> >
> > echo 1 > /mnt/vkms/connectors/Virtual/enable
> >
> > It is important to highlight that configfs 'obey' the parameters used
> > during the vkms load and does not allow users to remove a connector
> > directory if it was load via module parameter. For example:
> >
> > modprobe vkms enable_writeback=1
> >
> > vkms/
> > |__connectors
> > |__Virtual
> > | |__ enable
> > |__Writeback
> > |__ enable
> >
> > If the user tries to remove the Writeback connector with ârmdir
> > Writebackâ, the operation will be not permitted because the Writeback
> > connector was loaded with the modules. However, the user may disable the
> > writeback connector with:
> >
> > echo 0 > /mnt/vkms/connectors/Writeback/enable

Thanks for detail this issue, I just have some few questions inline.

> I guess I should have put a warning into that task that step one is
> designing the interface. Here's the fundamental thoughts:
>
> - The _only_ thing we can hotplug after drm_dev_register() is a
> drm_connector. That's an interesting use-case, but atm not really
> supported by the vkms codebase. So we can't just enable/disable
> writeback like this. We also can't change _anything_ else in the drm
> driver like this.

In the first patch of this series, I tried to decouple enable/disable
for virtual and writeback connectors; I tried to take advantage of
drm_connector_[register/unregister] in each connector. Can we use the
first patch or it doesn't make sense?

I did not understand why writeback connectors should not be registered
and unregister by calling drm_connector_[register/unregister], is it a
writeback or vkms limitation? Could you detail why we cannot change
connectors as I did?

Additionally, below you said "enable going from 1 -> 0, needs to be
treated like a physical hotunplug", do you mean that we first have to
add support for drm_dev_plug and drm_dev_unplug in vkms?

> - The other bit we want is support multiple vkms instances, to simulate
> multi-gpus and fun stuff like that.

Do you mean something like this:

configfs/vkms/instance1
|_enable_device
|_more_stuff
configfs/vkms/instance2
|_enable_device
|_more_stuff
configfs/vkms/instanceN
|_enable_device
|_more_stuff

Will each instance work like a totally independent device? What is the
main benefit of this? I can think about some use case for testing
prime, but I cannot see other things.

> - Therefore vkms configs should be at the drm_device level, so a
> directory under configfs/vkms/ represents an entire device.
>
> - We need a special config item to control
> drm_dev_register/drm_dev_unregister. While a drm_device is registers,
> all other config items need to fail if userspace tries to change them.
> Maybe this should be a top-level "enable" property.
>
> - Every time enable goes from 0 -> 1 we need to create a completely new
> vkms instance. The old one might still be around, waiting for the last
> few references to disappear.
>
> - enable going from 1 -> 0 needs to be treated like a physical hotunplug,
> i.e. not drm_dev_unregister but drm_dev_unplug. We also need to annotate
> all the vkms code with drm_dev_enter/exit() as the kerneldoc of
> drm_dev_unplug explains.
>
> - rmdir should be treated like enable going from 1 -> 0. Or maybe we
> should disable enable every going from 1 -> 0, would propably simplify
> everything.
>
> - The initial instance created at module load also neeeds to be removable
> like this.
>
> Once we have all this, then can we start to convert driver module options
> over to configs and add cool features. But lots of infrastructure needed
> first.
>
> Also, we probably want some nasty testcases which races an rmdir in
> configfs against userspace still doing ioctl calls against vkms. This is
> ideal for validation the hotunplug infrastructure we have in drm.
>
> An alternative is adding connector hotplugging. But I think before we do
> that we need to have support for more crtc and more connectors as static
> module options. So maybe not a good starting point for configfs.

So, probably the first set of tasks should be:

1. Enable multiple CRTC via module parameters. For example:
modprobe vkms crtcs=13
2. Enable multiple connectors via module parameters. For example:
modprobe vkms crtcs=3 connector=3 // 3 virtual connectors per crtc

Thanks again,

> The above text should probably be added to the vkms.rst todo item ...
> -Daniel
>
> >
> >
> > Rodrigo Siqueira (2):
> > drm/vkms: Add enable/disable functions per connector
> > drm/vkms: Introduce configfs for enabling/disabling connectors
> >
> > drivers/gpu/drm/vkms/Makefile | 3 +-
> > drivers/gpu/drm/vkms/vkms_configfs.c | 229 ++++++++++++++++++++++++++
> > drivers/gpu/drm/vkms/vkms_drv.c | 6 +
> > drivers/gpu/drm/vkms/vkms_drv.h | 17 ++
> > drivers/gpu/drm/vkms/vkms_output.c | 84 ++++++----
> > drivers/gpu/drm/vkms/vkms_writeback.c | 31 +++-
> > 6 files changed, 332 insertions(+), 38 deletions(-)
> > create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c
> >
> > --
> > 2.21.0
> >
> >
> > --
> > Rodrigo Siqueira
> > https://siqueira.tech
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch

--
Rodrigo Siqueira
https://siqueira.tech

Attachment: signature.asc
Description: PGP signature