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

From: Vasilev, Oleg
Date: Mon Jul 15 2019 - 07:09:29 EST


On Fri, 2019-07-12 at 00:07 -0300, Rodrigo Siqueira wrote:
> 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?

Hi,

I guess, some more stuff should happen during the hotplug, like
drm_kms_helper_hotplug_event()?

>
> 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

I think it would be a good idea. This way the creation of new device
could look like this:

mkdir -p instanceN/connector/virtual0
echo "virtual" > instanceN/connector/virtual0/type
echo 1 > instanceN/connector/virtual0/enable
mkdir -p instanceN/crtc/crtc0
...
echo 1 > instanceN/enable

Once the last command is executed, the whole instanceN/ becomes
immutable, except for
- instanceN/enable, so we can later disable it
- instanceN/connector, where we can create new connectors, it would be
treated as a hotplug.

>
> 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.

We can test that userspace always select the right device to display.

>
> > - 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

But do we want to have those parameters as module options, if we then
plan to replace those with configfs?

>
> 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
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Oleg Vasilev <oleg.vasilev@xxxxxxxxx>
Intel Corporation

Attachment: smime.p7s
Description: S/MIME cryptographic signature