usr/src/uts/common/os/ddi_nodeid.c
author jpk
Fri, 24 Mar 2006 12:29:20 -0800
changeset 1676 37f4a3e2bd99
parent 0 68f95e015346
permissions -rw-r--r--
PSARC/2002/762 Layered Trusted Solaris PSARC/2005/060 TSNET: Trusted Networking with Security Labels PSARC/2005/259 Layered Trusted Solaris Label Interfaces PSARC/2005/573 Solaris Trusted Extensions for Printing PSARC/2005/691 Trusted Extensions for Device Allocation PSARC/2005/723 Solaris Trusted Extensions Filesystem Labeling PSARC/2006/009 Labeled Auditing PSARC/2006/155 Trusted Extensions RBAC Changes PSARC/2006/191 is_system_labeled 6293271 Zone processes should use zone_kcred instead of kcred 6394554 integrate Solaris Trusted Extensions
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 (c) 1999 by Sun Microsystems, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * All rights reserved.
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
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * DDI nodeid management ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/ksynch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/ddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/sunddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/ddi_impldefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/ddi_implfuncs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * Keep a sorted free list of available nodeids.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * Allocating a nodeid won't cause memory allocation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 * Freeing a nodeid does cause memory allocation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
struct available {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
	uint32_t nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	uint32_t count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	struct available *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	struct available *prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 * The initial seed of available nodeids: 1 .. 0x10000000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 * 0, -1 (DEVI_PSEUDO_NODEID) and -2 (DEVI_SID_NODEID) are illegal values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 * and may not be used.  Although this code is fully capable of dealing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 * with a full 32-bit range of nodeids, we use a low numeric range of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * nodeids as an optimization to avoid overlap with promif nodeids.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#define	OUR_NODEID_MIN		((uint32_t)1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#define	OUR_NODEID_MAX		((uint32_t)0x10000000)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#define	OUR_NODEID_COUNT	((uint32_t)(OUR_NODEID_MAX - OUR_NODEID_MIN))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
static struct available seed = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	OUR_NODEID_MIN, OUR_NODEID_COUNT, NULL, NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 * head of the available list ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static struct available *nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 * A single lock for the list ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
static kmutex_t nodeid_lock;
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
 * Helper functions to manage the list ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static struct available *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
np_alloc(int kmflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	return (kmem_zalloc(sizeof (struct available), kmflag));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
np_free(struct available *np)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	kmem_free(np, sizeof (struct available));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 * Unlink a node from the list ... the lock must be held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
np_unlink(struct available *np)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	if (np->prev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		np->prev->next = np->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		nhead = np->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	if (np->next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		np->next->prev = np->prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 * Insert fp before np ... the lock must be held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
np_insert(struct available *fp, struct available *np)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	fp->prev = np->prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	fp->next = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	if (np->prev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		np->prev->next = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		nhead = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	np->prev = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 * Add fp to the end of the list ... the lock must be held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
np_add(struct available *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	struct available *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	if (nhead == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		nhead = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	for (np = nhead; np->next != NULL; np = np->next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		/* empty */;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	np->next = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	fp->prev = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 * If this entry and the next entry are consecutive, coalesce the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 * two entries into a single entry ... the lock must be held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 * If the entry can be coalesced, the extra entry is freed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
np_coalesce(struct available *np)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	struct available *xp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	xp = np->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	if (xp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	if ((np->nodeid + np->count) == xp->nodeid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		np->count += xp->count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		np_unlink(xp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		np_free(xp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
impl_ddi_init_nodeid(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	struct available *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	mutex_init(&nodeid_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	 * Copy the seed into kmem_alloc-ed memory so we don't have to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	 * worry about not freeing it later.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	np = np_alloc(KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	*np = seed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	nhead = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
impl_ddi_alloc_nodeid(int *nodeid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	struct available *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	int x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	int unlinked = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	mutex_enter(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	if (nhead == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		*nodeid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		return (DDI_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	np = nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	x = (int)((unsigned int)np->nodeid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	++np->nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	--np->count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	if (np->count == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
		np_unlink(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
		unlinked = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	if (unlinked)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		np_free(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	ASSERT(x != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	ASSERT(x != DEVI_PSEUDO_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	ASSERT(x != DEVI_SID_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	*nodeid = x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	return (DDI_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
impl_ddi_free_nodeid(int n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	uint32_t nodeid = (uint32_t)n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	struct available *np, *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	ASSERT(n != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	ASSERT(n != DEVI_PSEUDO_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	ASSERT(n != DEVI_SID_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	 * Allocate memory wihout holding the lock in case we need it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * If we don't use it, we'll free it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	fp = np_alloc(KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	mutex_enter(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	 * Insert nodeid in the appropriate place in our sorted available
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	 * list. Maintain the list as we do it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	for (np = nhead; np != NULL; np = np->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		 * Add to the beginning of this entry?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		if ((nodeid + 1) == np->nodeid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			np->nodeid = nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
			++np->count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
			mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			np_free(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		 * Add to end of this entry? (If yes, try to coalesce
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		 * this entry with the next entry.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		if (nodeid == (np->nodeid + np->count)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			++np->count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			np_coalesce(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
			mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
			np_free(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		 * Does it belong before this entry? (new entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		if (nodeid < np->nodeid)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
			fp->nodeid = nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
			fp->count = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
			np_insert(fp, np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
			mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		if (nodeid < (np->nodeid + np->count))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
			cmn_err(CE_PANIC, "impl_ddi_free_nodeid: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
			    "nodeid %x already free", n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	 * Add a new list item to the end of the list ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	fp->nodeid = nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	fp->count = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	np_add(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
 * Remove (take) nodeid n off of the available list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
 * Returns 0 if successful or -1 if it fails.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
 * A failure indicates we were called with KM_NOSLEEP and we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
 * couldn't allocate memory when we needed to.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
impl_ddi_take_nodeid(int n, int kmflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	uint32_t nodeid = (uint32_t)n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	struct available *np, *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	int unlinked = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	ASSERT(n != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	ASSERT(n != DEVI_PSEUDO_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	ASSERT(n != DEVI_SID_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	 * If this nodeid is not within the range of nodeids we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	 * manage, we simply succeed.  The initial seed may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	 * setup so that promif nodeids fall outside our range.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	if ((nodeid < OUR_NODEID_MIN) || (nodeid > OUR_NODEID_MAX))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	 * Allocate memory wihout holding the lock in case we need it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	 * If we don't use it, we'll free it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	fp = np_alloc(kmflag);		/* if KM_NOSLEEP, fp may be NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	mutex_enter(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	 * Find nodeid in our list, if it exists, 'take' it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	for (np = nhead; np != NULL; np = np->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		 * If it's less than this entry, it's not available...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		if (nodeid < np->nodeid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		 * If it's the first entry in this list item, take it ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		if ((nodeid) == np->nodeid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
			++np->nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
			--np->count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
			if (np->count == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
				np_unlink(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
				++unlinked;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
			mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
			if (fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
				np_free(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
			if (unlinked)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
				np_free(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
		 * If it's the last entry in this list item, take it ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		 * The count can't be 1 otherwise it would have matched
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		 * the beginning of list case, above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		if (nodeid == (np->nodeid + np->count - 1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
			--np->count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			ASSERT(np->count != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
			mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			if (fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
				np_free(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		 * Is it in the middle of this entry? If it is, we'll
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
		 * have to split np into two items, removing nodeid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		 * from the middle of the list item.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		if (nodeid < (np->nodeid + np->count - 1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
			if (fp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
				 * We were called with KM_NOSLEEP and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
				 * were unable to allocate memory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
				mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
				return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
			 * Split np, removing nodeid from the middle of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
			 * this entry. We already know it isn't on either
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
			 * end of of this entry, so we know we have to split it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
			fp->nodeid = np->nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
			fp->count = nodeid - np->nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
			np->nodeid = nodeid + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
			np->count = np->count - fp->count - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
			ASSERT((fp->count != 0) && (np->count != 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
			ASSERT(np->nodeid == (fp->nodeid + fp->count + 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
			np_insert(fp, np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
			mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	 * Apparently the nodeid is not available ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	mutex_exit(&nodeid_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	if (fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		np_free(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	cmn_err(CE_CONT, "?impl_ddi_take_nodeid: nodeid %x may not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	    "be unique\n", nodeid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
}