diff options
author | Scott Soule Cheloha <cheloha@cvs.openbsd.org> | 2024-02-24 15:21:40 +0000 |
---|---|---|
committer | Scott Soule Cheloha <cheloha@cvs.openbsd.org> | 2024-02-24 15:21:40 +0000 |
commit | 05fb34a3fd8639f96478d184e9e0e1a46faba396 (patch) | |
tree | b919ed5d60c90f520ff00c07c5736a7439f3d4c4 /sys/dev/ic | |
parent | e0094fd14170848da901b64b95c56d98533462fd (diff) |
qwx(4): qwx_dp_rx_tid_del_func: fix dp_reo_cache_flush_elem expiration logic
Tweak a few things in qwx_dp_rx_tid_del_func() to make it behave
correctly on OpenBSD:
- struct dp_reo_cache_flush_elem: make ts a 64-bit count of nanoseconds
Linux uses jiffies to timestamp dp_reo_cache_flush_elem. Although
OpenBSD has a global jiffies variable, we shouldn't use it outside
of drm(4). I would rather not use our global ticks variable, either.
We can use getnsecuptime(9), a low-res 64-bit nanosecond timestamp,
as a substitute.
- qwx_dp_rx_tid_del_func: replace gettime(9) with getnsecuptime(9)
- qwx_dp_rx_tid_del_func: convert DP_REO_DESC_FREE_TIMEOUT_MS to nanoseconds
- qwx_dp_rx_tid_del_func: reverse timestamp comparison operator
This comparison is backwards. Linux uses the time_after() macro to
test whether a given entry has expired, so our ported code needs to
test whether the current uptime is greater than or equal to a given
entry's expiration time.
Joint effort with stsp@. Tested by stsp@.
ok stsp@
Diffstat (limited to 'sys/dev/ic')
-rw-r--r-- | sys/dev/ic/qwx.c | 8 | ||||
-rw-r--r-- | sys/dev/ic/qwxvar.h | 4 |
2 files changed, 6 insertions, 6 deletions
diff --git a/sys/dev/ic/qwx.c b/sys/dev/ic/qwx.c index 36b56ae559a..193fdae1420 100644 --- a/sys/dev/ic/qwx.c +++ b/sys/dev/ic/qwx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qwx.c,v 1.51 2024/02/22 21:21:35 stsp Exp $ */ +/* $OpenBSD: qwx.c,v 1.52 2024/02/24 15:21:39 cheloha Exp $ */ /* * Copyright 2023 Stefan Sperling <stsp@openbsd.org> @@ -23155,7 +23155,7 @@ qwx_dp_rx_tid_del_func(struct qwx_dp *dp, void *ctx, struct qwx_softc *sc = dp->sc; struct dp_rx_tid *rx_tid = ctx; struct dp_reo_cache_flush_elem *elem, *tmp; - time_t now; + uint64_t now; if (status == HAL_REO_CMD_DRAIN) { goto free_desc; @@ -23170,7 +23170,7 @@ qwx_dp_rx_tid_del_func(struct qwx_dp *dp, void *ctx, if (!elem) goto free_desc; - now = gettime(); + now = getnsecuptime(); elem->ts = now; memcpy(&elem->data, rx_tid, sizeof(*rx_tid)); @@ -23188,7 +23188,7 @@ qwx_dp_rx_tid_del_func(struct qwx_dp *dp, void *ctx, /* Flush and invalidate aged REO desc from HW cache */ TAILQ_FOREACH_SAFE(elem, &dp->reo_cmd_cache_flush_list, entry, tmp) { if (dp->reo_cmd_cache_flush_count > DP_REO_DESC_FREE_THRESHOLD || - now < elem->ts + DP_REO_DESC_FREE_TIMEOUT_MS) { + now >= elem->ts + MSEC_TO_NSEC(DP_REO_DESC_FREE_TIMEOUT_MS)) { TAILQ_REMOVE(&dp->reo_cmd_cache_flush_list, elem, entry); dp->reo_cmd_cache_flush_count--; #ifdef notyet diff --git a/sys/dev/ic/qwxvar.h b/sys/dev/ic/qwxvar.h index 0399a4328aa..a84553d5bcb 100644 --- a/sys/dev/ic/qwxvar.h +++ b/sys/dev/ic/qwxvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: qwxvar.h,v 1.22 2024/02/22 09:08:08 stsp Exp $ */ +/* $OpenBSD: qwxvar.h,v 1.23 2024/02/24 15:21:39 cheloha Exp $ */ /* * Copyright (c) 2018-2019 The Linux Foundation. @@ -1041,7 +1041,7 @@ struct dp_rx_tid { struct dp_reo_cache_flush_elem { TAILQ_ENTRY(dp_reo_cache_flush_elem) entry; struct dp_rx_tid data; - unsigned long ts; + uint64_t ts; }; TAILQ_HEAD(dp_reo_cmd_cache_flush_head, dp_reo_cache_flush_elem); |