From 440a0b8dfb88dde1490feeee56c603d2eac7add2 Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Fri, 12 Jan 2018 20:52:52 +0100 Subject: kern/sref: relax memory ordering on weak reference operations --- kern/sref.c | 4 ++-- kern/sref_i.h | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'kern') diff --git a/kern/sref.c b/kern/sref.c index d2eb8187..1ad9212e 100644 --- a/kern/sref.c +++ b/kern/sref.c @@ -248,13 +248,13 @@ sref_weakref_init(struct sref_weakref *weakref, struct sref_counter *counter) static void sref_weakref_mark_dying(struct sref_weakref *weakref) { - atomic_or(&weakref->addr, SREF_WEAKREF_DYING, ATOMIC_RELEASE); + atomic_or(&weakref->addr, SREF_WEAKREF_DYING, ATOMIC_RELAXED); } static void sref_weakref_clear_dying(struct sref_weakref *weakref) { - atomic_and(&weakref->addr, SREF_WEAKREF_MASK, ATOMIC_RELEASE); + atomic_and(&weakref->addr, SREF_WEAKREF_MASK, ATOMIC_RELAXED); } static int diff --git a/kern/sref_i.h b/kern/sref_i.h index 09dbbfa8..27f962c5 100644 --- a/kern/sref_i.h +++ b/kern/sref_i.h @@ -32,8 +32,11 @@ * * A weak reference is a pointer to a reference counter in which the * least-significant bit is used to indicate whether the counter is - * "dying", i.e. about to be destroyed. It must be accessed with atomic - * instructions. + * "dying", i.e. about to be destroyed. + * + * It must be accessed with atomic instructions. There is no need to + * enforce memory order on access since the only data that depends on + * the weak reference are cpu-local deltas. */ struct sref_weakref { uintptr_t addr; -- cgit v1.2.3