123ac9029SStephen Hurd /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 39b10f59aSPedro F. Giffuni * 423ac9029SStephen Hurd * Copyright (c) 2014 Jeffrey Roberson <jeff@freebsd.org> 596fc97c8SStephen Hurd * Copyright (c) 2016 Matthew Macy <mmacy@mattmacy.io> 623ac9029SStephen Hurd * All rights reserved. 723ac9029SStephen Hurd * 823ac9029SStephen Hurd * Redistribution and use in source and binary forms, with or without 923ac9029SStephen Hurd * modification, are permitted provided that the following conditions 1023ac9029SStephen Hurd * are met: 1123ac9029SStephen Hurd * 1. Redistributions of source code must retain the above copyright 1223ac9029SStephen Hurd * notice, this list of conditions and the following disclaimer. 1323ac9029SStephen Hurd * 2. Redistributions in binary form must reproduce the above copyright 1423ac9029SStephen Hurd * notice, this list of conditions and the following disclaimer in the 1523ac9029SStephen Hurd * documentation and/or other materials provided with the distribution. 1623ac9029SStephen Hurd * 1723ac9029SStephen Hurd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1823ac9029SStephen Hurd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1923ac9029SStephen Hurd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2023ac9029SStephen Hurd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2123ac9029SStephen Hurd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2223ac9029SStephen Hurd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2323ac9029SStephen Hurd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2423ac9029SStephen Hurd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2523ac9029SStephen Hurd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2623ac9029SStephen Hurd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2723ac9029SStephen Hurd * SUCH DAMAGE. 2823ac9029SStephen Hurd */ 2923ac9029SStephen Hurd 3023ac9029SStephen Hurd #ifndef _SYS_GTASKQUEUE_H_ 3123ac9029SStephen Hurd #define _SYS_GTASKQUEUE_H_ 3223ac9029SStephen Hurd 3323ac9029SStephen Hurd #ifndef _KERNEL 341d64db52SConrad Meyer #error "no user-serviceable parts inside" 3523ac9029SStephen Hurd #endif 3623ac9029SStephen Hurd 37f855ec81SMarius Strobl #include <sys/_task.h> 38f855ec81SMarius Strobl #include <sys/bus.h> 39f855ec81SMarius Strobl #include <sys/taskqueue.h> 40f855ec81SMarius Strobl #include <sys/types.h> 41f855ec81SMarius Strobl 4223ac9029SStephen Hurd struct gtaskqueue; 4323ac9029SStephen Hurd 4423ac9029SStephen Hurd /* 4523ac9029SStephen Hurd * Taskqueue groups. Manages dynamic thread groups and irq binding for 4623ac9029SStephen Hurd * device and other tasks. 4723ac9029SStephen Hurd */ 4823ac9029SStephen Hurd 49f855ec81SMarius Strobl struct grouptask { 50f855ec81SMarius Strobl struct gtask gt_task; 51f855ec81SMarius Strobl void *gt_taskqueue; 52f855ec81SMarius Strobl LIST_ENTRY(grouptask) gt_list; 53f855ec81SMarius Strobl void *gt_uniq; 54f855ec81SMarius Strobl #define GROUPTASK_NAMELEN 32 55f855ec81SMarius Strobl char gt_name[GROUPTASK_NAMELEN]; 56f855ec81SMarius Strobl device_t gt_dev; 57f855ec81SMarius Strobl struct resource *gt_irq; 58f855ec81SMarius Strobl int gt_cpu; 59f855ec81SMarius Strobl }; 60f855ec81SMarius Strobl 6123ac9029SStephen Hurd void gtaskqueue_block(struct gtaskqueue *queue); 6223ac9029SStephen Hurd void gtaskqueue_unblock(struct gtaskqueue *queue); 6323ac9029SStephen Hurd 6423ac9029SStephen Hurd int gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask); 6523ac9029SStephen Hurd void gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *task); 6623ac9029SStephen Hurd void gtaskqueue_drain_all(struct gtaskqueue *queue); 6723ac9029SStephen Hurd 685201e0f1SStephen Hurd void grouptask_block(struct grouptask *grouptask); 695201e0f1SStephen Hurd void grouptask_unblock(struct grouptask *grouptask); 7023ac9029SStephen Hurd int grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *task); 71f855ec81SMarius Strobl 7223ac9029SStephen Hurd void taskqgroup_attach(struct taskqgroup *qgroup, struct grouptask *grptask, 73f855ec81SMarius Strobl void *uniq, device_t dev, struct resource *irq, const char *name); 74f855ec81SMarius Strobl int taskqgroup_attach_cpu(struct taskqgroup *qgroup, 75f855ec81SMarius Strobl struct grouptask *grptask, void *uniq, int cpu, device_t dev, 76f855ec81SMarius Strobl struct resource *irq, const char *name); 7723ac9029SStephen Hurd void taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask); 7859d50fe5SMark Johnston struct taskqgroup *taskqgroup_create(const char *name, int cnt, int stride); 7923ac9029SStephen Hurd void taskqgroup_destroy(struct taskqgroup *qgroup); 8059d50fe5SMark Johnston void taskqgroup_bind(struct taskqgroup *qgroup); 812338da03SMatt Macy void taskqgroup_drain_all(struct taskqgroup *qgroup); 8223ac9029SStephen Hurd 83f855ec81SMarius Strobl #define GTASK_INIT(gtask, flags, priority, func, context) do { \ 84f855ec81SMarius Strobl (gtask)->ta_flags = flags; \ 85f855ec81SMarius Strobl (gtask)->ta_priority = (priority); \ 86f855ec81SMarius Strobl (gtask)->ta_func = (func); \ 87f855ec81SMarius Strobl (gtask)->ta_context = (context); \ 8823ac9029SStephen Hurd } while (0) 8923ac9029SStephen Hurd 9023ac9029SStephen Hurd #define GROUPTASK_INIT(gtask, priority, func, context) \ 914426b2e6SGleb Smirnoff GTASK_INIT(&(gtask)->gt_task, 0, priority, func, context) 9223ac9029SStephen Hurd 9323ac9029SStephen Hurd #define GROUPTASK_ENQUEUE(gtask) \ 9423ac9029SStephen Hurd grouptaskqueue_enqueue((gtask)->gt_taskqueue, &(gtask)->gt_task) 9523ac9029SStephen Hurd 9623ac9029SStephen Hurd #define TASKQGROUP_DECLARE(name) \ 9723ac9029SStephen Hurd extern struct taskqgroup *qgroup_##name 9823ac9029SStephen Hurd 99ab2e3f79SStephen Hurd #define TASKQGROUP_DEFINE(name, cnt, stride) \ 10023ac9029SStephen Hurd \ 10123ac9029SStephen Hurd struct taskqgroup *qgroup_##name; \ 10223ac9029SStephen Hurd \ 10323ac9029SStephen Hurd static void \ 10423ac9029SStephen Hurd taskqgroup_define_##name(void *arg) \ 10523ac9029SStephen Hurd { \ 10659d50fe5SMark Johnston qgroup_##name = taskqgroup_create(#name, (cnt), (stride)); \ 10723ac9029SStephen Hurd } \ 1089657edd7SConrad Meyer SYSINIT(taskqgroup_##name, SI_SUB_TASKQ, SI_ORDER_FIRST, \ 109ab2e3f79SStephen Hurd taskqgroup_define_##name, NULL); \ 110ab2e3f79SStephen Hurd \ 111ab2e3f79SStephen Hurd static void \ 11259d50fe5SMark Johnston taskqgroup_bind_##name(void *arg) \ 113ab2e3f79SStephen Hurd { \ 11459d50fe5SMark Johnston taskqgroup_bind(qgroup_##name); \ 115ab2e3f79SStephen Hurd } \ 11659d50fe5SMark Johnston SYSINIT(taskqgroup_bind_##name, SI_SUB_SMP, SI_ORDER_ANY, \ 11759d50fe5SMark Johnston taskqgroup_bind_##name, NULL) 118d23d2945SSean Bruno 119d945ed64SSean Bruno TASKQGROUP_DECLARE(softirq); 12023ac9029SStephen Hurd 12123ac9029SStephen Hurd #endif /* !_SYS_GTASKQUEUE_H_ */ 122