When support for classic BPF was added to the kernel many years
ago, there was no question of whether BPF programs could block in their
execution. Their functionality was limited to examining a packet’s
contents and deciding whether the packet should be forwarded or not; there
was nothing such a program could do to block. Since then, BPF has changed
a lot, but the assumption that BPF programs cannot sleep has been built
deeply into the BPF machinery. More recently, classic BPF has been pushed
aside by the extended BPF dialect; the
wider applicability of extended BPF is now
forcing a rethink of some basic assumptions.
Source: LWN.net – [$] Sleepable BPF programs