Re: em(4) broken in HEAD?

From: Chagin Dmitry <dchagin_at_freebsd.org>
Date: Sat, 21 May 2016 14:06:06 +0300
On Sat, May 21, 2016 at 02:00:09AM -0700, K. Macy wrote:
> Much to my chagrin, this too is my fault. Please apply the attached
> patch if it hasn't yet been committed to -CURRENT.
> 

thanks, it fixes em for me.





> On Fri, May 20, 2016 at 11:28 PM, Joel Dahl <joel_at_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

> 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
> _at__at_ -68,7 +68,6 _at__at_ 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;
> _at__at_ -222,7 +221,7 _at__at_ 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);
> _at__at_ -465,8 +464,7 _at__at_ 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);
> _at__at_ -481,9 +479,7 _at__at_ taskqueue_run(struct taskqueue *queue)
>  {
>  
>  	TQ_LOCK(queue);
> -	queue->tq_curthread = curthread;
>  	taskqueue_run_locked(queue);
> -	queue->tq_curthread = NULL;
>  	TQ_UNLOCK(queue);
>  }
>  
> _at__at_ -716,7 +712,6 _at__at_ 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);
> _at__at_ -730,7 +725,6 _at__at_ 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
> _at__at_ -754,8 +748,7 _at__at_ 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
> _at__at_ -45,8 +45,7 _at__at_ 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
> _at__at_ -98,7 +98,6 _at__at_ 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) }
> _at__at_ -114,7 +113,6 _at__at_ 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);			\
> _at__at_ -224,7 +222,6 _at__at_ 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);			\

> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"


-- 
Have fun!
chd
Received on Sat May 21 2016 - 07:38:41 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:05 UTC