Re: panic: Assertion in_epoch(net_epoch_preempt) failed at ... src/sys/net/if.c:3694

From: Julian Elischer <julian_at_freebsd.org>
Date: Tue, 8 Oct 2019 18:49:56 -0700
On 10/8/19 4:22 PM, Ryan Stone wrote:
> I haven't found any good references on the subject, but here's my understanding:
>
> - epoch_enter() and epoch_exit() are very inexpensive operations
> (cheaper than mtx, rw_lock or rm_lock operations) that are use to mark
> read-only critical sections
> - epoch_wait() guarantees that no threads that were in the critical
> section when it was first called are still in the critical section
> when it completes
>
> With this guarantee, you can safely destroy an object with the
> following procedure:
>
> 1. Atomically remove all global pointers to the object (e.g. remove it
> from any lists that the critical sections might look it up in).  This
> must be done atomically because read-only threads can be concurrently
> running in the critical section.  This guarantees that no more threads
> can get a pointer to it.
> 2. Call epoch_wait() to drain all threads that already held pointers
> to it before step 1.
> 3. You now hold the only pointer to the object, so you are free to
> destroy it as you please.

Ok thanks. Gottit.  thanks for the description.
Received on Tue Oct 08 2019 - 23:50:05 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:22 UTC