svn commit: r357320 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Fri Jan 31 08:36:50 UTC 2020
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_ */
More information about the svn-src-all
mailing list