<feed xmlns='http://www.w3.org/2005/Atom'>
<title>kernel.git/net/bluetooth/rfcomm/core.c, branch linux-2.6.25.y</title>
<subtitle>Hosts the 0x221E linux distro kernel.
</subtitle>
<id>https://git.0xinfinity.dev/distro/kernel.git/atom?h=linux-2.6.25.y</id>
<link rel='self' href='https://git.0xinfinity.dev/distro/kernel.git/atom?h=linux-2.6.25.y'/>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/'/>
<updated>2008-06-16T20:19:53Z</updated>
<entry>
<title>bluetooth: fix locking bug in the rfcomm socket cleanup handling</title>
<updated>2008-06-16T20:19:53Z</updated>
<author>
<name>Arjan van de Ven</name>
</author>
<published>2008-05-29T08:32:47Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=8b1a1d515c3499d3bff3ccb58b76d351c8a466bd'/>
<id>urn:sha1:8b1a1d515c3499d3bff3ccb58b76d351c8a466bd</id>
<content type='text'>
[ Upstream commit: 7dccf1f4e1696c79bff064c3770867cc53cbc71c ]

in net/bluetooth/rfcomm/sock.c, rfcomm_sk_state_change() does the
following operation:

        if (parent &amp;&amp; sock_flag(sk, SOCK_ZAPPED)) {
                /* We have to drop DLC lock here, otherwise
                 * rfcomm_sock_destruct() will dead lock. */
                rfcomm_dlc_unlock(d);
                rfcomm_sock_kill(sk);
                rfcomm_dlc_lock(d);
        }
}

which is fine, since rfcomm_sock_kill() will call sk_free() which will call
rfcomm_sock_destruct() which takes the rfcomm_dlc_lock()... so far so good.

HOWEVER, this assumes that the rfcomm_sk_state_change() function always gets
called with the rfcomm_dlc_lock() taken. This is the case for all but one
case, and in that case where we don't have the lock, we do a double unlock
followed by an attempt to take the lock, which due to underflow isn't
going anywhere fast.

This patch fixes this by moving the stragling case inside the lock, like
the other usages of the same call are doing in this code.

This was found with the help of the www.kerneloops.org project, where this
deadlock was observed 51 times at this point in time:
http://www.kerneloops.org/search.php?search=rfcomm_sock_destruct

Signed-off-by: Arjan van de Ven &lt;arjan@linux.intel.com&gt;
Acked-by: Marcel Holtmann &lt;marcel@holtmann.org&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Chris Wright &lt;chrisw@sous-sol.org&gt;
</content>
</entry>
<entry>
<title>bluetooth : __rfcomm_dlc_close lock fix</title>
<updated>2008-04-02T06:59:06Z</updated>
<author>
<name>Dave Young</name>
</author>
<published>2008-04-02T06:59:06Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=1905f6c736cb618e07eca0c96e60e3c024023428'/>
<id>urn:sha1:1905f6c736cb618e07eca0c96e60e3c024023428</id>
<content type='text'>
Lockdep warning will be trigged while rfcomm connection closing.

The locks taken in rfcomm_dev_add:
rfcomm_dev_lock --&gt; d-&gt;lock

In __rfcomm_dlc_close:
d-&gt;lock --&gt; rfcomm_dev_lock (in rfcomm_dev_state_change)

There's two way to fix it, one is in rfcomm_dev_add we first locking
d-&gt;lock then the rfcomm_dev_lock

The other (in this patch), remove the locking of d-&gt;lock for
rfcomm_dev_state_change because just locking "d-&gt;state = BT_CLOSED;"
is enough.

[  295.002046] =======================================================
[  295.002046] [ INFO: possible circular locking dependency detected ]
[  295.002046] 2.6.25-rc7 #1
[  295.002046] -------------------------------------------------------
[  295.002046] krfcommd/2705 is trying to acquire lock:
[  295.002046]  (rfcomm_dev_lock){-.--}, at: [&lt;f89a090a&gt;] rfcomm_dev_state_change+0x6a/0xd0 [rfcomm]
[  295.002046] 
[  295.002046] but task is already holding lock:
[  295.002046]  (&amp;d-&gt;lock){--..}, at: [&lt;f899c533&gt;] __rfcomm_dlc_close+0x43/0xd0 [rfcomm]
[  295.002046] 
[  295.002046] which lock already depends on the new lock.
[  295.002046] 
[  295.002046] 
[  295.002046] the existing dependency chain (in reverse order) is:
[  295.002046] 
[  295.002046] -&gt; #1 (&amp;d-&gt;lock){--..}:
[  295.002046]        [&lt;c0149b23&gt;] check_prev_add+0xd3/0x200
[  295.002046]        [&lt;c0149ce5&gt;] check_prevs_add+0x95/0xe0
[  295.002046]        [&lt;c0149f6f&gt;] validate_chain+0x23f/0x320
[  295.002046]        [&lt;c014b7b1&gt;] __lock_acquire+0x1c1/0x760
[  295.002046]        [&lt;c014c349&gt;] lock_acquire+0x79/0xb0
[  295.002046]        [&lt;c03d6b99&gt;] _spin_lock+0x39/0x80
[  295.002046]        [&lt;f89a01c0&gt;] rfcomm_dev_add+0x240/0x360 [rfcomm]
[  295.002046]        [&lt;f89a047e&gt;] rfcomm_create_dev+0x6e/0xe0 [rfcomm]
[  295.002046]        [&lt;f89a0823&gt;] rfcomm_dev_ioctl+0x33/0x60 [rfcomm]
[  295.002046]        [&lt;f899facc&gt;] rfcomm_sock_ioctl+0x2c/0x50 [rfcomm]
[  295.002046]        [&lt;c0363d38&gt;] sock_ioctl+0x118/0x240
[  295.002046]        [&lt;c0194196&gt;] vfs_ioctl+0x76/0x90
[  295.002046]        [&lt;c0194446&gt;] do_vfs_ioctl+0x56/0x140
[  295.002046]        [&lt;c0194569&gt;] sys_ioctl+0x39/0x60
[  295.002046]        [&lt;c0104faa&gt;] syscall_call+0x7/0xb
[  295.002046]        [&lt;ffffffff&gt;] 0xffffffff
[  295.002046] 
[  295.002046] -&gt; #0 (rfcomm_dev_lock){-.--}:
[  295.002046]        [&lt;c0149a84&gt;] check_prev_add+0x34/0x200
[  295.002046]        [&lt;c0149ce5&gt;] check_prevs_add+0x95/0xe0
[  295.002046]        [&lt;c0149f6f&gt;] validate_chain+0x23f/0x320
[  295.002046]        [&lt;c014b7b1&gt;] __lock_acquire+0x1c1/0x760
[  295.002046]        [&lt;c014c349&gt;] lock_acquire+0x79/0xb0
[  295.002046]        [&lt;c03d6639&gt;] _read_lock+0x39/0x80
[  295.002046]        [&lt;f89a090a&gt;] rfcomm_dev_state_change+0x6a/0xd0 [rfcomm]
[  295.002046]        [&lt;f899c548&gt;] __rfcomm_dlc_close+0x58/0xd0 [rfcomm]
[  295.002046]        [&lt;f899d44f&gt;] rfcomm_recv_ua+0x6f/0x120 [rfcomm]
[  295.002046]        [&lt;f899e061&gt;] rfcomm_recv_frame+0x171/0x1e0 [rfcomm]
[  295.002046]        [&lt;f899e357&gt;] rfcomm_run+0xe7/0x550 [rfcomm]
[  295.002046]        [&lt;c013c18c&gt;] kthread+0x5c/0xa0
[  295.002046]        [&lt;c0105c07&gt;] kernel_thread_helper+0x7/0x10
[  295.002046]        [&lt;ffffffff&gt;] 0xffffffff
[  295.002046] 
[  295.002046] other info that might help us debug this:
[  295.002046] 
[  295.002046] 2 locks held by krfcommd/2705:
[  295.002046]  #0:  (rfcomm_mutex){--..}, at: [&lt;f899e2eb&gt;] rfcomm_run+0x7b/0x550 [rfcomm]
[  295.002046]  #1:  (&amp;d-&gt;lock){--..}, at: [&lt;f899c533&gt;] __rfcomm_dlc_close+0x43/0xd0 [rfcomm]
[  295.002046] 
[  295.002046] stack backtrace:
[  295.002046] Pid: 2705, comm: krfcommd Not tainted 2.6.25-rc7 #1
[  295.002046]  [&lt;c0128a38&gt;] ? printk+0x18/0x20
[  295.002046]  [&lt;c014927f&gt;] print_circular_bug_tail+0x6f/0x80
[  295.002046]  [&lt;c0149a84&gt;] check_prev_add+0x34/0x200
[  295.002046]  [&lt;c0149ce5&gt;] check_prevs_add+0x95/0xe0
[  295.002046]  [&lt;c0149f6f&gt;] validate_chain+0x23f/0x320
[  295.002046]  [&lt;c014b7b1&gt;] __lock_acquire+0x1c1/0x760
[  295.002046]  [&lt;c014c349&gt;] lock_acquire+0x79/0xb0
[  295.002046]  [&lt;f89a090a&gt;] ? rfcomm_dev_state_change+0x6a/0xd0 [rfcomm]
[  295.002046]  [&lt;c03d6639&gt;] _read_lock+0x39/0x80
[  295.002046]  [&lt;f89a090a&gt;] ? rfcomm_dev_state_change+0x6a/0xd0 [rfcomm]
[  295.002046]  [&lt;f89a090a&gt;] rfcomm_dev_state_change+0x6a/0xd0 [rfcomm]
[  295.002046]  [&lt;f899c548&gt;] __rfcomm_dlc_close+0x58/0xd0 [rfcomm]
[  295.002046]  [&lt;f899d44f&gt;] rfcomm_recv_ua+0x6f/0x120 [rfcomm]
[  295.002046]  [&lt;f899e061&gt;] rfcomm_recv_frame+0x171/0x1e0 [rfcomm]
[  295.002046]  [&lt;c014abd9&gt;] ? trace_hardirqs_on+0xb9/0x130
[  295.002046]  [&lt;c03d6e89&gt;] ? _spin_unlock_irqrestore+0x39/0x70
[  295.002046]  [&lt;f899e357&gt;] rfcomm_run+0xe7/0x550 [rfcomm]
[  295.002046]  [&lt;c03d4559&gt;] ? __sched_text_start+0x229/0x4c0
[  295.002046]  [&lt;c0120000&gt;] ? cpu_avg_load_per_task+0x20/0x30
[  295.002046]  [&lt;f899e270&gt;] ? rfcomm_run+0x0/0x550 [rfcomm]
[  295.002046]  [&lt;c013c18c&gt;] kthread+0x5c/0xa0
[  295.002046]  [&lt;c013c130&gt;] ? kthread+0x0/0xa0
[  295.002046]  [&lt;c0105c07&gt;] kernel_thread_helper+0x7/0x10
[  295.002046]  =======================

Signed-off-by: Dave Young &lt;hidave.darkstar@gmail.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
</content>
</entry>
<entry>
<title>remove final fastcall users</title>
<updated>2008-02-14T00:21:18Z</updated>
<author>
<name>Harvey Harrison</name>
</author>
<published>2008-02-13T23:03:16Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=b5606c2d4447e80b1d72406af4e78af1eda611d4'/>
<id>urn:sha1:b5606c2d4447e80b1d72406af4e78af1eda611d4</id>
<content type='text'>
fastcall always expands to empty, remove it.

Signed-off-by: Harvey Harrison &lt;harvey.harrison@gmail.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
</entry>
<entry>
<title>[NET]: Convert init_timer into setup_timer</title>
<updated>2008-01-28T22:53:35Z</updated>
<author>
<name>Pavel Emelyanov</name>
</author>
<published>2008-01-24T05:20:07Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=b24b8a247ff65c01b252025926fe564209fae4fc'/>
<id>urn:sha1:b24b8a247ff65c01b252025926fe564209fae4fc</id>
<content type='text'>
Many-many code in the kernel initialized the timer-&gt;function
and  timer-&gt;data together with calling init_timer(timer). There
is already a helper for this. Use it for networking code.

The patch is HUGE, but makes the code 130 lines shorter
(98 insertions(+), 228 deletions(-)).

Signed-off-by: Pavel Emelyanov &lt;xemul@openvz.org&gt;
Acked-by: Arnaldo Carvalho de Melo &lt;acme@redhat.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
</content>
</entry>
<entry>
<title>[Bluetooth] Convert RFCOMM to use kthread API</title>
<updated>2007-10-22T09:59:49Z</updated>
<author>
<name>Marcel Holtmann</name>
</author>
<published>2007-10-20T19:37:20Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=a524eccc7307b1d6e79f03fed79f9f34c016ce56'/>
<id>urn:sha1:a524eccc7307b1d6e79f03fed79f9f34c016ce56</id>
<content type='text'>
This patch does the full kthread conversion for the RFCOMM protocol. It
makes the code slightly simpler and more maintainable.

Based on a patch from Christoph Hellwig &lt;hch@lst.de&gt;

Signed-off-by: Marcel Holtmann &lt;marcel@holtmann.org&gt;
</content>
</entry>
<entry>
<title>Freezer: make kernel threads nonfreezable by default</title>
<updated>2007-07-17T17:23:02Z</updated>
<author>
<name>Rafael J. Wysocki</name>
</author>
<published>2007-07-17T11:03:35Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=831441862956fffa17b9801db37e6ea1650b0f69'/>
<id>urn:sha1:831441862956fffa17b9801db37e6ea1650b0f69</id>
<content type='text'>
Currently, the freezer treats all tasks as freezable, except for the kernel
threads that explicitly set the PF_NOFREEZE flag for themselves.  This
approach is problematic, since it requires every kernel thread to either
set PF_NOFREEZE explicitly, or call try_to_freeze(), even if it doesn't
care for the freezing of tasks at all.

It seems better to only require the kernel threads that want to or need to
be frozen to use some freezer-related code and to remove any
freezer-related code from the other (nonfreezable) kernel threads, which is
done in this patch.

The patch causes all kernel threads to be nonfreezable by default (ie.  to
have PF_NOFREEZE set by default) and introduces the set_freezable()
function that should be called by the freezable kernel threads in order to
unset PF_NOFREEZE.  It also makes all of the currently freezable kernel
threads call set_freezable(), so it shouldn't cause any (intentional)
change of behaviour to appear.  Additionally, it updates documentation to
describe the freezing of tasks more accurately.

[akpm@linux-foundation.org: build fixes]
Signed-off-by: Rafael J. Wysocki &lt;rjw@sisk.pl&gt;
Acked-by: Nigel Cunningham &lt;nigel@nigel.suspend2.net&gt;
Cc: Pavel Machek &lt;pavel@ucw.cz&gt;
Cc: Oleg Nesterov &lt;oleg@tv-sign.ru&gt;
Cc: Gautham R Shenoy &lt;ego@in.ibm.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
</entry>
<entry>
<title>[Bluetooth] Disconnect L2CAP connection after last RFCOMM DLC</title>
<updated>2007-05-04T22:36:13Z</updated>
<author>
<name>Marcel Holtmann</name>
</author>
<published>2007-05-04T22:36:13Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=9cf5b0ea3a7f1432c61029f7aaf4b8b338628884'/>
<id>urn:sha1:9cf5b0ea3a7f1432c61029f7aaf4b8b338628884</id>
<content type='text'>
The RFCOMM specification says that the device closing the last DLC on
a particular session is responsible for closing the multiplexer by
closing the corresponding L2CAP channel.

Signed-off-by: Ville Tervo &lt;ville.tervo@nokia.com&gt;
Signed-off-by: Marcel Holtmann &lt;marcel@holtmann.org&gt;
</content>
</entry>
<entry>
<title>[Bluetooth] Use in-kernel sockets API</title>
<updated>2007-05-04T22:36:06Z</updated>
<author>
<name>Marcel Holtmann</name>
</author>
<published>2007-05-04T22:36:06Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=48db9ca4f2ac9f39eb90ccb12ad3ca7b645a552c'/>
<id>urn:sha1:48db9ca4f2ac9f39eb90ccb12ad3ca7b645a552c</id>
<content type='text'>
The kernel provides a new convenient way to access the sockets API for
in-kernel users. It is a good idea to actually use it.

Signed-off-by: Marcel Holtmann &lt;marcel@holtmann.org&gt;
</content>
</entry>
<entry>
<title>[BLUETOOTH] rfcomm_worker(): fix wakeup race</title>
<updated>2007-04-26T08:41:01Z</updated>
<author>
<name>Andrew Morton</name>
</author>
<published>2007-04-26T08:41:01Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=74da9d88bf5ffd31aed61a0b19519684ad744ded'/>
<id>urn:sha1:74da9d88bf5ffd31aed61a0b19519684ad744ded</id>
<content type='text'>
Set TASK_INTERRUPTIBLE prior to testing the flag to avoid missed wakeups.

Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Acked-by: Marcel Holtmann &lt;marcel@holtmann.org&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
</content>
</entry>
<entry>
<title>[SK_BUFF]: Convert skb-&gt;tail to sk_buff_data_t</title>
<updated>2007-04-26T05:26:28Z</updated>
<author>
<name>Arnaldo Carvalho de Melo</name>
</author>
<published>2007-04-20T03:29:13Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=27a884dc3cb63b93c2b3b643f5b31eed5f8a4d26'/>
<id>urn:sha1:27a884dc3cb63b93c2b3b643f5b31eed5f8a4d26</id>
<content type='text'>
So that it is also an offset from skb-&gt;head, reduces its size from 8 to 4 bytes
on 64bit architectures, allowing us to combine the 4 bytes hole left by the
layer headers conversion, reducing struct sk_buff size to 256 bytes, i.e. 4
64byte cachelines, and since the sk_buff slab cache is SLAB_HWCACHE_ALIGN...
:-)

Many calculations that previously required that skb-&gt;{transport,network,
mac}_header be first converted to a pointer now can be done directly, being
meaningful as offsets or pointers.

Signed-off-by: Arnaldo Carvalho de Melo &lt;acme@redhat.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
</content>
</entry>
</feed>
