tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pserialize(9) vs. TAILQ



I thought I kind of understood how pserialize(9) works, but the manual
confused me:

             mutex_enter(&writer_psz_lock);
             /*
              * Perform the updates (e.g. remove data items from a list).
              */
             ...
             pserialize_perform(object->psz);
             /*
              * At this point it is safe to destroy old data items.
              */
             mutex_exit(&writer_psz_lock);

My understanding is that, writers can update data structures between
mutex_enter() and pserialize_perform(), but that operation must be
done atomically, because at that point readers are still reading the
protected data.

In pserialize_perform(), context switches are made on all CPUs.  After
pserialize_perform(), all readers on all CPUs see the update data.
The data old data item is safely destroyed.

In the TAILQ case, where readers iterate a list by TAILQ_FOREACH(),
TAILQ_REMOVE() is safely used as the update operation, because:

- Readers only see tqe_next in TAILQ_FOREACH(), and
- Pointer assignment (done in TAILQ_REMOVE()) is atomic.

If this is correct, pserialize(9) should be updated to be clearer;
probably this TAILQ example is worth being added there.


Home | Main Index | Thread Index | Old Index