Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1440528 > unrolled thread
| Started by | Jean Delvare <jdelvare@suse.de> |
|---|---|
| First post | 2016-07-11 14:30 +0200 |
| Last post | 2016-07-26 17:20 +0200 |
| Articles | 7 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Jean Delvare <jdelvare@suse.de> - 2016-07-11 14:30 +0200
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Greg KH <gregkh@linuxfoundation.org> - 2016-07-12 01:10 +0200
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Viresh Kumar <viresh.kumar@linaro.org> - 2016-07-18 22:30 +0200
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Jean Delvare <jdelvare@suse.de> - 2016-07-25 11:40 +0200
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Viresh Kumar <viresh.kumar@linaro.org> - 2016-07-26 00:40 +0200
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Jean Delvare <jdelvare@suse.de> - 2016-07-26 09:50 +0200
Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2016-07-26 17:20 +0200
| From | Jean Delvare <jdelvare@suse.de> |
|---|---|
| Date | 2016-07-11 14:30 +0200 |
| Subject | Re: [PATCH 2/2] i2c-dev: Don't block the adapter from unregistering |
| Message-ID | <rTIvw-6WO-31@gated-at.bofh.it> |
Hi Viresh, On Wed, 6 Jul 2016 13:55:40 -0700, Viresh Kumar wrote: > On 06-07-16, 19:12, Jean Delvare wrote: > > Well well... I don't like this patch at all to be honest. > > Sure, I didn't like it much as well. I just wanted people to comment on what > else we can do here. We don't really want to add out-of-mainline stuff here. > > > My first question would be: what is keeping /dev/i2c-* open all the > > time? Originally i2c-dev was developed with development and debugging > > tools in mind (the i2c-tools suite.) The device nodes were never meant > > to be kept open for more than a few seconds. > > We thought that buggy userspace shouldn't be allowed to get kernel into trouble. > Isn't that the case ? Buggy user-space run by root can cause any kind of trouble. And the point being discussed here is amongst the most minor of these. But I even disagree with calling it buggy. > In our case this is what happens: > - userspace opens the file descriptor > - we try to forcefully remove the module from phone (that doesn't talk to > userspace to stop using the device). > - The module doesn't get ejected unless the app closes the fd. So you are basically building a test case to cause the problem. It's artificial. The adapter reference being held while the device node is open isn't a bug, it is a design decision. I would consider revisiting that design if there was a real world case where it causes trouble, but not for an artificially created test case. I don't see anything fundamentally wrong in the design anyway. I do not expect to be allowed to remove a hard disk drive from my system while its partitions are mounted, and I don't expect to be able to unmount partitions while users have files opened on them. You always have to tear things down in the right order. Same here. > > Do you have user-space i2c device drivers on your system? Which ones, > > No. Its probably an app written by some of our module app developers. > > > and why (I would expect all useful i2c devices to have a kernel > > driver.) > > That's what we have. Still no details here. What app, what is it doing, to what device is it talking, why is it not a kernel driver, and why do they keep the device node opened all the time? > > Requesting and freeing the i2c adapter for every transaction is going > > Well, we are just finding it (taking a reference of it) and the dropping its > reference. Yes, that's what I meant, sorry for using the wrong terms. > > to add a lot of overhead to all existing tools :-( > > :( i2cdump typically runs 258 ioctls on the device node, i2cdetect 235. i2c_get_adapter isn't cheap. Multiple function calls, mutex locking/unlocking, preemption disabling/enabling... You don't want do to that repeatedly if it can be avoided. So, nack from me. > > It's not like every user can open i2c device nodes and block the > > system. Only selected users should be able to open i2c device nodes > > (only root by default) so they should be responsible for not > > misbehaving. > > Hmmm. The problem is that they weren't told when the module tries to go away and > so they don't know that they need to close the fd. See my previous questions. We still don't know why they are doing what they are doing in user-space, nor why they think they have to keep the device node opened. They could always kill the application in question with: # fuser -k /dev/i2c-* before removing the module. Or find a more polite way to tell the application to quit. If they want to do it in user-space, they have to do it right. -- Jean Delvare SUSE L3 Support
[toc] | [next] | [standalone]
| From | Greg KH <gregkh@linuxfoundation.org> |
|---|---|
| Date | 2016-07-12 01:10 +0200 |
| Message-ID | <rTSuR-5aQ-11@gated-at.bofh.it> |
| In reply to | #1440528 |
On Mon, Jul 11, 2016 at 02:22:09PM +0200, Jean Delvare wrote: > Hi Viresh, > > On Wed, 6 Jul 2016 13:55:40 -0700, Viresh Kumar wrote: > > On 06-07-16, 19:12, Jean Delvare wrote: > > > Well well... I don't like this patch at all to be honest. > > > > Sure, I didn't like it much as well. I just wanted people to comment on what > > else we can do here. We don't really want to add out-of-mainline stuff here. > > > > > My first question would be: what is keeping /dev/i2c-* open all the > > > time? Originally i2c-dev was developed with development and debugging > > > tools in mind (the i2c-tools suite.) The device nodes were never meant > > > to be kept open for more than a few seconds. > > > > We thought that buggy userspace shouldn't be allowed to get kernel into trouble. > > Isn't that the case ? > > Buggy user-space run by root can cause any kind of trouble. And the > point being discussed here is amongst the most minor of these. But I > even disagree with calling it buggy. > > > In our case this is what happens: > > - userspace opens the file descriptor > > - we try to forcefully remove the module from phone (that doesn't talk to > > userspace to stop using the device). > > - The module doesn't get ejected unless the app closes the fd. > > So you are basically building a test case to cause the problem. It's > artificial. The adapter reference being held while the device node is > open isn't a bug, it is a design decision. I would consider revisiting > that design if there was a real world case where it causes trouble, but > not for an artificially created test case. > > I don't see anything fundamentally wrong in the design anyway. I do not > expect to be allowed to remove a hard disk drive from my system while > its partitions are mounted, and I don't expect to be able to unmount > partitions while users have files opened on them. You always have to > tear things down in the right order. Same here. But that's exactly what you do today when your USB disk falls out of it's connection. The kernel recovers and you move on. Hopefully it wasn't your root partition :) Same for a serial device that has open userspace descriptors that is removed from the system, or almost any other type of device that can be physically removed from a system while it is currently running (PCI, firewire, thunderbolt, etc.) What happens if you have an i2c device on a PCI card that is removed while userspace has that device descriptor open? You need to "invalidate" it and not oops if userspace keeps reading/writing to it. > > > Do you have user-space i2c device drivers on your system? Which ones, > > > > No. Its probably an app written by some of our module app developers. > > > > > and why (I would expect all useful i2c devices to have a kernel > > > driver.) > > > > That's what we have. > > Still no details here. What app, what is it doing, to what device is it > talking, why is it not a kernel driver, and why do they keep the device > node opened all the time? Any random application can write to an i2c device in this system, as long as it has "permission" to do so. But, it's hardware, and on a bus that sometimes can be yanked out of the system. When that happens, userspace will be notified of the removal, and "should" be nice and clean up after itself. But there will always be some lag between the actual removal when the kernel figures it out, and when userspace finally closes that device node. So not crashing the kernel is a nice thing to prevent from happening during that window of when the device is removed and userspace hasn't quite noticed it yet. > > > Requesting and freeing the i2c adapter for every transaction is going > > > > Well, we are just finding it (taking a reference of it) and the dropping its > > reference. > > Yes, that's what I meant, sorry for using the wrong terms. > > > > to add a lot of overhead to all existing tools :-( > > > > :( > > i2cdump typically runs 258 ioctls on the device node, i2cdetect 235. > i2c_get_adapter isn't cheap. Multiple function calls, mutex > locking/unlocking, preemption disabling/enabling... You don't want do > to that repeatedly if it can be avoided. So, nack from me. > > > > It's not like every user can open i2c device nodes and block the > > > system. Only selected users should be able to open i2c device nodes > > > (only root by default) so they should be responsible for not > > > misbehaving. > > > > Hmmm. The problem is that they weren't told when the module tries to go away and > > so they don't know that they need to close the fd. > > See my previous questions. We still don't know why they are doing what > they are doing in user-space, nor why they think they have to keep the > device node opened. > > They could always kill the application in question with: > # fuser -k /dev/i2c-* > before removing the module. Or find a more polite way to tell the > application to quit. If they want to do it in user-space, they have to > do it right. Ideally, yes, userspace will have closed that device node. But again, hardware isn't kind and sometimes decides to be yanked out by users before they tell the kernel about it. We handle this for almost all other device subsystems, i2c is one of the last to be fixed up in this manner. Sorry it's taken us well over a decade to get here :) hope that explains things better, greg k-h
[toc] | [prev] | [next] | [standalone]
| From | Viresh Kumar <viresh.kumar@linaro.org> |
|---|---|
| Date | 2016-07-18 22:30 +0200 |
| Message-ID | <rWnkT-2Af-37@gated-at.bofh.it> |
| In reply to | #1440962 |
On 11-07-16, 14:50, Greg KH wrote: > Ideally, yes, userspace will have closed that device node. But again, > hardware isn't kind and sometimes decides to be yanked out by users > before they tell the kernel about it. We handle this for almost all > other device subsystems, i2c is one of the last to be fixed up in this > manner. Sorry it's taken us well over a decade to get here :) > > hope that explains things better, @Jean: Ping :) -- viresh
[toc] | [prev] | [next] | [standalone]
| From | Jean Delvare <jdelvare@suse.de> |
|---|---|
| Date | 2016-07-25 11:40 +0200 |
| Message-ID | <rYKwF-2SU-1@gated-at.bofh.it> |
| In reply to | #1440962 |
Hi Greg, Viresh, On Mon, 11 Jul 2016 14:50:58 -0700, Greg KH wrote: > On Mon, Jul 11, 2016 at 02:22:09PM +0200, Jean Delvare wrote: > > So you are basically building a test case to cause the problem. It's > > artificial. The adapter reference being held while the device node is > > open isn't a bug, it is a design decision. I would consider revisiting > > that design if there was a real world case where it causes trouble, but > > not for an artificially created test case. > > > > I don't see anything fundamentally wrong in the design anyway. I do not > > expect to be allowed to remove a hard disk drive from my system while > > its partitions are mounted, and I don't expect to be able to unmount > > partitions while users have files opened on them. You always have to > > tear things down in the right order. Same here. > > But that's exactly what you do today when your USB disk falls out of > it's connection. The kernel recovers and you move on. Hopefully it > wasn't your root partition :) > > Same for a serial device that has open userspace descriptors that is > removed from the system, or almost any other type of device that can be > physically removed from a system while it is currently running (PCI, > firewire, thunderbolt, etc.) What happens if you have an i2c device on > a PCI card that is removed while userspace has that device descriptor > open? You need to "invalidate" it and not oops if userspace keeps > reading/writing to it. Honestly I have no idea what would happen in this case. I would expect the PCI card to be offlined by software first, before it is physically removed. Hot-unplug doesn't mean hot-tearoff ;-) In case unprepared hardware tear-off actually happens (more realistically on USB rather than PCI I suppose) I agree we want to avoid oopses and other horrible consequences and behave as smoothly as possible. The code was not written with this scenario in mind, so additional work is certainly needed. > > (...) > > Still no details here. What app, what is it doing, to what device is it > > talking, why is it not a kernel driver, and why do they keep the device > > node opened all the time? > > Any random application can write to an i2c device in this system, as > long as it has "permission" to do so. But, it's hardware, and on a bus > that sometimes can be yanked out of the system. When that happens, > userspace will be notified of the removal, and "should" be nice and I don't think there is any such notification on i2c device nodes at the moment. Unless it's something generic. But I'm certain i2cdump etc. aren't listening anyway. > clean up after itself. But there will always be some lag between the > actual removal when the kernel figures it out, and when userspace > finally closes that device node. > > So not crashing the kernel is a nice thing to prevent from happening > during that window of when the device is removed and userspace hasn't > quite noticed it yet. I agree. > > (...) > > See my previous questions. We still don't know why they are doing what > > they are doing in user-space, nor why they think they have to keep the > > device node opened. > > > > They could always kill the application in question with: > > # fuser -k /dev/i2c-* > > before removing the module. Or find a more polite way to tell the > > application to quit. If they want to do it in user-space, they have to > > do it right. > > Ideally, yes, userspace will have closed that device node. But again, > hardware isn't kind and sometimes decides to be yanked out by users > before they tell the kernel about it. We handle this for almost all > other device subsystems, i2c is one of the last to be fixed up in this > manner. Sorry it's taken us well over a decade to get here :) The problem is that the patch proposed by Viresh has nothing to do with this. It's not adding notifications, just changing the time frame during which user-space holds a reference to the i2c (bus) device. The goal as I understand it is to allow *prepared* hot-unplug (in the form of "rmmod i2c-bus-device-driver" or sysfs-based offlining?) while user-space processes have i2c device nodes open. Unprepared hot-unplug will still go wrong exactly as it goes now. My point is that prepared hot-unplug can already be achieved today without any patch. Or possibly improved by adding a notification mechanism. But not by changing the reference holding design. Not only the proposed patch does not help and degrades the performance, but it breaks assumptions. For example, it would allow an application to open an i2c bus, then you remove its driver and load another i2c bus driver, which gets the same bus number, and now the application writes to a completely different I2C bus segment. The current reference model prevents that, on purpose. So, again, nack from me. -- Jean Delvare SUSE L3 Support
[toc] | [prev] | [next] | [standalone]
| From | Viresh Kumar <viresh.kumar@linaro.org> |
|---|---|
| Date | 2016-07-26 00:40 +0200 |
| Message-ID | <rYWHv-2cA-1@gated-at.bofh.it> |
| In reply to | #1449405 |
Hi Jean, On 25-07-16, 11:39, Jean Delvare wrote: > The problem is that the patch proposed by Viresh has nothing to do with > this. It's not adding notifications, just changing the time frame during > which user-space holds a reference to the i2c (bus) device. The goal as > I understand it is to allow *prepared* hot-unplug (in the form of > "rmmod i2c-bus-device-driver" or sysfs-based offlining?) while Not really. We are concerned about both prepared and Unprepared cases. This *hacky* patch was useful in case of *unprepared* hot-unplug as well. Here is the sequence of events: - open() i2c device from userspace - do some operations on the device read/write/ioctls() .. - Module hot-unplugged (*unprepared*) - Some of the ongoing i2c transactions may just fail, that is fine .. - Kernel detected the interrupt about module removal and tries to cleanup the devices.. - Now, kernel can not remove the i2c device, unless user application has closed the file descriptor. And so kernel is waiting in the driver's ->remove() callback forever. Also, there is no way to co-ordinate (in Android) with the Applications using the device. They can crash or fail out if they want to, but the kernel shouldn't stop removal of a hardware module in that case. > user-space processes have i2c device nodes open. Unprepared hot-unplug > will still go wrong exactly as it goes now. > My point is that prepared hot-unplug can already be achieved today > without any patch. Yeah, if we have the option of stopping the applications before the device is gone. > Or possibly improved by adding a notification > mechanism. But not by changing the reference holding design. > > Not only the proposed patch does not help and degrades the performance, > but it breaks assumptions. For example, it would allow an application > to open an i2c bus, then you remove its driver and load another i2c bus > driver, which gets the same bus number, and now the application writes > to a completely different I2C bus segment. The current reference model > prevents that, on purpose. > > So, again, nack from me. Yeah, the patch wasn't great and I knew it from the beginning. But we are looking for a solution that can be accepted and so need advice from you guys :) -- viresh
[toc] | [prev] | [next] | [standalone]
| From | Jean Delvare <jdelvare@suse.de> |
|---|---|
| Date | 2016-07-26 09:50 +0200 |
| Message-ID | <rZ5hM-7Cz-29@gated-at.bofh.it> |
| In reply to | #1450167 |
Hi Viresh, On Mon, 25 Jul 2016 15:31:40 -0700, Viresh Kumar wrote: > On 25-07-16, 11:39, Jean Delvare wrote: > > The problem is that the patch proposed by Viresh has nothing to do with > > this. It's not adding notifications, just changing the time frame during > > which user-space holds a reference to the i2c (bus) device. The goal as > > I understand it is to allow *prepared* hot-unplug (in the form of > > "rmmod i2c-bus-device-driver" or sysfs-based offlining?) while > > Not really. We are concerned about both prepared and Unprepared cases. > > This *hacky* patch was useful in case of *unprepared* hot-unplug as well. > > Here is the sequence of events: > - open() i2c device from userspace > - do some operations on the device read/write/ioctls() .. > - Module hot-unplugged (*unprepared*) > - Some of the ongoing i2c transactions may just fail, that is fine .. > - Kernel detected the interrupt about module removal and tries to > cleanup the devices.. > - Now, kernel can not remove the i2c device, unless user application > has closed the file descriptor. Well, what is the application doing at that point? What error codes is it getting? Should it not close the device node and bail out? > And so kernel is waiting in the driver's ->remove() callback forever. > > Also, there is no way to co-ordinate (in Android) with the > Applications using the device. Why? Looks like a serious limitation. At this point I still don't know what application we are talking about, why it has to be in user-space when I2C device drivers are supposed to be on the kernel side, nor why they have to keep the i2c device node opened all the time. Why do you insist on relying on i2c-dev when it is so clearly no compatible with your requirements? > They can crash or fail out if they > want to, but the kernel shouldn't stop removal of a hardware module in > that case. If they crash or bail out, that would close the device, so no problem. The problem would be if they stay alive and misbehave. If the kernel should be completely independent from what user-space is doing, this is simply not compatible with reference counting. The whole point of counting references is to know when a device is still in use, and prevent it from being removed while this is the case. If you say that devices can be removed at any time and this is OK, then you should not be counting references at all, this is pointless. But I doubt the i2c code is currently ready for this. > > user-space processes have i2c device nodes open. Unprepared hot-unplug > > will still go wrong exactly as it goes now. > > > My point is that prepared hot-unplug can already be achieved today > > without any patch. > > Yeah, if we have the option of stopping the applications before the > device is gone. > > > Or possibly improved by adding a notification > > mechanism. But not by changing the reference holding design. > > > > Not only the proposed patch does not help and degrades the performance, > > but it breaks assumptions. For example, it would allow an application > > to open an i2c bus, then you remove its driver and load another i2c bus > > driver, which gets the same bus number, and now the application writes > > to a completely different I2C bus segment. The current reference model > > prevents that, on purpose. > > > > So, again, nack from me. > > Yeah, the patch wasn't great and I knew it from the beginning. But we > are looking for a solution that can be accepted and so need advice > from you guys :) I have no idea, sorry. Hopefully Greg or Wolfram know more? Check what other subsystems are doing? -- Jean Delvare SUSE L3 Support
[toc] | [prev] | [next] | [standalone]
| From | Dmitry Torokhov <dmitry.torokhov@gmail.com> |
|---|---|
| Date | 2016-07-26 17:20 +0200 |
| Message-ID | <rZcjf-3yU-15@gated-at.bofh.it> |
| In reply to | #1450456 |
Hi Jean, On Tue, Jul 26, 2016 at 12:41 AM, Jean Delvare <jdelvare@suse.de> wrote: > Hi Viresh, > > On Mon, 25 Jul 2016 15:31:40 -0700, Viresh Kumar wrote: >> On 25-07-16, 11:39, Jean Delvare wrote: >> > The problem is that the patch proposed by Viresh has nothing to do with >> > this. It's not adding notifications, just changing the time frame during >> > which user-space holds a reference to the i2c (bus) device. The goal as >> > I understand it is to allow *prepared* hot-unplug (in the form of >> > "rmmod i2c-bus-device-driver" or sysfs-based offlining?) while >> >> Not really. We are concerned about both prepared and Unprepared cases. >> >> This *hacky* patch was useful in case of *unprepared* hot-unplug as well. >> >> Here is the sequence of events: >> - open() i2c device from userspace >> - do some operations on the device read/write/ioctls() .. >> - Module hot-unplugged (*unprepared*) >> - Some of the ongoing i2c transactions may just fail, that is fine .. >> - Kernel detected the interrupt about module removal and tries to >> cleanup the devices.. >> - Now, kernel can not remove the i2c device, unless user application >> has closed the file descriptor. > > Well, what is the application doing at that point? What error codes is > it getting? Should it not close the device node and bail out? It should. Will it? It is up to the application. It may decide to keep that file descriptor open forever. > >> And so kernel is waiting in the driver's ->remove() callback forever. >> >> Also, there is no way to co-ordinate (in Android) with the >> Applications using the device. > > Why? Looks like a serious limitation. > > At this point I still don't know what application we are talking about, > why it has to be in user-space when I2C device drivers are supposed to > be on the kernel side, nor why they have to keep the i2c device node > opened all the time. > > Why do you insist on relying on i2c-dev when it is so clearly no > compatible with your requirements? If you provide an interface expect it to be used, maybe even in the ways you did not anticipated. Kernel's (and out task) is to make the interface behave properly, not police users. > >> They can crash or fail out if they >> want to, but the kernel shouldn't stop removal of a hardware module in >> that case. > > If they crash or bail out, that would close the device, so no problem. > The problem would be if they stay alive and misbehave. > > If the kernel should be completely independent from what user-space is > doing, this is simply not compatible with reference counting. The whole > point of counting references is to know when a device is still in use, > and prevent it from being removed while this is the case. If you say > that devices can be removed at any time and this is OK, then you should > not be counting references at all, this is pointless. But I doubt the > i2c code is currently ready for this. There are multitude of reference counts, all counting different things, not one refcount for the entire thing. You have refcount for the file object, you have memory refcounts, you have device object refcounts. And note that device and driver bond is not refcounted at all. It is supposed to be allowed to be broken at [pretty much] any moment. You just need to be careful when doing so ;) > >> > user-space processes have i2c device nodes open. Unprepared hot-unplug >> > will still go wrong exactly as it goes now. >> >> > My point is that prepared hot-unplug can already be achieved today >> > without any patch. >> >> Yeah, if we have the option of stopping the applications before the >> device is gone. >> >> > Or possibly improved by adding a notification >> > mechanism. But not by changing the reference holding design. >> > >> > Not only the proposed patch does not help and degrades the performance, >> > but it breaks assumptions. For example, it would allow an application >> > to open an i2c bus, then you remove its driver and load another i2c bus >> > driver, which gets the same bus number, and now the application writes >> > to a completely different I2C bus segment. The current reference model >> > prevents that, on purpose. >> > >> > So, again, nack from me. >> >> Yeah, the patch wasn't great and I knew it from the beginning. But we >> are looking for a solution that can be accepted and so need advice >> from you guys :) > > I have no idea, sorry. Hopefully Greg or Wolfram know more? Check what > other subsystems are doing? One option is to, upon device removal, to mark it as "dead" to allow accesses through i2c-dev to return error, release all hardware resources, but keep the object in memory in zombie state, waiting for the last user to drop the reference. Once that happens (maybe years later) you finally can release last bits of memory. You can check how we do that for input_dev/evdev pair. Thanks. -- Dmitry
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web