-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Am Tue, 11 Feb 2020 18:48:08 +0000 (UTC) Gleb Smirnoff <gleb...@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-h...@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-head > To unsubscribe, send any mail to "svn-src-head-unsubscr...@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----- _______________________________________________ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"