git: c9f8dcda856c - main - kqueue: replace kq_ncallouts loop with atomic_fetchadd
Mateusz Guzik
mjg at FreeBSD.org
Wed Jun 2 15:15:59 UTC 2021
The branch main has been updated by mjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=c9f8dcda856c50325190326a618dc251311bc43a
commit c9f8dcda856c50325190326a618dc251311bc43a
Author: Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2021-06-02 15:14:58 +0000
Commit: Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-06-02 15:14:58 +0000
kqueue: replace kq_ncallouts loop with atomic_fetchadd
---
sys/kern/kern_event.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index b224ce87087e..63b28cd6024f 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -206,7 +206,7 @@ static struct filterops user_filtops = {
};
static uma_zone_t knote_zone;
-static unsigned int kq_ncallouts = 0;
+static unsigned int __exclusive_cache_line kq_ncallouts;
static unsigned int kq_calloutmax = 4 * 1024;
SYSCTL_UINT(_kern, OID_AUTO, kq_calloutmax, CTLFLAG_RW,
&kq_calloutmax, 0, "Maximum number of callouts allocated for kqueue");
@@ -813,18 +813,16 @@ filt_timerattach(struct knote *kn)
{
struct kq_timer_cb_data *kc;
sbintime_t to;
- unsigned int ncallouts;
int error;
error = filt_timervalidate(kn, &to);
if (error != 0)
return (error);
- do {
- ncallouts = kq_ncallouts;
- if (ncallouts >= kq_calloutmax)
- return (ENOMEM);
- } while (!atomic_cmpset_int(&kq_ncallouts, ncallouts, ncallouts + 1));
+ if (atomic_fetchadd_int(&kq_ncallouts, 1) + 1 > kq_calloutmax) {
+ atomic_subtract_int(&kq_ncallouts, 1);
+ return (ENOMEM);
+ }
if ((kn->kn_sfflags & NOTE_ABSTIME) == 0)
kn->kn_flags |= EV_CLEAR; /* automatically set */
More information about the dev-commits-src-all
mailing list