Re: Re: [PATCH] Introduce Naming Convention in Input Subsystem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



OK, sorry for the noise, my previous message contained HTML and was
refused by the server... Re-posting it

Cheers,
Benjamin

On Mon, Jan 20, 2014 at 1:24 PM, Benjamin Tissoires
<benjamin.tissoires@xxxxxxxxx> wrote:
> Hi Aniroop,
>
> [sorry for top posting, but I really don't know where to put this regarding
> your answers].
>
> I _think_ I get one of the reasons you don't understand Dmitry, and why
> Dmitry does not understand you. From the different mails, I would say that
> you are referring to an Android platform.
> If it's not the case, then sorry for the noise.
>
> So, the last time I checked with android, this system does _not_ have an
> udev user-space daemon, which means that what you seem to be doing is
> parsing manually the sysfs tree to retrieve the inputs and their properties.
> This, IMO, is a very bad idea. Parsing the entire sysfs tree is indeed
> costly and you will have to build everything by hand.
>
> On regular distros, we use udev. This daemon builds its device database from
> the events generated by the kernels directly (the uevents). Once the events
> are emitted, we never (except for some user-space drivers) use them in the
> kernel drivers (at least, I never saw that).
>
> So if you want to create symlinks, then indeed, you just add 2 or 3 rules in
> /etc/udev/rules.d, and then the user space (and the system integrator) can
> see the different devices with the "correct" symlink.
> However, the kernel developer will never see them (and especially in the
> ->probe callback). However, the user-space tools which receives the udev
> events (emitted from udev, not the kernel this time) can easily retrieve
> many information from the event. Just run "udevadm info --export-db" on a
> regular Linux, and you will see that the device which presents the event
> node (/dev/input/eventX) has all the requirements to identify itself (VID,
> PID, path, etc...)
>
> Without udev, you are basically screwed, and I think it is definitively not
> the fault of the kernel, but of android. They had their reasons to not
> include it, so I hope they have an equivalent to help system integrators to
> do their job.
>
> Cheers,
> Benjamin
>
>
>
> On Sun, Jan 19, 2014 at 10:19 AM, Aniroop Mathur <aniroop.mathur@xxxxxxxxx>
> wrote:
>>
>> Hello Mr.Torokhov
>> Greetings of the day !!
>>
>> I have sent you a mail few days back but unfortunately did not
>> received a mail back.
>> Thereore, sending mail again.
>> I hope to hear from you soon.
>>
>>
>> On Sat, Jan 11, 2014 at 3:16 AM, Dmitry Torokhov
>> <dmitry.torokhov@xxxxxxxxx> wrote:
>> > On Sat, Jan 11, 2014 at 02:55:33AM +0530, Aniroop Mathur wrote:
>> >> Hello Mr. Torokhov,
>> >> Greetings!
>> >>
>> >> First of all, So sorry, unfortunately i used HTML text again.
>> >> and Many thanks for all replies.
>> >>
>> >> Sending email again in plain text.
>> >>
>> >>
>> >> On Sat, Jan 11, 2014 at 12:41 AM, Dmitry Torokhov
>> >> <dmitry.torokhov@xxxxxxxxx> wrote:
>> >> > Hi Aniroop,
>> >> >
>> >> > On Fri, Jan 10, 2014 at 04:49:43PM +0000, Aniroop Mathur wrote:
>> >> >> Hello Mr. Torokhov,
>> >> >> Greetings!
>> >> >>
>> >> >> On Thu, Jan 09, 2014 at 10:27:56AM +0530, Aniroop Mathur wrote:
>> >> >> > This patch allows user(driver) to set sysfs node name of input
>> >> >> > devices.  To set sysfs node name, user(driver) just needs to set
>> >> >> > node_name_unique variable.  If node_name_unique is not set,
>> >> >> > default
>> >> >> > name is given(as before).  So, this patch is completely
>> >> >> > backward-compatible.
>> >> >> >
>> >> >> > Sysfs Input node name format is: input_
>> >> >> > Sysfs Event node name format is: event_
>> >> >> >
>> >> >> > This "name" is given by user and automatically, prefix(input and
>> >> >> > event) is added by input core.
>> >> >> >
>> >> >> > This name must be unique among all input devices and driver(user)
>> >> >> > has
>> >> >> > the responsibility to ensure it.  If same name is used again for
>> >> >> > other
>> >> >> > input device, registration of that input device will fail because
>> >> >> > two
>> >> >> > input devices cannot have same name.
>> >> >> >
>> >> >> > Advantages of this patch are:
>> >> >> >
>> >> >> > 1. Reduces Booting Time of HAL/Upper-Layer because now HAL or
>> >> >> > Upper-Layer do not need to search input/event number corresponding
>> >> >> > to
>> >> >> > each input device in /dev/input/...  This searching in /dev/input/
>> >> >> > was
>> >> >> > taking too much time.  (Especially in mobile devices, where there
>> >> >> > are
>> >> >> > many input devices (many sensors, touchscreen, etc), it reduces a
>> >> >> > lot
>> >> >> > of booting time)
>> >> >>
>> >> >> I am sorry, how much time does it take to scan a directory of what,
>> >> >> 20
>> >> >> devices? If it such a factor have udev create nodes that are easier
>> >> >> for
>> >> >> you to locate, similarly how we already create nodes by-id and
>> >> >> by-path.
>> >> >> For example you can encode major:minor in device name.
>> >> >>
>> >> >> Re: (Aniroop Mathur)
>> >> >
>> >> > First of all, it would be great if you could use MUA that can
>> >> > properly
>> >> > quote and wrap long lines...
>> >> >
>> >> >> Its correct that we can set name of a device node using udev.  Yes,
>> >> >> this will change the name of device node(/dev/...) but not sysfs
>> >> >> node.(/sys/class/input/...) So now, the problem area will shift from
>> >> >> dev path to sysfs path, because now we dont know which sysfs node to
>> >> >> refer for a particular input device and hence HAL/Upper-Layer will
>> >> >> need to search in /sys/class/input/... instead of /dev/...
>> >> >> directory.
>> >> >
>> >> > [dtor@dtor-d630 ~]$ mkdir my-sysfs-view
>> >> > [dtor@dtor-d630 ~]$ ln -s
>> >> > /sys/devices/platform/i8042/serio1/input/input6
>> >> > my-sysfs-view/input_touchpad
>> >> > [dtor@dtor-d630 ~]$ ls my-sysfs-view/input_touchpad/
>> >> > capabilities/ event6/       modalias      name          power/
>> >> > subsystem/    uniq
>> >> > device/       id/           mouse1/       phys          properties
>> >> > uevent
>> >> > [dtor@dtor-d630 ~]$ ls my-sysfs-view/input_touchpad/
>> >> > capabilities  device  event6  id  modalias  mouse1  name  phys  power
>> >> > properties  subsystem  uevent  uniq
>> >> > [dtor@dtor-d630 ~]$ ls my-sysfs-view/input_touchpad/event6/
>> >> > dev  device  power  subsystem  uevent
>> >> >
>> >> > Mmmmkay?
>> >> >
>> >>
>> >> Yes, agreed, we can use udev and soft links to achieve this.
>> >> But i think there is something more to take care.
>> >>
>> >> So far, as per discussion, i understood that if an end user wants to
>> >> use
>> >> node names instead of numbers, he/she has to do the following things:
>> >
>> > No, not the end user, system integrator, which is quite different
>> > beast.
>> >
>>
>>  Umm.. Sorry, i used wrong word "end user".
>>  I meant to say "system integrator" only all the time.
>>
>> >> 1. Create rules for all input devices in udev rule file i.e. set
>> >> atleast
>> >> unique id and unique name.
>> >> (end user need to determine unique id too for every input device)
>> >> 2. Create links for all input device nodes using names.
>> >> (in probe function, after input_register_device)
>> >>
>> >> By following above two steps, the file structure will look like:
>> >> devfs - /dev/input_proximity
>> >> sysfs - my-sysfs-view/input_proximity --> sys/class/input/input2
>> >> sysfs - my-sysfs-view/event_proximity --> sys/class/input/event2
>> >>
>> >> But my concern is why to create trouble for end user to perform
>> >> and spend time for two extra steps, when an easy way is possible
>> >> to achieve the same task ?
>> >>
>> >> With this patch, end user only need to set node_name_unique variable
>> >> and right after that, both for devfs and sysfs,same node name is set.
>> >> End user does not need to do or take care of any other extra work,
>> >> like creating entry in udev rules, creating links, etc
>> >>
>> >> Also, with creating links for all input devices and checking udev rules
>> >> before actually creating a device node, will only increase computation
>> >> and time in kernel code.
>> >
>> > So do not create links, use something else to track devices. You are
>> > getting uevents, that is all you need.
>> >
>>
>> Firstly,
>> For input device event node, (/input/input1/event1)
>> we get below 7 uevents only:
>> Action, Devpath, Subsystem, Major, Minor, Devname, Seqnum
>> It is impossible to uniquely identify the device using
>> these 7 uevent variables, because all this is set in
>> input subsystem and not by driver developer or system integrator.
>> Devpath, Devname, minor is all set by input subsytem.
>> So, these uevents are not sufficient to identify the device.
>>
>> Secondly,
>> For input device input node (/input/input1),
>> I know we get more uevents like Name, Phys, etc,
>> But problem area is not input node because that we can
>> already do this using dev_set_name(input_dev->dev) or
>> using init_name variable in driver code.
>> But evdev (event device) structure is not accessible to driver
>> so we cannot use the same for this.
>>
>> Thirdly,
>> I know if these default uevents are not sufficient,
>> additionally, we can read sysfs attribute to identify device,
>> but as i already said, all this(udev rules or links),
>> will only increase computation time, and my purpose is to save time
>> and achieving the same task all together.
>>
>> >>
>> >> My purpose is to avoid extra work load and directly create node names
>> >> within input subsystem. Also backward compatibility is there.
>> >> So i think, it is better than the other alternative way.
>> >> Isn't this more easy ? Is there any side-effect or drawback of this
>> >> patch ?
>> >
>> > Yes, there is huge side effect - it is maintenance nightmare, where one
>> > driver can now cause failure for others. What if I have 2 proximity
>> > sensors? 2 accelerometers? How will generic drivers select names that
>> > will satisfy all boards that might use the chips out there? Are you
>> > proposing to put this data in device tree for example? Board files?
>> >
>> > IOW no, this is not right solution and the patch will not be accepted.
>> >
>>
>> Firstly,
>> Yes, i will put name of all input devices in one place i.e.
>> in board file or device tree. With this, it is very easy for system
>> integrator to assign unique names for all input devices.
>>
>> Secondly,
>> As already mentioned, this patch is backward compatible.
>> It is not compulsory to use node_name_unique variable.
>> So generic drivers can still use the same numbering system.
>> Also, if there are two accelerometers, system integrator can
>> easily give "accelerometer1" and "accelerometer2" as names.
>> Moreover, this same problem is for existing kernel system also.
>> As you know, using dev_set_name function or init_name variable,
>> we can set name of input node(not event node). So, if same name
>> is used, device_add of that input device will fail here also
>> in existing kernel code.
>>
>> Thirdly,
>> Using the existing init_name variable also, we can add naming convention
>> in input subystem. I can also submit patch using this variable already
>> present
>> in kernel. shall i ?
>>
>> >>
>> >> >>
>> >> >> Moreover, as i know, udev is mainly for hot-pluggable devices, but
>> >> >> my
>> >> >> problem is for platform devices, which are already present on the
>> >> >> board during boot up. (Like in Embedded devices)
>> >> >
>> >> > No, udev also manages those by requesting to replay all events that
>> >> > happened dyuring boot.
>> >> >
>> >> >>
>> >> >> To avoid confusion and make the problem more clear,
>> >> >> I would like to explain the problem and my suggestion by taking an
>> >> >> example:
>> >> >>
>> >> >> Suppose in a mobile device, there are 10 embedded input devices as
>> >> >> below:
>> >> >> Proximity ---                /dev/input0  ---
>> >> >> /sys/class/input/input0 --- /sys/class/input/event0
>> >> >> Magnetometer ---      /dev/input1   --- /sys/class/input/input1 ---
>> >> >> /sys/class/input/event1
>> >> >> Accelerometer ---      /dev/input2  --- /sys/class/input/input2 ---
>> >> >> /sys/class/input/event2
>> >> >> Touchscreen ---         /dev/input3  --- /sys/class/input/input3 ---
>> >> >> /sys/class/input/event3
>> >> >> ... 6 more like this
>> >> >> (All these are created during boot up time)
>> >> >>
>> >> >> Kernel has created all these nodes, so that HAL/UpperLayer can read
>> >> >> or
>> >> >> write values from it.  HAL/Upper-Layer needs to do main tasks like:
>> >> >> 1. Read raw data - does through /dev/input<num>
>> >> >> 2. Enable device - does through sys/class/input<num>/enable
>> >> >> 3. Set delay - does through sys/class/input<num>/delay
>> >> >> and many more...
>> >> >>
>> >> >> Now, Lets suppose we need to do these tasks for Accelerometer.
>> >> >>
>> >> >> If dev node name is set, HAL can directly read value from it (no
>> >> >> search required) But for enabling the accelerometer device or set
>> >> >> the
>> >> >> delay of a hardware chip, there is no direct way, HAL can know which
>> >> >> input node to refer for accelerometer because the input number is
>> >> >> created dynamically as per device probe order, so this input number
>> >> >> can be anything (0,1,2,3...) So HAL will need to search every input
>> >> >> node and read its name attribute and keep on searching until a match
>> >> >> is found between the "attribute name" and "name passed as
>> >> >> parameter".
>> >> >> Like for accelerometer, this searching needs to be done for all
>> >> >> other
>> >> >> input devices.  All of this part is done during booting and this
>> >> >> takes
>> >> >> a lot for time from booting perspective.
>> >> >>
>> >> >
>> >> > See the above. You can very easily create your own private 'view' of
>> >> > sysfs, no kernel changes needed.
>> >> >
>> >> >> As I measured, if there are ten devices, it is taking 1 second to do
>> >> >> all this searching. (for all devices) So for 20 devices, i guess, it
>> >> >> could take upto 2 seconds.
>> >> >
>> >> > That seems _very_ high, maybe you need to profile your code a bit. To
>> >> > search though 2 directories with less than a hundred files each
>> >> > should
>> >> > not take 1 second.
>> >> >
>> >>
>> >> In this i am including time to open a directory, close a directory,
>> >> open file of
>> >> that directory, close file of that directory, searching and computation
>> >> part.
>> >> Including all these, every time for each input device.
>> >> All this sums upto 1 second.
>> >
>> > Why are you doing it one at at time? It appears that this happens in
>> > build at boot up for you...
>> >
>>
>> Yes, this happenns at boot up of upper-layer.
>> Just as in kernel, probe of each device is
>> called by one by one, in upper-layer too, input device initialization
>> is done one by one in some order and input device number is searched.
>> So this is done every time.
>> Moreover, with naming convention, scanning is totally removed.
>> No need to scan/search even once.
>>
>> >>
>> >> >>
>> >> >> With naming convention, there is no need of search neither for dev
>> >> >> path nor for sysfs path because HAL directly know which node to
>> >> >> refer
>> >> >> for which input device and hence this 1 second is reduced to 10ms or
>> >> >> even less, therefore saving 990ms.  I believe, this is a very good
>> >> >> time saving. (from device booting perspective)
>> >> >
>> >> > OK, so create your own sysfs view and use it to do direct lookups.
>> >> >
>> >> >>
>> >> >> (Is there any direct way, without scanning all nodes for every input
>> >> >> device ?)
>> >> >>
>> >> >> >
>> >> >> > 2. Improves Readabilty of input and event sysfs node paths because
>> >> >> > names are used instead of numbers.
>> >> >>
>> >> >> I do not see why it is that important. If one wants overview
>> >> >> /proc/bus/input/devices gives nice picture.
>> >> >>
>> >> >> Re: (Aniroop Mathur)
>> >> >> Its correct, we can get an overview from /proc/bus/input/devices.
>> >> >> And therefore using this, we can know input node number for every
>> >> >> input device.
>> >> >> But there are many input devices and input numbers are not fixed,
>> >> >> so its quite difficult to memorize input number for all input
>> >> >> devices.
>> >> >> Therefore, if a user needs to open some input node from sysfs path,
>> >> >> he needs to check /proc/bus/input/devices before opening because
>> >> >> he does not know the input number. Moreover, this applies for all
>> >> >> other
>> >> >> input devices and hence a user need to check this every time.
>> >> >>
>> >> >> It improves readabilty as below
>> >> >>
>> >> >> Before:                               After patch:
>> >> >> /dev/input0                           /dev/input_proximity
>> >> >> /dev/input1                           /dev/input_accelerometer
>> >> >> ...many more
>> >> >>
>> >> >> /sys/class/input/input0
>> >> >> /sys/class/input/input_proximity
>> >> >> /sys/class/input/input1
>> >> >> /sys/class/input/input_accelerometer
>> >> >> ...many more
>> >> >>
>> >> >> /sys/class/input/event0
>> >> >> /sys/class/input/event_proximity
>> >> >> /sys/class/input/event1
>> >> >> /sys/class/input/event_accelerometer
>> >> >> ...many more
>> >> >>
>> >> >> So, just by looking, user can directly open or refer any input node.
>> >> >> (no need to refer any other path)
>> >> >
>> >> > User as in end user or your HAL layer?
>> >> >
>> >>
>> >> End user.
>> >
>> > Why would end user care? He wants his touchscreen to work, not fiddle
>> > with its settings, And we aleady discussed what system integrator should
>> > do.
>> >
>>
>> Yeah, i meant system integrator only.
>> Sorry, not end user (i used wrong term).
>> System integrator or code developer cares for this.
>>
>> >>
>> >> >>
>> >> >> >
>> >> >> > 3. Removes Input Devices Dependency. If one input device probe
>> >> >> > fails,
>> >> >> > other input devices still work.  Before this patch, if one input
>> >> >> > device probe fails before input_register_device, then input number
>> >> >> > of
>> >> >> > other input devices changes and due to this permission settings
>> >> >> > are
>> >> >> > disturbed and hence HAL or upper layer cannot open the required
>> >> >> > sysfs
>> >> >> > node because permission denied error comes.
>> >> >>
>> >> >> I have only one suggestion here: fix your userspace so that does not
>> >> >> depend on device initialization ordering.
>> >> >>
>> >> >> Re: (Aniroop Mathur)
>> >> >> We cannot fix userspace because these input/event/dev number are
>> >> >> decided/allocated in kernel as per device initialization ordering
>> >> >> during boot up. (userspace has no role in it) So, userspace is not
>> >> >> aware, which exact input number corresponds to which input device so
>> >> >> it ends up searching/scanning every input node untill a match is
>> >> >> found.
>> >> >>
>> >> >> So, there is input device dependency which needs to be removed.
>> >> >
>> >> > Do not use numbers. We emit uevents describing the devices and there
>> >> > a
>> >> > _lot_ of data there that helps identifying device, such as its path,
>> >> > subsystem, name, etc.
>> >> >
>> >>
>> >> Sorry, I am not able to understand this point with respect to removing
>> >> input
>> >> device dependency. Please elaborate a bit more.
>> >
>> > Look at the data that is passed in uevents that are sent either when new
>> > input device is created, or when you request replay of such evenst,
>> > realize that it is enough to identify the device and stop relying on
>> > inputX names to remain static. That's it.
>> >
>> > Thanks.
>> >
>> > --
>> > Dmitry
>>
>> As already mentioned above, the default uevents are not sufficient to
>> uniquely identify the input device. Can it ?
>>
>> Thanks and have a nice day,
>> Aniroop Mathur
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-input" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux