svn commit: r357771 - in head/sys: kern sys

O. Hartmann o.hartmann at walstatt.org
Tue Feb 11 20:12:08 UTC 2020


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Am Tue, 11 Feb 2020 18:48:08 +0000 (UTC)
Gleb Smirnoff <glebius at FreeBSD.org> schrieb:

> Author: glebius
> Date: Tue Feb 11 18:48:07 2020
> New Revision: 357771
> URL: https://svnweb.freebsd.org/changeset/base/357771
> 
> Log:
>   Add flag to struct task to mark the task as requiring network epoch.
>   
>   When processing a taskqueue and a task has associated epoch, then
>   enter for duration of the task.  If consecutive tasks belong to the
>   same epoch, batch them.  Now we are talking about the network epoch
>   only.
>   
>   Shrink the ta_priority size to 8-bits.  No current consumers use
>   a priority that won't fit into 8 bits.  Also complexity of
>   taskqueue_enqueue() is a square of maximum value of priority, so
>   we unlikely ever want to go over UCHAR_MAX here.
>   
>   Reviewed by:	hselasky
>   Differential Revision:	https://reviews.freebsd.org/D23518
> 
> Modified:
>   head/sys/kern/subr_gtaskqueue.c
>   head/sys/kern/subr_taskqueue.c
>   head/sys/sys/_task.h
>   head/sys/sys/epoch.h
>   head/sys/sys/gtaskqueue.h
>   head/sys/sys/taskqueue.h
> 
> Modified: head/sys/kern/subr_gtaskqueue.c
> ==============================================================================
> --- head/sys/kern/subr_gtaskqueue.c	Tue Feb 11 18:19:56 2020	(r357770)
> +++ head/sys/kern/subr_gtaskqueue.c	Tue Feb 11 18:48:07 2020	(r357771)
> @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
>  #include <sys/malloc.h>
>  #include <sys/mutex.h>
>  #include <sys/proc.h>
> +#include <sys/epoch.h>
>  #include <sys/sched.h>
>  #include <sys/smp.h>
>  #include <sys/gtaskqueue.h>
> @@ -342,13 +343,16 @@ gtaskqueue_unblock(struct gtaskqueue *queue)
>  static void
>  gtaskqueue_run_locked(struct gtaskqueue *queue)
>  {
> +	struct epoch_tracker et;
>  	struct gtaskqueue_busy tb;
>  	struct gtask *gtask;
> +	bool in_net_epoch;
>  
>  	KASSERT(queue != NULL, ("tq is NULL"));
>  	TQ_ASSERT_LOCKED(queue);
>  	tb.tb_running = NULL;
>  	LIST_INSERT_HEAD(&queue->tq_active, &tb, tb_link);
> +	in_net_epoch = false;
>  
>  	while ((gtask = STAILQ_FIRST(&queue->tq_queue)) != NULL) {
>  		STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link);
> @@ -358,11 +362,20 @@ gtaskqueue_run_locked(struct gtaskqueue *queue)
>  		TQ_UNLOCK(queue);
>  
>  		KASSERT(gtask->ta_func != NULL, ("task->ta_func is NULL"));
> +		if (!in_net_epoch && TASK_IS_NET(gtask)) {
> +			in_net_epoch = true;
> +			NET_EPOCH_ENTER(et);
> +		} else if (in_net_epoch && !TASK_IS_NET(gtask)) {
> +			NET_EPOCH_EXIT(et);
> +			in_net_epoch = false;
> +		}
>  		gtask->ta_func(gtask->ta_context);
>  
>  		TQ_LOCK(queue);
>  		wakeup(gtask);
>  	}
> +	if (in_net_epoch)
> +		NET_EPOCH_EXIT(et);
>  	LIST_REMOVE(&tb, tb_link);
>  }
>  
> 
> Modified: head/sys/kern/subr_taskqueue.c
> ==============================================================================
> --- head/sys/kern/subr_taskqueue.c	Tue Feb 11 18:19:56 2020	(r357770)
> +++ head/sys/kern/subr_taskqueue.c	Tue Feb 11 18:48:07 2020	(r357771)
> @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
>  #include <sys/malloc.h>
>  #include <sys/mutex.h>
>  #include <sys/proc.h>
> +#include <sys/epoch.h>
>  #include <sys/sched.h>
>  #include <sys/smp.h>
>  #include <sys/taskqueue.h>
> @@ -371,7 +372,7 @@ taskqueue_drain_tq_queue(struct taskqueue *queue)
>  	 * anyway) so just insert it at tail while we have the
>  	 * queue lock.
>  	 */
> -	TASK_INIT(&t_barrier, USHRT_MAX, taskqueue_task_nop_fn, &t_barrier);
> +	TASK_INIT(&t_barrier, UCHAR_MAX, taskqueue_task_nop_fn, &t_barrier);
>  	STAILQ_INSERT_TAIL(&queue->tq_queue, &t_barrier, ta_link);
>  	queue->tq_hint = &t_barrier;
>  	t_barrier.ta_pending = 1;
> @@ -442,14 +443,17 @@ taskqueue_unblock(struct taskqueue *queue)
>  static void
>  taskqueue_run_locked(struct taskqueue *queue)
>  {
> +	struct epoch_tracker et;
>  	struct taskqueue_busy tb;
>  	struct task *task;
> +	bool in_net_epoch;
>  	int pending;
>  
>  	KASSERT(queue != NULL, ("tq is NULL"));
>  	TQ_ASSERT_LOCKED(queue);
>  	tb.tb_running = NULL;
>  	LIST_INSERT_HEAD(&queue->tq_active, &tb, tb_link);
> +	in_net_epoch = false;
>  
>  	while ((task = STAILQ_FIRST(&queue->tq_queue)) != NULL) {
>  		STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link);
> @@ -462,11 +466,20 @@ taskqueue_run_locked(struct taskqueue *queue)
>  		TQ_UNLOCK(queue);
>  
>  		KASSERT(task->ta_func != NULL, ("task->ta_func is NULL"));
> +		if (!in_net_epoch && TASK_IS_NET(task)) {
> +			in_net_epoch = true;
> +			NET_EPOCH_ENTER(et);
> +		} else if (in_net_epoch && !TASK_IS_NET(task)) {
> +			NET_EPOCH_EXIT(et);
> +			in_net_epoch = false;
> +		}
>  		task->ta_func(task->ta_context, pending);
>  
>  		TQ_LOCK(queue);
>  		wakeup(task);
>  	}
> +	if (in_net_epoch)
> +		NET_EPOCH_EXIT(et);
>  	LIST_REMOVE(&tb, tb_link);
>  }
>  
> 
> Modified: head/sys/sys/_task.h
> ==============================================================================
> --- head/sys/sys/_task.h	Tue Feb 11 18:19:56 2020	(r357770)
> +++ head/sys/sys/_task.h	Tue Feb 11 18:48:07 2020	(r357771)
> @@ -48,10 +48,17 @@ typedef void task_fn_t(void *context, int pending);
>  struct task {
>  	STAILQ_ENTRY(task) ta_link;	/* (q) link for queue */
>  	uint16_t ta_pending;		/* (q) count times queued */
> -	u_short	ta_priority;		/* (c) Priority */
> +	uint8_t	ta_priority;		/* (c) Priority */
> +	uint8_t	ta_flags;		/* (c) Flags */
>  	task_fn_t *ta_func;		/* (c) task handler */
>  	void	*ta_context;		/* (c) argument for handler */
>  };
> +
> +#define	TASK_ENQUEUED		0x1
> +#define	TASK_NOENQUEUE		0x2
> +#define	TASK_NETWORK		0x4
> +
> +#define	TASK_IS_NET(ta)		((ta)->ta_flags & TASK_NETWORK)
>  
>  #ifdef _KERNEL
>  
> 
> Modified: head/sys/sys/epoch.h
> ==============================================================================
> --- head/sys/sys/epoch.h	Tue Feb 11 18:19:56 2020	(r357770)
> +++ head/sys/sys/epoch.h	Tue Feb 11 18:48:07 2020	(r357771)
> @@ -104,6 +104,9 @@ extern epoch_t net_epoch_preempt;
>  #define	NET_EPOCH_WAIT()	epoch_wait_preempt(net_epoch_preempt)
>  #define	NET_EPOCH_CALL(f, c)	epoch_call(net_epoch_preempt, (f), (c))
>  #define	NET_EPOCH_ASSERT()	MPASS(in_epoch(net_epoch_preempt))
> +#define	NET_TASK_INIT(t, p, f, c) TASK_INIT_FLAGS(t, p, f, c, TASK_NETWORK)
> +#define	NET_GROUPTASK_INIT(gtask, prio, func, ctx)			\
> +	    GTASK_INIT(&(gtask)->gt_task, TASK_NETWORK, (prio), (func), (ctx))
>  
>  #endif	/* _KERNEL */
>  #endif	/* _SYS_EPOCH_H_ */
> 
> Modified: head/sys/sys/gtaskqueue.h
> ==============================================================================
> --- head/sys/sys/gtaskqueue.h	Tue Feb 11 18:19:56 2020	(r357770)
> +++ head/sys/sys/gtaskqueue.h	Tue Feb 11 18:48:07 2020	(r357771)
> @@ -84,10 +84,6 @@ void	taskqgroup_config_gtask_init(void *ctx, struct gr
>  	    gtask_fn_t *fn, const char *name);
>  void	taskqgroup_config_gtask_deinit(struct grouptask *gtask);
>  
> -#define TASK_ENQUEUED			0x1
> -#define TASK_SKIP_WAKEUP		0x2
> -#define TASK_NOENQUEUE			0x4
> -
>  #define	GTASK_INIT(gtask, flags, priority, func, context) do {	\
>  	(gtask)->ta_flags = flags;				\
>  	(gtask)->ta_priority = (priority);			\
> @@ -96,7 +92,7 @@ void	taskqgroup_config_gtask_deinit(struct grouptask *
>  } while (0)
>  
>  #define	GROUPTASK_INIT(gtask, priority, func, context)	\
> -	GTASK_INIT(&(gtask)->gt_task, TASK_SKIP_WAKEUP, priority, func, context)
> +	GTASK_INIT(&(gtask)->gt_task, 0, priority, func, context)
>  
>  #define	GROUPTASK_ENQUEUE(gtask)			\
>  	grouptaskqueue_enqueue((gtask)->gt_taskqueue, &(gtask)->gt_task)
> 
> Modified: head/sys/sys/taskqueue.h
> ==============================================================================
> --- head/sys/sys/taskqueue.h	Tue Feb 11 18:19:56 2020	(r357770)
> +++ head/sys/sys/taskqueue.h	Tue Feb 11 18:48:07 2020	(r357771)
> @@ -107,8 +107,7 @@ void	taskqueue_set_callback(struct taskqueue *queue,
>  	    taskqueue_callback_fn callback, void *context);
>  
>  #define TASK_INITIALIZER(priority, func, context)	\
> -	{ .ta_pending = 0,				\
> -	  .ta_priority = (priority),			\
> +	{ .ta_priority = (priority),			\
>  	  .ta_func = (func),				\
>  	  .ta_context = (context) }
>  
> @@ -121,18 +120,25 @@ void	taskqueue_thread_enqueue(void *context);
>  /*
>   * Initialise a task structure.
>   */
> -#define TASK_INIT(task, priority, func, context) do {	\
> -	(task)->ta_pending = 0;				\
> -	(task)->ta_priority = (priority);		\
> -	(task)->ta_func = (func);			\
> -	(task)->ta_context = (context);			\
> +#define TASK_INIT_FLAGS(task, priority, func, context, flags) do {	\
> +	MPASS((priority) >= 0 && (priority) <= 255);		\
> +	(task)->ta_pending = 0;					\
> +	(task)->ta_priority = (priority);			\
> +	(task)->ta_flags = (flags);				\
> +	(task)->ta_func = (func);				\
> +	(task)->ta_context = (context);				\
>  } while (0)
>  
> +#define TASK_INIT(t, p, f, c)	TASK_INIT_FLAGS(t, p, f, c, 0)
> +
>  void _timeout_task_init(struct taskqueue *queue,
>  	    struct timeout_task *timeout_task, int priority, task_fn_t func,
>  	    void *context);
> -#define	TIMEOUT_TASK_INIT(queue, timeout_task, priority, func, context) \
> -	_timeout_task_init(queue, timeout_task, priority, func, context);
> +#define	TIMEOUT_TASK_INIT(queue, timeout_task, priority, func, context)	do { \
> +	_Static_assert((priority) >= 0 && (priority) <= 255,	\
> +	    "struct task priority is 8 bit in size");           \
> +	_timeout_task_init(queue, timeout_task, priority, func, context); \
> +} while (0)
>  
>  /*
>   * Declare a reference to a taskqueue.
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"

This commit trashes the build of port x11/nvidia-driver for all of our nvidia equipted CURRENT
hosts:
[...]

===> src/nvidia-modeset (all)
machine -> /usr/src/sys/amd64/include
x86 -> /usr/src/sys/x86/include
touch opt_global.h
cc  -O2 -pipe -march=native -fno-strict-aliasing -DNV_VERSION_STRING=\"440.31\"
- -DNV_SPECTRE_V2=1 -Werror=undef -march=native  -Werror -D_KERNEL -DKLD_MODULE -nostdinc
- -Imachine -I/usr/src/sys/sys -I../common/inc -include
/usr/obj/usr/src/amd64.amd64/sys/THOR/usr/ports/x11/nvidia-driver/work/NVIDIA-FreeBSD-x86_64-440.31/src/nvidia-modeset/opt_global.h
- -I. -I/usr/src/sys -I/usr/src/sys/contrib/ck/include -fno-common  -fno-omit-frame-pointer
- -mno-omit-leaf-frame-pointer -fdebug-prefix-map=./machine=/usr/src/sys/amd64/include
- -fdebug-prefix-map=./x86=/usr/src/sys/x86/include     -MD  -MF.depend.nvidia-modeset-freebsd.o
- -MTnvidia-modeset-freebsd.o -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float
- -fno-asynchronous-unwind-tables -ffreestanding -fwrapv -fstack-protector -Wall
- -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith
- -Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__ -Wmissing-include-dirs
- -fdiagnostics-show-option -Wno-unknown-pragmas -Wno-error-tautological-compare
- -Wno-error-empty-body -Wno-error-parentheses-equality -Wno-error-unused-function
- -Wno-error-pointer-sign -Wno-error-shift-negative-value -Wno-address-of-packed-member
- -Wno-format-zero-length   -mno-aes -mno-avx  -std=iso9899:1999 -c nvidia-modeset-freebsd.c -o
nvidia-modeset-freebsd.o nvidia-modeset-freebsd.c:413:5: error: implicit declaration of
function 'MPASS' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
TASK_INIT(&timer->task, ^ /usr/src/sys/sys/taskqueue.h:132:31: note: expanded from macro
'TASK_INIT' #define TASK_INIT(t, p, f, c)   TASK_INIT_FLAGS(t, p, f, c, 0) ^
/usr/src/sys/sys/taskqueue.h:124:2: note: expanded from macro 'TASK_INIT_FLAGS'
MPASS((priority) >= 0 && (priority) <= 255);            \ ^ 1 error generated. *** Error code 1



- -- 
O. Hartmann

Ich widerspreche der Nutzung oder Übermittlung meiner Daten für
Werbezwecke oder für die Markt- oder Meinungsforschung (§ 28 Abs. 4 BDSG).
-----BEGIN PGP SIGNATURE-----

iHUEARYIAB0WIQSy8IBxAPDkqVBaTJ44N1ZZPba5RwUCXkMKlAAKCRA4N1ZZPba5
R/BAAP9fK2GSb2GeSENN6AZ1VpG3sw4QG91mu5cZQMOTh9/JigEA5aPg4AZA1lW+
8Vs4XfBZ2daGLhVpUx0RISCoQD0xPww=
=0fu/
-----END PGP SIGNATURE-----


More information about the svn-src-all mailing list