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
F101933425: D23464.diff
Tue, Nov 5, 4:07 PM
Unknown Object (File)
Thu, Oct 10, 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

Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 29104
Build 27048: arc lint + arc unit

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

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)