lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <Pine.LNX.4.44L0.0911021610030.28727-100000@netrider.rowland.org>
Date:	Mon, 2 Nov 2009 16:21:23 -0500 (EST)
From:	Alan Stern <stern@...land.harvard.edu>
To:	linux-pcmcia@...ts.infradead.org
cc:	Kernel development list <linux-kernel@...r.kernel.org>
Subject: Lockdep violation in pcmcia

I've been getting these warnings for a long, long time, and finally 
decided to report them:

[ 1893.033051] =============================================
[ 1893.036023] [ INFO: possible recursive locking detected ]
[ 1893.036023] 2.6.31 #2
[ 1893.036023] ---------------------------------------------
[ 1893.036023] cardmgr/1457 is trying to acquire lock:
[ 1893.036023]  (pcmcia_socket_list_rwsem){++++.+}, at: [<c8874867>] adjust_memory+0x71/0xbd [rsrc_nonstatic]
[ 1893.036023]
[ 1893.036023] but task is already holding lock:
[ 1893.036023]  (pcmcia_socket_list_rwsem){++++.+}, at: [<c8972e5b>] ds_ioctl+0x282/0xa6b [pcmcia]
[ 1893.036023]
[ 1893.036023] other info that might help us debug this:
[ 1893.036023] 2 locks held by cardmgr/1457:
[ 1893.036023]  #0:  (pcmcia_socket_list_rwsem){++++.+}, at: [<c8972e5b>] ds_ioctl+0x282/0xa6b [pcmcia]
[ 1893.036023]  #1:  (rsrc_mutex){+.+.+.}, at: [<c887482f>] adjust_memory+0x39/0xbd [rsrc_nonstatic]
[ 1893.036023]
[ 1893.036023] stack backtrace:
[ 1893.036023] Pid: 1457, comm: cardmgr Not tainted 2.6.31 #2
[ 1893.036023] Call Trace:
[ 1893.036023]  [<c1040143>] __lock_acquire+0x741/0xa61
[ 1893.036023]  [<c103ed06>] ? mark_held_locks+0x3b/0x56
[ 1893.036023]  [<c10404bb>] lock_acquire+0x58/0x7a
[ 1893.036023]  [<c8874867>] ? adjust_memory+0x71/0xbd [rsrc_nonstatic]
[ 1893.036023]  [<c11c1f28>] down_read+0x2a/0x3e
[ 1893.036023]  [<c8874867>] ? adjust_memory+0x71/0xbd [rsrc_nonstatic]
[ 1893.036023]  [<c8874867>] adjust_memory+0x71/0xbd [rsrc_nonstatic]
[ 1893.036023]  [<c88747f6>] ? adjust_memory+0x0/0xbd [rsrc_nonstatic]
[ 1893.036023]  [<c8972f05>] ds_ioctl+0x32c/0xa6b [pcmcia]
[ 1893.036023]  [<c10efa65>] ? _raw_spin_trylock+0x2b/0x30
[ 1893.036023]  [<c107c077>] vfs_ioctl+0x4c/0x65
[ 1893.036023]  [<c107c58a>] do_vfs_ioctl+0x451/0x478
[ 1893.036023]  [<c1040987>] ? lock_release+0x12c/0x133
[ 1893.036023]  [<c107c5db>] sys_ioctl+0x2a/0x43
[ 1893.036023]  [<c1002a48>] sysenter_do_call+0x12/0x36

Is this problem already well known?

The cause is easy enough to track down.  In pcmcia_ioctl.c,
pcmcia_adjust_resource_info() does a down_read() on
pcmcia_socket_list_rwsem.  While holding the rwsem, one of the pathways
calls the s->resource_ops->add_mem method.  On my system this method is
realized by adjust_memory() in rsrc_nonstatic.c, which does its own
down_read() on the same rwsem -- i.e., a recursive locking attempt.

The reason lockdep warns about this behavior is that it can lead to
deadlock in the wrong circumstances, namely, if another thread were to
do a down_write() in between the two down_read() calls.

Would it be correct simply to omit the down_read() in adjust_memory()?

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ