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

Julian Elischer julian at freebsd.org
Wed Oct 9 01:50:05 UTC 2019


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.





More information about the freebsd-current mailing list