Page MenuHomeFreeBSD

Fix a race in smr_advance() that could result in unnecessary poll calls.
ClosedPublic

Authored by jeff on Feb 2 2020, 12:25 AM.
Tags
None
Referenced Files
Unknown Object (File)
Tue, Nov 5, 4:07 PM
Unknown Object (File)
Oct 10 2024, 9:11 AM
Unknown Object (File)
Oct 5 2024, 1:00 AM
Unknown Object (File)
Oct 4 2024, 10:55 PM
Unknown Object (File)
Oct 2 2024, 12:06 PM
Unknown Object (File)
Oct 2 2024, 10:06 AM
Unknown Object (File)
Oct 2 2024, 8:03 AM
Unknown Object (File)
Oct 2 2024, 1:40 AM
Subscribers

Details

Summary

If we load rd_seq after goal rd_seq may have already advanced beyond goal making the comparison incorrect.

While here fix up the limits on invariants kernels because it was polling way too frequently.

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

jeff added reviewers: rlibby, markj.
jeff set the repository for this revision to rS FreeBSD src repository - subversion.

Looks good.

sys/kern/subr_smr.c
199–210 ↗(On Diff #67649)

Is there any difference to the cost of a release barrier followed by an acquire barrier vs a full barrier?

This revision is now accepted and ready to land.Feb 2 2020, 8:37 PM

It seems you forgot to define SMR_SEQ_DELTA() macro.

In D23464#516865, @jkim wrote:

It seems you forgot to define SMR_SEQ_DELTA() macro.

It was in the review, but it looks like sys/sys/smr.h was left out of commit r357641. Thanks for reporting.

How about something like this?

Index: sys/sys/smr.h
===================================================================
--- sys/sys/smr.h       (revision 357642)
+++ sys/sys/smr.h       (working copy)
@@ -45,10 +45,11 @@
  * Modular arithmetic for comparing sequence numbers that have
  * potentially wrapped.  Copied from tcp_seq.h.
  */
-#define        SMR_SEQ_LT(a, b)        ((int32_t)((a)-(b)) < 0)
-#define        SMR_SEQ_LEQ(a, b)       ((int32_t)((a)-(b)) <= 0)
-#define        SMR_SEQ_GT(a, b)        ((int32_t)((a)-(b)) > 0)
-#define        SMR_SEQ_GEQ(a, b)       ((int32_t)((a)-(b)) >= 0)
+#define        SMR_SEQ_DELTA(a, b)     (int32_t)((a) - (b))
+#define        SMR_SEQ_LT(a, b)        (SMR_SEQ_DELTA(a, b) < 0)
+#define        SMR_SEQ_LEQ(a, b)       (SMR_SEQ_DELTA(a, b) <= 0)
+#define        SMR_SEQ_GT(a, b)        (SMR_SEQ_DELTA(a, b) > 0)
+#define        SMR_SEQ_GEQ(a, b)       (SMR_SEQ_DELTA(a, b) >= 0)