* HID device names @ 2009-10-12 13:02 Jean Delvare 2009-10-12 14:01 ` Jiri Kosina 0 siblings, 1 reply; 3+ messages in thread From: Jean Delvare @ 2009-10-12 13:02 UTC (permalink / raw) To: Jiri Kosina; +Cc: linux-input Hi Jiri, Looking at hid-core.c, I see the following: dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, hdev->vendor, hdev->product, atomic_inc_return(&id)); This looks plain wrong to me. The vendor and product IDs can be attributes of the devices, but they should not be part of the device name aka bus_id. The bus_id is about the address of the device, not what the device is. Just look at how the PCI or USB subsystems do, or virtually any other kernel subsystem, as I don't think any other subsystem does what HID is doing right now. On top of this, using an auto-incrementing device ID in the bus_id looks wrong too. For one thing, it will cycle after 65536 requests, so the above does not guarantee uniqueness over time. If anything, you should used an idr instead. But even that would probably be wrong, because this scheme itself doesn't guarantee stability of the bus_id over disconnect/reconnect, reboot, etc. While I agree it's not always possible to guarantee stability especially for externally pluggable devices, we should try to keep names as stable as we can. The above makes me wonder if handling hid as a bus is really the right thing to do, as apparently your devices do not have an address you can use to generate a good-looking bus_id. Shouldn't hid devices be class devices instead? -- Jean Delvare ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: HID device names 2009-10-12 13:02 HID device names Jean Delvare @ 2009-10-12 14:01 ` Jiri Kosina 2009-10-12 14:49 ` Jean Delvare 0 siblings, 1 reply; 3+ messages in thread From: Jiri Kosina @ 2009-10-12 14:01 UTC (permalink / raw) To: Jean Delvare, Jiri Slaby; +Cc: linux-input [ adding Jiri Slaby, who actually implemented HID bus ] On Mon, 12 Oct 2009, Jean Delvare wrote: > Looking at hid-core.c, I see the following: > > dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, > hdev->vendor, hdev->product, atomic_inc_return(&id)); > > This looks plain wrong to me. The vendor and product IDs can be > attributes of the devices, but they should not be part of the device > name aka bus_id. The bus_id is about the address of the device, not > what the device is. Hi Jean, yeah, I am aware of this. The problem is, that the HID bus is designed to be used by devices that can be physically completely different from each other (currently we use it for Bluetooth and USB, and it is likely that there will be more low-level transports protocols appearing later, which will use HID as the on-wire protocol). This means that it might not be possible to find "unified addressing scheme". > Just look at how the PCI or USB subsystems do, or virtually any other > kernel subsystem, as I don't think any other subsystem does what HID is > doing right now. You have chosen examples which have relatively good 1:1 mapping to the physical, low-level devices that are uniquely addressed. But there are examples also of very similar approach to what we have in HID -- look at for example how 'serio' bus does this (serio_init_port()). What we have there is exactly what we do in HID core (including the atomic_t counter), even omitting vendor/product ID. > On top of this, using an auto-incrementing device ID in the bus_id looks > wrong too. For one thing, it will cycle after 65536 requests, so the > above does not guarantee uniqueness over time. If anything, you should > used an idr instead. Sorry, I don't get this. Why should it overflow after 65536 requests? It overflows as soon as atomic_t overflows on given architecture, doesn't it? > But even that would probably be wrong, because this scheme itself > doesn't guarantee stability of the bus_id over disconnect/reconnect, > reboot, etc. While I agree it's not always possible to guarantee > stability especially for externally pluggable devices, we should try to > keep names as stable as we can. Do you have any real problem/breakage caused by this, that needs to be fixed? Or is it this is against your feeling and perception of how things should be done? Thanks, -- Jiri Kosina SUSE Labs, Novell Inc. ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: HID device names 2009-10-12 14:01 ` Jiri Kosina @ 2009-10-12 14:49 ` Jean Delvare 0 siblings, 0 replies; 3+ messages in thread From: Jean Delvare @ 2009-10-12 14:49 UTC (permalink / raw) To: Jiri Kosina; +Cc: Jiri Slaby, linux-input Hi Jiri(s), On Mon, 12 Oct 2009 16:01:08 +0200 (CEST), Jiri Kosina wrote: > > [ adding Jiri Slaby, who actually implemented HID bus ] > > On Mon, 12 Oct 2009, Jean Delvare wrote: > > > Looking at hid-core.c, I see the following: > > > > dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, > > hdev->vendor, hdev->product, atomic_inc_return(&id)); > > > > This looks plain wrong to me. The vendor and product IDs can be > > attributes of the devices, but they should not be part of the device > > name aka bus_id. The bus_id is about the address of the device, not > > what the device is. > > yeah, I am aware of this. > > The problem is, that the HID bus is designed to be used by devices that > can be physically completely different from each other (currently we use > it for Bluetooth and USB, and it is likely that there will be more > low-level transports protocols appearing later, which will use HID as the > on-wire protocol). This means that it might not be possible to find > "unified addressing scheme". > > > Just look at how the PCI or USB subsystems do, or virtually any other > > kernel subsystem, as I don't think any other subsystem does what HID is > > doing right now. > > You have chosen examples which have relatively good 1:1 mapping to the > physical, low-level devices that are uniquely addressed. > > But there are examples also of very similar approach to what we have in > HID -- look at for example how 'serio' bus does this (serio_init_port()). > What we have there is exactly what we do in HID core (including the Right... but I'd argue that serio should be a class and not a bus, too. The "serio%ld" name itself does look like class device names, doesn't it? > atomic_t counter), even omitting vendor/product ID. Omitting vendor and product IDs make a lot of sense, as they aren't part of the device name uniqueness. Back to the hid naming scheme, the vendor and product IDs make the name longer with no benefit that I can see. And as you pointed out yourself, different underlying protocols (USB, bluetooth, etc.) will have different conventions for these IDs, so it can even get confusing. Isn't it exactly the purpose of class devices to abstract devices with different underlying low-level hardware details based on their common functionality? > > On top of this, using an auto-incrementing device ID in the bus_id looks > > wrong too. For one thing, it will cycle after 65536 requests, so the > > above does not guarantee uniqueness over time. If anything, you should > > used an idr instead. > > Sorry, I don't get this. Why should it overflow after 65536 requests? It > overflows as soon as atomic_t overflows on given architecture, doesn't it? Forget about this, I was severely mistaken when writing this. For some reason I thought %04x would truncate the number to 4 digits. Which it definitely does not, and I am perfectly aware that it doesn't. That's one of these moments when you read a random post, say "who is the idiot who wrote this", then "oh, that would be me" ;) > > But even that would probably be wrong, because this scheme itself > > doesn't guarantee stability of the bus_id over disconnect/reconnect, > > reboot, etc. While I agree it's not always possible to guarantee > > stability especially for externally pluggable devices, we should try to > > keep names as stable as we can. > > Do you have any real problem/breakage caused by this, that needs to be > fixed? Or is it this is against your feeling and perception of how things > should be done? Originally I looked into it because we have our first hardware monitoring device which is a HID device, and libsensors needs to be taught how to (uniquely) name it. So I had to look into the naming strategy on the kernel side, and was surprised by the length and format. As far as libsensors is concerned, I have decided to skip the vendor and product IDs, just keeping the bus number (whatever it is) and the incremental ID. This fits well (while it did _not_ fit with the vendor and product IDs - we never expected to require 64 bits to uniquely identify a device in the system.) So the problem is solved, except that the code will break the day you change the naming in the kernel, which is why I'd rather see it happen sooner than later if it is bound to happen. Other than that, yes I feel that it's wrong, but no it is not causing too much problems to me. Thanks, -- Jean Delvare ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-10-12 14:49 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-10-12 13:02 HID device names Jean Delvare 2009-10-12 14:01 ` Jiri Kosina 2009-10-12 14:49 ` Jean Delvare
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).