fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * CDDL HEADER START
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * The contents of this file are subject to the terms of the
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Common Development and Distribution License (the "License").
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * You may not use this file except in compliance with the License.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * or http://www.opensolaris.org/os/licensing.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * See the License for the specific language governing permissions
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * and limitations under the License.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * When distributing Covered Code, include this CDDL HEADER in each
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * If applicable, add the following below this CDDL HEADER, with the
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * fields enclosed by brackets "[]" replaced with your own identifying
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * information: Portions Copyright [yyyy] [name of copyright owner]
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * CDDL HEADER END
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
d3c9722485327eb5b96de2f2108e9a84bd46096dAlexander Kolbasov
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
d3c9722485327eb5b96de2f2108e9a84bd46096dAlexander Kolbasov * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#ifndef _PG_H
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#define _PG_H
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Processor Groups
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#ifdef __cplusplus
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxeextern "C" {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#endif
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#if (defined(_KERNEL) || defined(_KMEMUSER))
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/cpuvar.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/group.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/processor.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/bitset.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/atomic.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/types.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/kstat.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
d3c9722485327eb5b96de2f2108e9a84bd46096dAlexander Kolbasovtypedef int pgid_t; /* processor group id */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxetypedef uint_t pg_cid_t; /* processor group class id */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxestruct pg;
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Nature of CPU relationships
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxetypedef enum pg_relation {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe PGR_LOGICAL,
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe PGR_PHYSICAL
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe} pg_relation_t;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe/*
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * Processor Group callbacks ops vector
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * These provide a mechanism allowing per PG routines to invoked
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * in response to events.
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxetypedef struct pg_cb_ops {
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe void (*thread_swtch)(struct pg *, struct cpu *, hrtime_t,
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe kthread_t *, kthread_t *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe void (*thread_remain)(struct pg *, struct cpu *,
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe kthread_t *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe} pg_cb_ops_t;
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Processor group structure
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxetypedef struct pg {
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe pgid_t pg_id; /* seq id */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe pg_relation_t pg_relation; /* grouping relationship */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe struct pg_class *pg_class; /* pg class */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe struct group pg_cpus; /* group of CPUs */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe pg_cb_ops_t pg_cb; /* pg events ops vector */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe} pg_t;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG class callbacks
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxestruct pg_ops {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe struct pg *(*alloc)();
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe void (*free)(struct pg *);
47ab0c7c6702159d8bb84e3b1533d9f9843dd568Eric Saxe void (*cpu_init)(struct cpu *, struct cpu_pg *);
47ab0c7c6702159d8bb84e3b1533d9f9843dd568Eric Saxe void (*cpu_fini)(struct cpu *, struct cpu_pg *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe void (*cpu_active)(struct cpu *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe void (*cpu_inactive)(struct cpu *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe void (*cpupart_in)(struct cpu *, struct cpupart *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe void (*cpupart_out)(struct cpu *, struct cpupart *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe void (*cpupart_move)(struct cpu *, struct cpupart *,
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe struct cpupart *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe int (*cpu_belongs)(struct pg *, struct cpu *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe char *(*policy_name)(struct pg *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe};
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#define PG_CLASS_NAME_MAX 32
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG class structure
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxetypedef struct pg_class {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg_cid_t pgc_id;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe char pgc_name[PG_CLASS_NAME_MAX];
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe struct pg_ops *pgc_ops;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg_relation_t pgc_relation;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe} pg_class_t;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Per CPU processor group data
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxetypedef struct cpu_pg {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe struct group pgs; /* All the CPU's PGs */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe struct group cmt_pgs; /* CMT load balancing lineage */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe /* (Group hierarchy ordered) */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe struct pg *cmt_lineage; /* Ascending lineage chain */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe} cpu_pg_t;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG cpu iterator cookie
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxetypedef struct pg_cpu_itr {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg_t *pg;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe group_iter_t position;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe} pg_cpu_itr_t;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Initialize a PG CPU iterator cookie
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#define PG_CPU_ITR_INIT(pgrp, itr) \
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe{ \
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe group_iter_init(&(itr).position); \
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe (itr).pg = ((pg_t *)pgrp); \
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe}
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Return the first CPU in a PG
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#define PG_CPU_GET_FIRST(pgrp) \
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe (GROUP_SIZE(&((pg_t *)pgrp)->pg_cpus) > 0 ? \
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe GROUP_ACCESS(&((pg_t *)pgrp)->pg_cpus, 0) : NULL)
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe/*
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * Return the number of CPUs in a PG
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe#define PG_NUM_CPUS(pgrp) \
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe (GROUP_SIZE(&(pgrp)->pg_cpus))
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Framework routines
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_init(void);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxepg_cid_t pg_class_register(char *, struct pg_ops *, pg_relation_t);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG CPU reconfiguration hooks
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpu0_init(void);
023e71de9e5670cebc23dd51162833661d3d2d3bHaik Aftandiliancpu_pg_t *pg_cpu_init(cpu_t *, boolean_t deferred_init);
023e71de9e5670cebc23dd51162833661d3d2d3bHaik Aftandilianvoid pg_cpu_fini(cpu_t *, cpu_pg_t *cpu_pg_deferred);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpu_active(cpu_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpu_inactive(cpu_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpu_startup(cpu_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpu_bootstrap(cpu_t *);
1a77c24bc3a54fb48592de0041508561c5781501Eric Saxeint pg_cpu_is_bootstrapped(cpu_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG cpupart service hooks
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpupart_in(cpu_t *, struct cpupart *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpupart_out(cpu_t *, struct cpupart *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_cpupart_move(cpu_t *, struct cpupart *, struct cpupart *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG CPU utility routines
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxepg_t *pg_create(pg_cid_t);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxevoid pg_destroy(pg_t *);
47ab0c7c6702159d8bb84e3b1533d9f9843dd568Eric Saxevoid pg_cpu_add(pg_t *, cpu_t *, cpu_pg_t *);
47ab0c7c6702159d8bb84e3b1533d9f9843dd568Eric Saxevoid pg_cpu_delete(pg_t *, cpu_t *, cpu_pg_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxepg_t *pg_cpu_find_pg(cpu_t *, group_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxecpu_t *pg_cpu_next(pg_cpu_itr_t *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxeboolean_t pg_cpu_find(pg_t *, cpu_t *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe/*
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * PG Event callbacks
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxevoid pg_callback_set_defaults(pg_t *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxevoid pg_ev_thread_swtch(cpu_t *, hrtime_t, kthread_t *, kthread_t *);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxevoid pg_ev_thread_remain(cpu_t *, kthread_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe/*
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * PG Observability interfaces
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxechar *pg_policy_name(pg_t *);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#endif /* !_KERNEL && !_KMEMUSER */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#ifdef __cplusplus
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe}
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#endif
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#endif /* _PG_H */