Module Name: src
Committed By: riastradh
Date: Sun Dec 19 12:35:37 UTC 2021
Modified Files:
src/sys/external/bsd/common/include/linux: completion.h
Log Message:
linux: Timeout audit -- linux/completion.h.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 \
src/sys/external/bsd/common/include/linux/completion.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/common/include/linux/completion.h
diff -u src/sys/external/bsd/common/include/linux/completion.h:1.11 src/sys/external/bsd/common/include/linux/completion.h:1.12
--- src/sys/external/bsd/common/include/linux/completion.h:1.11 Sun Dec 19 12:22:56 2021
+++ src/sys/external/bsd/common/include/linux/completion.h Sun Dec 19 12:35:37 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: completion.h,v 1.11 2021/12/19 12:22:56 riastradh Exp $ */
+/* $NetBSD: completion.h,v 1.12 2021/12/19 12:35:37 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -198,18 +198,18 @@ wait_for_completion_interruptible_timeou
mutex_enter(&completion->c_lock);
- /* Wait until c_done is nonzero. */
+ /* Wait until c_done is nonzero, timeout, or signal. */
while (completion->c_done == 0) {
- error = cv_timedwait_sig(&completion->c_cv,
- &completion->c_lock, ticks);
- if (error)
- goto out;
- now = getticks();
- if (ticks < (now - start)) {
+ if (ticks == 0) {
error = EWOULDBLOCK;
goto out;
}
- ticks -= (now - start);
+ error = cv_timedwait_sig(&completion->c_cv,
+ &completion->c_lock, MIN(ticks, INT_MAX/2));
+ now = getticks();
+ if (error)
+ goto out;
+ ticks -= MIN(ticks, (now - start));
start = now;
}
@@ -224,7 +224,7 @@ out: mutex_exit(&completion->c_lock);
return -ERESTARTSYS;
} else {
KASSERTMSG((error == 0), "error = %d", error);
- return ticks;
+ return MAX(1, MIN(ticks, INT_MAX/2));
}
}
@@ -232,23 +232,23 @@ static inline int
wait_for_completion_timeout(struct completion *completion, unsigned long ticks)
{
/* XXX Arithmetic overflow...? */
- unsigned int start = hardclock_ticks, now;
+ unsigned int start = getticks(), now;
int error;
mutex_enter(&completion->c_lock);
- /* Wait until c_done is nonzero. */
+ /* Wait until c_done is nonzero or timeout. */
while (completion->c_done == 0) {
- error = cv_timedwait(&completion->c_cv, &completion->c_lock,
- ticks);
- if (error)
- goto out;
- now = hardclock_ticks;
- if (ticks < (now - start)) {
+ if (ticks == 0) {
error = EWOULDBLOCK;
goto out;
}
- ticks -= (now - start);
+ error = cv_timedwait(&completion->c_cv, &completion->c_lock,
+ MIN(ticks, INT_MAX/2));
+ now = getticks();
+ if (error)
+ goto out;
+ ticks -= MIN(ticks, (now - start));
start = now;
}
@@ -261,7 +261,7 @@ out: mutex_exit(&completion->c_lock);
return 0;
} else {
KASSERTMSG((error == 0), "error = %d", error);
- return ticks;
+ return MAX(1, MIN(ticks, INT_MAX/2));
}
}
@@ -275,7 +275,7 @@ wait_for_completion_interruptible(struct
mutex_enter(&completion->c_lock);
- /* Wait until c_done is nonzero. */
+ /* Wait until c_done is nonzero or signal. */
while (completion->c_done == 0) {
error = cv_wait_sig(&completion->c_cv, &completion->c_lock);
if (error)
@@ -287,9 +287,12 @@ wait_for_completion_interruptible(struct
error = 0;
out: mutex_exit(&completion->c_lock);
- if ((error == EINTR) || (error == ERESTART))
- error = -ERESTARTSYS;
- return error;
+ if ((error == EINTR) || (error == ERESTART)) {
+ return -ERESTARTSYS;
+ } else {
+ KASSERTMSG((error == 0), "error = %d", error);
+ return 0;
+ }
}
/*