Date: Sat, 21 May 2016 02:00:09 -0700 From: "K. Macy" <kmacy@freebsd.org> To: "K. Macy" <kmacy@freebsd.org>, Johan Hendriks <joh.hendriks@gmail.com>, "O. Hartmann" <ohartman@zedat.fu-berlin.de>, "current@freebsd.org" <current@freebsd.org>, "freebsd-net@freebsd.org" <freebsd-net@freebsd.org> Subject: Re: em(4) broken in HEAD? Message-ID: <CAHM0Q_O2JOQop-7C4prfQWOaKoPV%2BxTbnnn3L%2BQYO7LLM=7xFA@mail.gmail.com> In-Reply-To: <20160521062847.GA58736@ymer.vnode.se> References: <20160520115550.GA56197@ymer.vnode.se> <20160520135946.674eb7ac@hermann> <20160520140528.GA56478@ymer.vnode.se> <CAOaKuAWj9ON8ANpZK42xhw-1PnUuCm9dn7j%2BP9P-DAbDKJZ-Nw@mail.gmail.com> <CAHM0Q_NbPPPBUmuF988Ny_7QcCmU5-9WbtX7jHWhps=Chm96SQ@mail.gmail.com> <CAHM0Q_OOXsoA7=sh9oS9cOsmYShFxEGBKZFTK8K=ih5Vntyn7Q@mail.gmail.com> <20160521062847.GA58736@ymer.vnode.se>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Much to my chagrin, this too is my fault. Please apply the attached
patch if it hasn't yet been committed to -CURRENT.
On Fri, May 20, 2016 at 11:28 PM, Joel Dahl <joel@vnode.se> wrote:
> On Fri, May 20, 2016 at 07:32:30PM -0700, K. Macy wrote:
>> I'm seeing watchdog resets on em(4) in my VMWare as of the last day or two.
>>
>> >
>> >
>> > I don't use ipfw, aliases or anything other than stock networking. I
>> > was unable to copy a large image off the VM without getting an
>> > unending stream of watchdog resets which could only be fixed by a
>> > reboot. Fortunately a subsequent IFC fixed it as of ~15 hours ago.
>> >
>>
>> I take that back. It's still happening.
>
> OK - good to know. I'm going to be travelling for a few days so I won't have
> time to do a binary search to find the commit that broke it.
>
> --
> Joel
[-- Attachment #2 --]
diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c
index 2ef5a3c..00cb46f 100644
--- a/sys/kern/subr_taskqueue.c
+++ b/sys/kern/subr_taskqueue.c
@@ -68,7 +68,6 @@ struct taskqueue {
TAILQ_HEAD(, taskqueue_busy) tq_active;
struct mtx tq_mutex;
struct thread **tq_threads;
- struct thread *tq_curthread;
int tq_tcount;
int tq_spin;
int tq_flags;
@@ -222,7 +221,7 @@ taskqueue_enqueue_locked(struct taskqueue *queue, struct task *task)
* Count multiple enqueues.
*/
if (task->ta_pending) {
- if (task->ta_pending < UCHAR_MAX)
+ if (task->ta_pending < USHRT_MAX)
task->ta_pending++;
TQ_UNLOCK(queue);
return (0);
@@ -465,8 +464,7 @@ taskqueue_run_locked(struct taskqueue *queue)
TQ_LOCK(queue);
tb.tb_running = NULL;
- if ((task->ta_flags & TASK_SKIP_WAKEUP) == 0)
- wakeup(task);
+ wakeup(task);
TAILQ_REMOVE(&queue->tq_active, &tb, tb_link);
tb_first = TAILQ_FIRST(&queue->tq_active);
@@ -481,9 +479,7 @@ taskqueue_run(struct taskqueue *queue)
{
TQ_LOCK(queue);
- queue->tq_curthread = curthread;
taskqueue_run_locked(queue);
- queue->tq_curthread = NULL;
TQ_UNLOCK(queue);
}
@@ -716,7 +712,6 @@ taskqueue_thread_loop(void *arg)
tq = *tqp;
taskqueue_run_callback(tq, TASKQUEUE_CALLBACK_TYPE_INIT);
TQ_LOCK(tq);
- tq->tq_curthread = curthread;
while ((tq->tq_flags & TQ_FLAGS_ACTIVE) != 0) {
/* XXX ? */
taskqueue_run_locked(tq);
@@ -730,7 +725,6 @@ taskqueue_thread_loop(void *arg)
TQ_SLEEP(tq, tq, &tq->tq_mutex, 0, "-", 0);
}
taskqueue_run_locked(tq);
- tq->tq_curthread = NULL;
/*
* This thread is on its way out, so just drop the lock temporarily
* in order to call the shutdown callback. This allows the callback
@@ -754,8 +748,7 @@ taskqueue_thread_enqueue(void *context)
tqp = context;
tq = *tqp;
- if (tq->tq_curthread != curthread)
- wakeup_one(tq);
+ wakeup_one(tq);
}
TASKQUEUE_DEFINE(swi, taskqueue_swi_enqueue, NULL,
diff --git a/sys/sys/_task.h b/sys/sys/_task.h
index 4cfa171..ce89781 100644
--- a/sys/sys/_task.h
+++ b/sys/sys/_task.h
@@ -45,8 +45,7 @@ typedef void task_fn_t(void *context, int pending);
struct task {
STAILQ_ENTRY(task) ta_link; /* (q) link for queue */
- uint8_t ta_pending; /* (q) count times queued */
- uint8_t ta_flags; /* (q) flags */
+ uint16_t ta_pending; /* (q) count times queued */
u_short ta_priority; /* (c) Priority */
task_fn_t *ta_func; /* (c) task handler */
void *ta_context; /* (c) argument for handler */
diff --git a/sys/sys/taskqueue.h b/sys/sys/taskqueue.h
index bc01088..4c4044f 100644
--- a/sys/sys/taskqueue.h
+++ b/sys/sys/taskqueue.h
@@ -98,7 +98,6 @@ void taskqueue_set_callback(struct taskqueue *queue,
#define TASK_INITIALIZER(priority, func, context) \
{ .ta_pending = 0, \
- .ta_flags = 0, \
.ta_priority = (priority), \
.ta_func = (func), \
.ta_context = (context) }
@@ -114,7 +113,6 @@ void taskqueue_thread_enqueue(void *context);
*/
#define TASK_INIT(task, priority, func, context) do { \
(task)->ta_pending = 0; \
- (task)->ta_flags = 0; \
(task)->ta_priority = (priority); \
(task)->ta_func = (func); \
(task)->ta_context = (context); \
@@ -224,7 +222,6 @@ int taskqgroup_adjust(struct taskqgroup *qgroup, int cnt, int stride);
#define GTASK_INIT(task, priority, func, context) do { \
(task)->ta_pending = 0; \
- (task)->ta_flags = TASK_SKIP_WAKEUP; \
(task)->ta_priority = (priority); \
(task)->ta_func = (func); \
(task)->ta_context = (context); \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAHM0Q_O2JOQop-7C4prfQWOaKoPV%2BxTbnnn3L%2BQYO7LLM=7xFA>
