Fix deadlock and non-working socket msg throttling
Two major bugs in btif_config.c. One is that due to improper
locking order, a deadlock could occur (symptom is generally
out of GKI buffers because BTIF thread stops processing it's
mailbox because it is blocked sending a msg to the socket
thread, which in turn is blocked because BTIF is holding
the lock it needs to do the config save that BTIF requested
in the first place).
The other is also lock related. The mechanism to throttle
socket messages based on whether there was one already
in flight wasn't working because there wasn't locking
when that variable was being used. The compiler would be
free to cache it in a register on SMP machines, so it would
never look like there as a value in flight. This would
cause a bunch of messages to be queued up, and then the
way the handling worked in cfg_cmd_callback(), every
cmd would cause a 3 second sleep, even if there was nothing
to do. Modified the loop to check if there was nothing
to do before sleeping.
I was running into both bugs when repeatedly pairing and
unpairing a BLE device. The deadlock would hit first, causing
out of GKI buffers. Once I fixed the deadlock, I would still
run out of GKI buffers because the socket thread wasn't working
fast enough to clear the backlog of socket messages it had
received.
Also optimized some string termination code which was using
a memset of the full buffer before and then copying over
every entry except the last. Now we do the copy and just
set the last buffer entry to null.
Change-Id: Ic06ef0b8e15d8f1fe669fb88439851ffbad560de
Signed-off-by:
Mike J. Chen <mjchen@google.com>
Loading
Please register or sign in to comment