1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_TASKQ_IMPL_H 27 #define _SYS_TASKQ_IMPL_H 28 29 #include <sys/taskq.h> 30 #include <sys/inttypes.h> 31 #include <sys/vmem.h> 32 #include <sys/list.h> 33 #include <sys/kstat.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 typedef struct taskq_bucket taskq_bucket_t; 40 41 typedef struct taskq_ent { 42 struct taskq_ent *tqent_next; 43 struct taskq_ent *tqent_prev; 44 task_func_t *tqent_func; 45 void *tqent_arg; 46 taskq_bucket_t *tqent_bucket; 47 kthread_t *tqent_thread; 48 kcondvar_t tqent_cv; 49 } taskq_ent_t; 50 51 /* 52 * Taskq Statistics fields are not protected by any locks. 53 */ 54 typedef struct tqstat { 55 uint_t tqs_hits; 56 uint_t tqs_misses; 57 uint_t tqs_overflow; /* no threads to allocate */ 58 uint_t tqs_tcreates; /* threads created */ 59 uint_t tqs_tdeaths; /* threads died */ 60 uint_t tqs_maxthreads; /* max # of alive threads */ 61 uint_t tqs_nomem; /* # of times there were no memory */ 62 uint_t tqs_disptcreates; 63 } tqstat_t; 64 65 /* 66 * Per-CPU hash bucket manages taskq_bent_t structures using freelist. 67 */ 68 struct taskq_bucket { 69 kmutex_t tqbucket_lock; 70 taskq_t *tqbucket_taskq; /* Enclosing taskq */ 71 taskq_ent_t tqbucket_freelist; 72 uint_t tqbucket_nalloc; /* # of allocated entries */ 73 uint_t tqbucket_nfree; /* # of free entries */ 74 kcondvar_t tqbucket_cv; 75 ushort_t tqbucket_flags; 76 hrtime_t tqbucket_totaltime; 77 tqstat_t tqbucket_stat; 78 }; 79 80 /* 81 * Bucket flags. 82 */ 83 #define TQBUCKET_CLOSE 0x01 84 #define TQBUCKET_SUSPEND 0x02 85 86 #define TASKQ_INTERFACE_FLAGS 0x0000ffff /* defined in <sys/taskq.h> */ 87 88 /* 89 * taskq implementation flags: bit range 16-31 90 */ 91 #define TASKQ_CHANGING 0x00010000 /* nthreads != target */ 92 #define TASKQ_SUSPENDED 0x00020000 /* taskq is suspended */ 93 #define TASKQ_NOINSTANCE 0x00040000 /* no instance number */ 94 #define TASKQ_THREAD_CREATED 0x00080000 /* a thread has been created */ 95 #define TASKQ_DUTY_CYCLE 0x00100000 /* using the SDC class */ 96 97 struct taskq { 98 char tq_name[TASKQ_NAMELEN + 1]; 99 kmutex_t tq_lock; 100 krwlock_t tq_threadlock; 101 kcondvar_t tq_dispatch_cv; 102 kcondvar_t tq_wait_cv; 103 kcondvar_t tq_exit_cv; 104 pri_t tq_pri; /* Scheduling priority */ 105 uint_t tq_flags; 106 int tq_active; 107 int tq_nthreads; 108 int tq_nthreads_target; 109 int tq_nthreads_max; 110 int tq_threads_ncpus_pct; 111 int tq_nalloc; 112 int tq_minalloc; 113 int tq_maxalloc; 114 taskq_ent_t *tq_freelist; 115 taskq_ent_t tq_task; 116 int tq_maxsize; 117 taskq_bucket_t *tq_buckets; /* Per-cpu array of buckets */ 118 int tq_instance; 119 uint_t tq_nbuckets; /* # of buckets (2^n) */ 120 union { 121 kthread_t *_tq_thread; 122 kthread_t **_tq_threadlist; 123 } tq_thr; 124 125 list_node_t tq_cpupct_link; /* linkage for taskq_cpupct_list */ 126 struct proc *tq_proc; /* process for taskq threads */ 127 int tq_cpupart; /* cpupart id bound to */ 128 uint_t tq_DC; /* duty cycle for SDC */ 129 130 /* 131 * Statistics. 132 */ 133 kstat_t *tq_kstat; /* Exported statistics */ 134 hrtime_t tq_totaltime; /* Time spent processing tasks */ 135 uint64_t tq_tasks; /* Total # of tasks posted */ 136 uint64_t tq_executed; /* Total # of tasks executed */ 137 int tq_maxtasks; /* Max number of tasks in the queue */ 138 int tq_tcreates; 139 int tq_tdeaths; 140 }; 141 142 #define tq_thread tq_thr._tq_thread 143 #define tq_threadlist tq_thr._tq_threadlist 144 145 /* The MAX guarantees we have at least one thread */ 146 #define TASKQ_THREADS_PCT(ncpus, pct) MAX(((ncpus) * (pct)) / 100, 1) 147 148 #ifdef __cplusplus 149 } 150 #endif 151 152 #endif /* _SYS_TASKQ_IMPL_H */ 153