HomeFreeBSD

Fix for deadlock situation in the LinuxKPI's RCU synchronize API.

Description

Fix for deadlock situation in the LinuxKPI's RCU synchronize API.

Deadlock condition:
The return value of TDQ_LOCKPTR(td) is the same for two threads.

  1. The first thread signals a wakeup while keeping the rcu_read_lock().

This invokes sched_add() which in turn will try to lock TDQ_LOCK().

  1. The second thread is calling synchronize_rcu() calling mi_switch() over

and over again trying to yield(). This prevents the first thread from running
and releasing the RCU reader lock.

Solution:
Release the thread lock while yielding to allow other threads to acquire the
lock pointed to by TDQ_LOCKPTR(td).

Found by: KrishnamRaju ErapaRaju <Krishna2@chelsio.com>
MFC after: 1 week
Sponsored by: Mellanox Technologies

Details

Provenance
hselaskyAuthored on
Parents
rS322745: MFC r322434:
Branches
Unknown
Tags
Unknown