123ac9029SStephen Hurd /*- 29b10f59aSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 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 * $FreeBSD$ 3023ac9029SStephen Hurd */ 3123ac9029SStephen Hurd 3223ac9029SStephen Hurd #ifndef _SYS_GTASKQUEUE_H_ 3323ac9029SStephen Hurd #define _SYS_GTASKQUEUE_H_ 3423ac9029SStephen Hurd 3523ac9029SStephen Hurd #ifndef _KERNEL 361d64db52SConrad Meyer #error "no user-serviceable parts inside" 3723ac9029SStephen Hurd #endif 3823ac9029SStephen Hurd 39f855ec81SMarius Strobl #include <sys/_task.h> 40f855ec81SMarius Strobl #include <sys/bus.h> 41f855ec81SMarius Strobl #include <sys/taskqueue.h> 42f855ec81SMarius Strobl #include <sys/types.h> 43f855ec81SMarius Strobl 4423ac9029SStephen Hurd struct gtaskqueue; 4523ac9029SStephen Hurd 4623ac9029SStephen Hurd /* 4723ac9029SStephen Hurd * Taskqueue groups. Manages dynamic thread groups and irq binding for 4823ac9029SStephen Hurd * device and other tasks. 4923ac9029SStephen Hurd */ 5023ac9029SStephen Hurd 51f855ec81SMarius Strobl struct grouptask { 52f855ec81SMarius Strobl struct gtask gt_task; 53f855ec81SMarius Strobl void *gt_taskqueue; 54f855ec81SMarius Strobl LIST_ENTRY(grouptask) gt_list; 55f855ec81SMarius Strobl void *gt_uniq; 56f855ec81SMarius Strobl #define GROUPTASK_NAMELEN 32 57f855ec81SMarius Strobl char gt_name[GROUPTASK_NAMELEN]; 58f855ec81SMarius Strobl device_t gt_dev; 59f855ec81SMarius Strobl struct resource *gt_irq; 60f855ec81SMarius Strobl int gt_cpu; 61f855ec81SMarius Strobl }; 62f855ec81SMarius Strobl 6323ac9029SStephen Hurd void gtaskqueue_block(struct gtaskqueue *queue); 6423ac9029SStephen Hurd void gtaskqueue_unblock(struct gtaskqueue *queue); 6523ac9029SStephen Hurd 6623ac9029SStephen Hurd int gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask); 6723ac9029SStephen Hurd void gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *task); 6823ac9029SStephen Hurd void gtaskqueue_drain_all(struct gtaskqueue *queue); 6923ac9029SStephen Hurd 705201e0f1SStephen Hurd void grouptask_block(struct grouptask *grouptask); 715201e0f1SStephen Hurd void grouptask_unblock(struct grouptask *grouptask); 7223ac9029SStephen Hurd int grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *task); 73f855ec81SMarius Strobl 7423ac9029SStephen Hurd void taskqgroup_attach(struct taskqgroup *qgroup, struct grouptask *grptask, 75f855ec81SMarius Strobl void *uniq, device_t dev, struct resource *irq, const char *name); 76f855ec81SMarius Strobl int taskqgroup_attach_cpu(struct taskqgroup *qgroup, 77f855ec81SMarius Strobl struct grouptask *grptask, void *uniq, int cpu, device_t dev, 78f855ec81SMarius Strobl struct resource *irq, const char *name); 7923ac9029SStephen Hurd void taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask); 803e0e6330SStephen Hurd struct taskqgroup *taskqgroup_create(const char *name); 8123ac9029SStephen Hurd void taskqgroup_destroy(struct taskqgroup *qgroup); 82ab2e3f79SStephen Hurd int taskqgroup_adjust(struct taskqgroup *qgroup, int cnt, int stride); 83f855ec81SMarius Strobl void taskqgroup_config_gtask_init(void *ctx, struct grouptask *gtask, 84f855ec81SMarius Strobl gtask_fn_t *fn, const char *name); 8536688f70SMatt Macy void taskqgroup_config_gtask_deinit(struct grouptask *gtask); 8623ac9029SStephen Hurd 87f855ec81SMarius Strobl #define GTASK_INIT(gtask, flags, priority, func, context) do { \ 88f855ec81SMarius Strobl (gtask)->ta_flags = flags; \ 89f855ec81SMarius Strobl (gtask)->ta_priority = (priority); \ 90f855ec81SMarius Strobl (gtask)->ta_func = (func); \ 91f855ec81SMarius Strobl (gtask)->ta_context = (context); \ 9223ac9029SStephen Hurd } while (0) 9323ac9029SStephen Hurd 9423ac9029SStephen Hurd #define GROUPTASK_INIT(gtask, priority, func, context) \ 95*4426b2e6SGleb Smirnoff GTASK_INIT(&(gtask)->gt_task, 0, priority, func, context) 9623ac9029SStephen Hurd 9723ac9029SStephen Hurd #define GROUPTASK_ENQUEUE(gtask) \ 9823ac9029SStephen Hurd grouptaskqueue_enqueue((gtask)->gt_taskqueue, &(gtask)->gt_task) 9923ac9029SStephen Hurd 10023ac9029SStephen Hurd #define TASKQGROUP_DECLARE(name) \ 10123ac9029SStephen Hurd extern struct taskqgroup *qgroup_##name 10223ac9029SStephen Hurd 103ab2e3f79SStephen Hurd #define TASKQGROUP_DEFINE(name, cnt, stride) \ 10423ac9029SStephen Hurd \ 10523ac9029SStephen Hurd struct taskqgroup *qgroup_##name; \ 10623ac9029SStephen Hurd \ 10723ac9029SStephen Hurd static void \ 10823ac9029SStephen Hurd taskqgroup_define_##name(void *arg) \ 10923ac9029SStephen Hurd { \ 11023ac9029SStephen Hurd qgroup_##name = taskqgroup_create(#name); \ 11123ac9029SStephen Hurd } \ 112ab2e3f79SStephen Hurd \ 1139657edd7SConrad Meyer SYSINIT(taskqgroup_##name, SI_SUB_TASKQ, SI_ORDER_FIRST, \ 114ab2e3f79SStephen Hurd taskqgroup_define_##name, NULL); \ 115ab2e3f79SStephen Hurd \ 116ab2e3f79SStephen Hurd static void \ 117ab2e3f79SStephen Hurd taskqgroup_adjust_##name(void *arg) \ 118ab2e3f79SStephen Hurd { \ 119ab2e3f79SStephen Hurd taskqgroup_adjust(qgroup_##name, (cnt), (stride)); \ 120ab2e3f79SStephen Hurd } \ 121ab2e3f79SStephen Hurd \ 122ab2e3f79SStephen Hurd SYSINIT(taskqgroup_adj_##name, SI_SUB_SMP, SI_ORDER_ANY, \ 123ab2e3f79SStephen Hurd taskqgroup_adjust_##name, NULL) 124d23d2945SSean Bruno 12523ac9029SStephen Hurd TASKQGROUP_DECLARE(net); 126d945ed64SSean Bruno TASKQGROUP_DECLARE(softirq); 12723ac9029SStephen Hurd 12823ac9029SStephen Hurd #endif /* !_SYS_GTASKQUEUE_H_ */ 129