On 1/1/2018 7:18 PM, Matthew Wilcox wrote:
On Sat, Dec 30, 2017 at 06:00:57PM -0500, Theodore Ts'o wrote:
On Sat, Dec 30, 2017 at 05:40:28PM -0500, Theodore Ts'o wrote:
On Sat, Dec 30, 2017 at 12:44:17PM -0800, Matthew Wilcox wrote:
I'm not sure I agree with this part. What if we add a new TCP lock class
for connections which are used for filesystems/network block devices/...?
Yes, it'll be up to each user to set the lockdep classification correctly,
but that's a relatively small number of places to add annotations,
and I don't see why it wouldn't work.
I was exagerrating a bit for effect, I admit. (but only a bit).
I feel like there's been rather too much of that recently. Can we stick
to facts as far as possible, please?
It can probably be for all TCP connections that are used by kernel
code (as opposed to userspace-only TCP connections). But it would
probably have to be each and every device-mapper instance, each and
every block device, each and every mounted file system, each and every
bdi object, etc.
Clarification: all TCP connections that are used by kernel code would
need to be in their own separate lock class. All TCP connections used
only by userspace could be in their own shared lock class. You can't
use a one lock class for all kernel-used TCP connections, because of
the Network Block Device mounted on a local file system which is then
exported via NFS and squirted out yet another TCP connection problem.
So the false positive you're concerned about is write-comes-in-over-NFS
(with socket lock held), NFS sends a write request to local filesystem,
local filesystem sends write to block device, block device sends a
packet to a socket which takes that socket lock.
I don't think we need to be as drastic as giving each socket its own lock
class to solve this. All NFS sockets can be in lock class A; all NBD
sockets can be in lock class B; all user sockets can be in lock class
C; etc.
Also, what to do with TCP connections which are created in userspace
(with some authentication exchanges happening in userspace), and then
passed into kernel space for use in kernel space, is an interesting
question.
Yes! I'd love to have a lockdep expert weigh in here. I believe it's
legitimate to change a lock's class after it's been used, essentially
destroying it and reinitialising it. If not, it should be because it's
a reasonable design for an object to need different lock classes for
different phases of its existance.
I also think it should be done ultimately. And I think it's very much
hard since it requires to change the dependency graph of lockdep but
anyway possible. It's up to lockdep maintainer's will though..
--
Thanks,
Byungchul