Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Jan 2020 08:36:49 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r357320 - in head/sys: kern sys
Message-ID:  <202001310836.00V8anjE057688@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Fri Jan 31 08:36:49 2020
New Revision: 357320
URL: https://svnweb.freebsd.org/changeset/base/357320

Log:
  Add rms_try_rlock and rms_wowned.

Modified:
  head/sys/kern/kern_rmlock.c
  head/sys/sys/rmlock.h

Modified: head/sys/kern/kern_rmlock.c
==============================================================================
--- head/sys/kern/kern_rmlock.c	Fri Jan 31 08:36:23 2020	(r357319)
+++ head/sys/kern/kern_rmlock.c	Fri Jan 31 08:36:49 2020	(r357320)
@@ -934,6 +934,30 @@ rms_rlock(struct rmslock *rms)
 	critical_exit();
 }
 
+int
+rms_try_rlock(struct rmslock *rms)
+{
+	int *influx;
+
+	critical_enter();
+	influx = zpcpu_get(rms->readers_influx);
+	__compiler_membar();
+	*influx = 1;
+	__compiler_membar();
+	if (__predict_false(rms->writers > 0)) {
+		__compiler_membar();
+		*influx = 0;
+		critical_exit();
+		return (0);
+	}
+	__compiler_membar();
+	(*zpcpu_get(rms->readers_pcpu))++;
+	__compiler_membar();
+	*influx = 0;
+	critical_exit();
+	return (1);
+}
+
 static void __noinline
 rms_runlock_fallback(struct rmslock *rms)
 {

Modified: head/sys/sys/rmlock.h
==============================================================================
--- head/sys/sys/rmlock.h	Fri Jan 31 08:36:23 2020	(r357319)
+++ head/sys/sys/rmlock.h	Fri Jan 31 08:36:49 2020	(r357320)
@@ -136,9 +136,21 @@ struct rm_args {
 void	rms_init(struct rmslock *rms, const char *name);
 void	rms_destroy(struct rmslock *rms);
 void	rms_rlock(struct rmslock *rms);
+int	rms_try_rlock(struct rmslock *rms);
 void	rms_runlock(struct rmslock *rms);
 void	rms_wlock(struct rmslock *rms);
 void	rms_wunlock(struct rmslock *rms);
+
+/*
+ * Writers are not explicitly tracked, thus until that changes the best we can
+ * do is indicate the lock is taken for writing by *someone*.
+ */
+static inline int
+rms_wowned(struct rmslock *rms)
+{
+
+	return (rms->writers > 0);
+}
 
 #endif /* _KERNEL */
 #endif /* !_SYS_RMLOCK_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001310836.00V8anjE057688>