usr/src/uts/common/sys/taskq_impl.h
author stevel@tonic-gate
Tue, 14 Jun 2005 00:00:00 -0700
changeset 0 68f95e015346
child 9515 d3b739d9d043
permissions -rw-r--r--
OpenSolaris Launch
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#ifndef	_SYS_TASKQ_IMPL_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#define	_SYS_TASKQ_IMPL_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/taskq.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/vmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/kstat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
typedef struct taskq_bucket taskq_bucket_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
typedef struct taskq_ent {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
	struct taskq_ent	*tqent_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	struct taskq_ent	*tqent_prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	task_func_t		*tqent_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
	void			*tqent_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	taskq_bucket_t		*tqent_bucket;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	kthread_t		*tqent_thread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
	kcondvar_t		tqent_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
} taskq_ent_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * Taskq Statistics fields are not protected by any locks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
typedef struct tqstat {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	uint_t		tqs_hits;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	uint_t		tqs_misses;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	uint_t		tqs_overflow;	/* no threads to allocate   */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	uint_t		tqs_tcreates;	/* threads created 	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	uint_t		tqs_tdeaths;	/* threads died		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	uint_t		tqs_maxthreads;	/* max # of alive threads */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	uint_t		tqs_nomem;	/* # of times there were no memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	uint_t		tqs_disptcreates;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
} tqstat_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 * Per-CPU hash bucket manages taskq_bent_t structures using freelist.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
struct taskq_bucket {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	kmutex_t	tqbucket_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	taskq_t		*tqbucket_taskq;	/* Enclosing taskq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	taskq_ent_t	tqbucket_freelist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	uint_t		tqbucket_nalloc;	/* # of allocated entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	uint_t		tqbucket_nfree;		/* # of free entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	kcondvar_t	tqbucket_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	ushort_t	tqbucket_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	hrtime_t	tqbucket_totaltime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	tqstat_t	tqbucket_stat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 * Bucket flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
#define	TQBUCKET_CLOSE		0x01
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#define	TQBUCKET_SUSPEND	0x02
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * taskq implementation flags: bit range 16-31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#define	TASKQ_ACTIVE		0x00010000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
#define	TASKQ_SUSPENDED		0x00020000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
#define	TASKQ_NOINSTANCE	0x00040000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
struct taskq {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	char		tq_name[TASKQ_NAMELEN + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	kmutex_t	tq_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	krwlock_t	tq_threadlock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	kcondvar_t	tq_dispatch_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	kcondvar_t	tq_wait_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	uint_t		tq_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	int		tq_active;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	int		tq_nthreads;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	int		tq_nalloc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	int		tq_minalloc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	int		tq_maxalloc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	taskq_ent_t	*tq_freelist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	taskq_ent_t	tq_task;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	int		tq_maxsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	pri_t		tq_pri;		/* Scheduling priority	    */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	taskq_bucket_t	*tq_buckets;	/* Per-cpu array of buckets */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	int		tq_instance;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	uint_t		tq_nbuckets;	/* # of buckets	(2^n)	    */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		kthread_t *_tq_thread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		kthread_t **_tq_threadlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	}		tq_thr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	 * Statistics.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	kstat_t		*tq_kstat;	/* Exported statistics */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	hrtime_t	tq_totaltime;	/* Time spent processing tasks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	int		tq_tasks;	/* Total # of tasks posted */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	int		tq_executed;	/* Total # of tasks executed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	int		tq_maxtasks;	/* Max number of tasks in the queue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	int		tq_tcreates;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	int		tq_tdeaths;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
#define	tq_thread tq_thr._tq_thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
#define	tq_threadlist tq_thr._tq_threadlist
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
#endif	/* _SYS_TASKQ_IMPL_H */