On 9/20/19 5:07 PM, Dafna Hirschfeld wrote:
> Hi,
>
> On Fri, 2019-09-20 at 15:17 +0200, Hans Verkuil wrote:
>> Hi Dafna,
>>
>> On 9/19/19 10:32 PM, Dafna Hirschfeld wrote:
>>> This patchset introduces the usage of configfs in order to create vimc
>>> devices
>>> with a configured topology. A patch introducing configfs usage was already
>>> sent by Helen Koike:
>>> https://patchwork.linuxtv.org/patch/53397/ . The current patch is based on
>>> her patch but
>>> suggests a new API for using configfs.
>>> It uses symlinks to represent a link between two entities, an approach
>>> already used in the kernel
>>> by usb gadgets composed with configfs to associate usb gadget's functions
>>> to its configurations.
>>> For example, a topology of sensor->capture will be created with the
>>> following commands:
>>>
>>> CONFIGFS_ROOT=/sys/kernel/config
>>>
>>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/
>>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/vimc-sensor:sen
>>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/vimc-capture:cap
>>> tree ${CONFIGFS_ROOT}
>>> /configfs/
>>> `-- vimc
>>> `-- mdev
>>> |-- hotplug
>>> |-- vimc-capture:cap
>>> | `-- pad:sink:0
>>> `-- vimc-sensor:sen
>>> `-- pad:source:0
>>>
>>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/vimc-sensor:sen/pad:source:0/to-cap
>>> ln -s ${CONFIGFS_ROOT}/vimc/mdev/vimc-capture:cap/pad:sink:0
>>> ${CONFIGFS_ROOT}/vimc/mdev/vimc-sensor:sen/pad:source:0/to-cap
>>> tree ${CONFIGFS_ROOT}
>>> /configfs/
>>> `-- vimc
>>> `-- mdev
>>> |-- hotplug
>>> |-- vimc-capture:cap
>>> | `-- pad:sink:0
>>> `-- vimc-sensor:sen
>>> `-- pad:source:0
>>> `-- to-cap
>>> |-- enabled
>>> |-- immutable
>>> `-- pad:sink:0 ->
>>> ../../../../../vimc/mdev/vimc-capture:cap/pad:sink:0
>>>
>>> There are several reasons to prefer the symlink approach in order to
>>> represent links between entities.
>>> The previous approach in which links are represented with directories of
>>> the form 'entity1:pad>-><entity2:pad'
>>> requires userspace to parse the dirctories names in order to understand the
>>> topology, while in the symlink
>>> approach userspace needs only to traverse the configfs tree.
>>> Also, the usage of symlinks prevents userspace from creating links between
>>> entities that don't exist and also
>>> an entity can't be removed if there is a symlink pointing to it or from it,
>>> while in the previous approach the
>>
>> Why can't you remove an entity if there is a symlink pointing to it?
>>
>> In the example above I can remove mdev/vimc-capture:cap just fine. Afterwards
>> the pad:sink:0 symlink will point to a non-existing file, but that's valid
>> symlink behavior.
>
> Hmm, this should not be allowed, maybe you did something wrong?
> I get:
> # rmdir /sys/kernel/config/vimc/mdev/vimc-capture:cap
> rmdir: failed to remove '/sys/kernel/config/vimc/mdev/vimc-capture:cap':
> Device or resource busy
>
>
>> Or is vimc checking internally and prohibits the user from making invalid
>> changes?
>
> No, this is not internal to vimc, it is part of configfs, it is also written
> in the docs:
>
> "A config_item cannot be removed while it links to any other item, nor
> can it be removed while an item links to it. Dangling symlinks are not
> allowed in configfs."
Ah, I was not aware of that. Just ignore my comments about this, then :-)
Nice, I learned something today.
Regards,
Hans
>
> Regards,
> Dafna
>
>> In any case, this cover letter is a bit confusing and needs to address this
>> in more
>> detail.
>>
>> Regards,
>>
>> Hans
>>
>>> links were created by creating unrelated directories and care had to be
>>> taken to ensure consistency. This way
>>> the topology configured from userspace is restricted to always be valid and
>>> represent the current topology of
>>> the device. This results in less validation needed in kernel code when
>>> plugging the device and less possibility
>>> for mistakes in the userspace side. Last, but not least, using symlinks is
>>> the natural way of associating things
>>> in configfs.
>>>
>>> This patch is meant to demonstrate the suggested configfs api and get
>>> comments and acceptance/disagreement from
>>> the community. It passes few tests that configure basic topology and
>>> streams the capture entities.
>>> Here is the tests script:
>>> https://gitlab.collabora.com/dafna/scripts/blob/master/configfs/sym-unit-tests-simple-topo.sh
>>> Further versions will go through more extensive debugging.
>>>
>>> The patchset is rebased on top of v5 of the patchset 'Collapse vimc into
>>> single monolithic driver' sent by Shuah Khan
>>> https://lkml.org/lkml/2019/9/17/656
>>>
>>> Patch 1, was sent by me before as a single patch and is needed for the
>>> configfs implementation.
>>>
>>> Patch 2, documents how to use the new configfs api in order to create and
>>> set devices topologies.
>>>
>>> Patch 3, only adds the new configfs api code but does not use it yet, so it
>>> still creates only the hardcoded device.
>>>
>>> Patch 4, removes the hardcoded device topology and creates devices with
>>> topologies configured with the configfs.
>>>
>>> Patch 5, implements indexing for the bus_info field since now there can be
>>> more than one vimc device.
>>>
>>> Dafna Hirschfeld (5):
>>> media: vimc: upon streaming, check that the pipeline starts with a
>>> source entity
>>> docs: media: vimc: Documenting vimc topology configuration using
>>> configfs
>>> media: vimc: Add the implementation for the configfs api
>>> media: vimc: use configfs instead of having hardcoded configuration
>>> media: vimc: Add device index to the bus_info
>>>
>>> Documentation/media/v4l-drivers/vimc.dot | 28 +-
>>> Documentation/media/v4l-drivers/vimc.rst | 240 ++++++-
>>> drivers/media/platform/vimc/Kconfig | 9 +-
>>> drivers/media/platform/vimc/Makefile | 2 +-
>>> drivers/media/platform/vimc/vimc-capture.c | 50 +-
>>> drivers/media/platform/vimc/vimc-common.h | 86 ++-
>>> drivers/media/platform/vimc/vimc-configfs.c | 656 ++++++++++++++++++++
>>> drivers/media/platform/vimc/vimc-configfs.h | 41 ++
>>> drivers/media/platform/vimc/vimc-core.c | 350 +++++------
>>> drivers/media/platform/vimc/vimc-debayer.c | 35 +-
>>> drivers/media/platform/vimc/vimc-scaler.c | 35 +-
>>> drivers/media/platform/vimc/vimc-sensor.c | 33 +-
>>> drivers/media/platform/vimc/vimc-streamer.c | 39 +-
>>> 13 files changed, 1289 insertions(+), 315 deletions(-)
>>> create mode 100644 drivers/media/platform/vimc/vimc-configfs.c
>>> create mode 100644 drivers/media/platform/vimc/vimc-configfs.h
>>>
>