Page MenuHomeFreeBSD

D50192.id154945.diff
No OneTemporary

D50192.id154945.diff

diff --git a/sys/compat/linuxkpi/common/include/linux/jiffies.h b/sys/compat/linuxkpi/common/include/linux/jiffies.h
--- a/sys/compat/linuxkpi/common/include/linux/jiffies.h
+++ b/sys/compat/linuxkpi/common/include/linux/jiffies.h
@@ -140,15 +140,4 @@
return ((uint64_t)jiffies);
}
-static inline unsigned long
-linux_timer_jiffies_until(unsigned long expires)
-{
- unsigned long delta = expires - jiffies;
-
- /* guard against already expired values */
- if ((long)delta < 1)
- delta = 1;
- return (delta);
-}
-
#endif /* _LINUXKPI_LINUX_JIFFIES_H_ */
diff --git a/sys/compat/linuxkpi/common/include/linux/workqueue.h b/sys/compat/linuxkpi/common/include/linux/workqueue.h
--- a/sys/compat/linuxkpi/common/include/linux/workqueue.h
+++ b/sys/compat/linuxkpi/common/include/linux/workqueue.h
@@ -90,7 +90,7 @@
struct {
struct callout callout;
struct mtx mtx;
- long expires;
+ unsigned long expires;
} timer;
};
diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c
--- a/sys/compat/linuxkpi/common/src/linux_compat.c
+++ b/sys/compat/linuxkpi/common/src/linux_compat.c
@@ -2071,6 +2071,22 @@
timer->function(timer->data);
}
+static int
+linux_timer_jiffies_until(unsigned long expires)
+{
+ unsigned long delta = expires - jiffies;
+
+ /*
+ * Guard against already expired values and make sure that the value can
+ * be used as a tick count, rather than a jiffies count.
+ */
+ if ((long)delta < 1)
+ delta = 1;
+ else if (delta > INT_MAX)
+ delta = INT_MAX;
+ return ((int)delta);
+}
+
int
mod_timer(struct timer_list *timer, unsigned long expires)
{
diff --git a/sys/compat/linuxkpi/common/src/linux_schedule.c b/sys/compat/linuxkpi/common/src/linux_schedule.c
--- a/sys/compat/linuxkpi/common/src/linux_schedule.c
+++ b/sys/compat/linuxkpi/common/src/linux_schedule.c
@@ -40,7 +40,7 @@
static int
linux_add_to_sleepqueue(void *wchan, struct task_struct *task,
- const char *wmesg, long timeout, int state)
+ const char *wmesg, int timeout, int state)
{
int flags, ret;
@@ -263,13 +263,15 @@
timeout = 1;
else if (timeout == MAX_SCHEDULE_TIMEOUT)
timeout = 0;
+ else if (timeout > INT_MAX)
+ timeout = INT_MAX;
task = current;
sleepq_lock(task);
if (atomic_read(&task->state) != TASK_WAKING) {
- ret = linux_add_to_sleepqueue(task, task, "wevent", timeout,
- state);
+ ret = linux_add_to_sleepqueue(task, task, "wevent",
+ (int)timeout, state);
} else {
sleepq_release(task);
ret = 0;
@@ -295,13 +297,15 @@
timeout = 1;
else if (timeout == MAX_SCHEDULE_TIMEOUT)
timeout = 0;
+ else if (timeout > INT_MAX)
+ timeout = INT_MAX;
remainder = jiffies + timeout;
sleepq_lock(task);
state = atomic_read(&task->state);
if (state != TASK_WAKING) {
- ret = linux_add_to_sleepqueue(task, task, "sched", timeout,
+ ret = linux_add_to_sleepqueue(task, task, "sched", (int)timeout,
state);
} else {
sleepq_release(task);
@@ -355,6 +359,8 @@
timeout = 1;
else if (timeout == MAX_SCHEDULE_TIMEOUT)
timeout = 0;
+ else if (timeout > INT_MAX)
+ timeout = INT_MAX;
task = current;
wchan = bit_to_wchan(word, bit);
@@ -366,7 +372,7 @@
break;
}
set_task_state(task, state);
- ret = linux_add_to_sleepqueue(wchan, task, "wbit", timeout,
+ ret = linux_add_to_sleepqueue(wchan, task, "wbit", (int)timeout,
state);
if (ret != 0)
break;
diff --git a/sys/compat/linuxkpi/common/src/linux_work.c b/sys/compat/linuxkpi/common/src/linux_work.c
--- a/sys/compat/linuxkpi/common/src/linux_work.c
+++ b/sys/compat/linuxkpi/common/src/linux_work.c
@@ -226,6 +226,13 @@
if (atomic_read(&wq->draining) != 0)
return (!work_pending(&dwork->work));
+ /*
+ * Clamp the delay to a valid ticks value, some consumers pass
+ * MAX_SCHEDULE_TIMEOUT.
+ */
+ if (delay > INT_MAX)
+ delay = INT_MAX;
+
mtx_lock(&dwork->timer.mtx);
switch (linux_update_state(&dwork->work.state, states)) {
case WORK_ST_EXEC:

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 20, 11:44 AM (11 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31837105
Default Alt Text
D50192.id154945.diff (3 KB)

Event Timeline