On Wed, Mar 31, 2021 at 05:03:45PM +0200, Greg Kroah-Hartman wrote: > > It isn't a struct device object at all though, it just organizing > > attributes. > > That's the point, it really is not. You are forced to create a real > object for that subdirectory, and by doing so, you are "breaking" the > driver/device model. As is evident by userspace not knowing what is > going on here. I'm still not really sure about what this means in practice.. I found an nested attribute in RDMA land so lets see how it behaves. /sys/class/infiniband/ibp0s9/ <-- This is a struct device/ib_device Then we have 261 'attribute' files under a ports subdirectory, for instance: /sys/class/infiniband/ibp0s9/ports/1/cm_tx_retries/dreq Open/read works fine, and the specialty userspace that people built on this has been working for a long time. Does udev see the deeply nested attributes? Apparently yes: $ udevadm info -a /sys/class/infiniband/ibp0s9 ATTR{ports/1/cm_rx_duplicates/dreq}=="0" [..] Given your remarks, I'm surprised, but it seems to work - I assume if udevadm shows it then all the rules will work too. Has udev become confused about what is a struct device? Looks like no: $ udevadm info -a /sys/class/infiniband/ibp0s9/port Unknown device "/sys/class/infiniband/ibp0s9/port": No such device Can you give an example where things go wrong? (and I inherited this RDMA stuff. In the last two years we moved it all to netlink and modern userspace largely no longer touches sysfs, but I can't break in-use uAPI) > > > Does that help? The rules are: > > > - Once you use a 'struct device', all subdirs below that device > > > are either an attribute group for that device or a child > > > device. > > > - A struct device can NOT have an attribute group as a parent, > > > it can ONLY have another struct device as a parent. > > > > > > If you break those rules, the kernel has the ability to get really > > > confused unless you are very careful, and userspace will be totally lost > > > as you can not do anything special there. > > > > The kernel gets confused? > > Putting a kobject as a child of a struct device can easily cause > confusion as that is NOT what you should be doing. Especially if you > then try to add a device to be a child of that kobject. That I've never seen. I've only seen people making extra levels of directories for organizing attributes. > > How do you fix them? It is uAPI at this point so we can't change the > > directory names. Can't make them struct devices (userspace would get > > confused if we add *more* sysfs files) > > How would userspace get confused? If anything it would suddenly "wake > up" and see these attributes properly. We are talking about specialty userspace that is designed to work with the sysfs layout as-is. Not udev. In some of these subdirs the userspace does readdir() on - if you start adding random stuff it will break it. > > Since it seems like kind of a big problem can we make this allowed > > somehow? > > No, not at all. Please do not do that. I will look into the existing > users and try to see if I can fix them up. Maybe start annoying people > by throwing warnings if you try to register a kobject as a child of a > device... How does that mesh with our don't break userspace ideal?? :( > > Well, from what I understand, it wont be used because udev can't do > > three level deep attributes, and if that hasn't been a problem in that > > last 10 years for the existing places, it might not ever be needed in > > udev at all. > > If userspace is not seeing these attributes then WHY CREATE THEM AT > ALL??? *udev* is not the userspace! People expose sysfs attributes and then make specialty userspace to consume them! I've seen it many times now. > Seriously, what is needing to see these in sysfs if not the tools that > we have today to use sysfs? Are you wanting to create new tools instead > to handle these new attributes? Maybe just do not create them in the > first place? This advice is about 10 years too late :( Regardless, lets not do deeply nested attributes here in PCI. They are PITA anyhow. Jason