On Wed, Jun 16, 2021 at 11:47:01AM -0700, Siddharth Gupta wrote:Oh okay. I thought ueventd does it because it allows setting
On 6/15/2021 10:58 PM, Greg KH wrote:No, systemd does not create device nodes, and neither does udev. Hasn't
On Tue, Jun 15, 2021 at 12:03:26PM -0700, Siddharth Gupta wrote:I am not fully aware of when devtmpfs is enabled or not, but in
On 6/14/2021 9:56 PM, Greg KH wrote:It isn't an issue of systemd/ueventd, those do not control /dev on a
On Mon, Jun 14, 2021 at 07:21:08PM -0700, Siddharth Gupta wrote:My testing was done with toybox + Android's ueventd ramdisk.
When cdev_add is called after device_add has been called there is noSo this means no one ever ran this code on a system that used devtmpfs?
way for the userspace to know about the addition of a cdev as cdev_add
itself doesn't trigger a uevent notification, or for the kernel to
know about the change to devt. This results in two problems:
- mknod is never called for the cdev and hence no cdev appears on
devtmpfs.
- sysfs links to the new cdev are not established.
The cdev needs to be added and devt assigned before device_add() is
called in order for the relevant sysfs and devtmpfs entries to be
created and the uevent to be properly populated.
How was it ever tested?
As I mentioned in the discussion, the race became evident
recently. I will make sure to test all such changes without
systemd/ueventd in the future.
normal system, that is what devtmpfs is for.
case it is not - systemd/ueventd will create these files with
mknod, right?
done so for well over 10 years now.
Right. To clarify, I did this after we started seeing the problem
I was even manually able to call mknod from theYes, that is fine, but that also means that this was not working from
terminal when some of the remoteproc character device entries
showed up (using major number from there, and minor number being
the remoteproc id), and that allowed me to boot up the
remoteprocs as well.
the very beginning :(
Thanks for the explanation! As I mentioned earlier - I was under
/dev on modern systems is managed by devtmpfs, which knows to create theAnd devtmpfs nodes are only created if you create a struct deviceI am not sure of what you mean by a static /dev? Could you
somewhere with a proper major/minor, which you were not doing here, so
you must have had a static /dev on your test systems, right?
explain? In case you mean the character device would be
non-functional, that is not the case. They have been working
for us since the beginning.
device nodes when you properly register the device with the driver core.
A "static" /dev is managed by mknod from userspace, like you did "by
hand", and that is usually only done by older systems.
thanks,
greg k-h