Mercurial > illumos > illumos-gate
annotate usr/src/uts/sun4v/sys/vdc.h @ 3078:aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
6486746 cnex timeouts during intr redistribution when doing cpu DR
6488547 Kaio accesses of block size greater than 64K fail on guest's virtual disks
6488812 vdc driver should define internal macro instead of SDUNIT/SDPART
author | narayan |
---|---|
date | Wed, 08 Nov 2006 19:55:37 -0800 |
parents | a30c4090b49f |
children | eee1ef6f0e3e |
rev | line source |
---|---|
1991 | 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 /* | |
23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. | |
24 * Use is subject to license terms. | |
25 */ | |
26 | |
27 #ifndef _VDC_H | |
28 #define _VDC_H | |
29 | |
30 #pragma ident "%Z%%M% %I% %E% SMI" | |
31 | |
32 /* | |
33 * Virtual disk client implementation definitions | |
34 */ | |
35 | |
36 #include <sys/sysmacros.h> | |
37 #include <sys/note.h> | |
38 | |
39 #include <sys/ldc.h> | |
40 #include <sys/vio_mailbox.h> | |
41 #include <sys/vdsk_mailbox.h> | |
42 #include <sys/vdsk_common.h> | |
43 | |
44 #ifdef __cplusplus | |
45 extern "C" { | |
46 #endif | |
47 | |
48 #define VDC_DRIVER_NAME "vdc" | |
49 | |
50 /* | |
51 * Bit-field values to indicate if parts of the vdc driver are initialised. | |
52 */ | |
53 #define VDC_SOFT_STATE 0x0001 | |
54 #define VDC_LOCKS 0x0002 | |
55 #define VDC_MINOR 0x0004 | |
56 #define VDC_THREAD 0x0008 | |
57 #define VDC_LDC 0x0010 | |
58 #define VDC_LDC_INIT 0x0020 | |
59 #define VDC_LDC_CB 0x0040 | |
60 #define VDC_LDC_OPEN 0x0080 | |
61 #define VDC_DRING_INIT 0x0100 /* The DRing was created */ | |
62 #define VDC_DRING_BOUND 0x0200 /* The DRing was bound to an LDC channel */ | |
63 #define VDC_DRING_LOCAL 0x0400 /* The local private DRing was allocated */ | |
64 #define VDC_DRING_ENTRY 0x0800 /* At least one DRing entry was initialised */ | |
65 #define VDC_DRING (VDC_DRING_INIT | VDC_DRING_BOUND | \ | |
66 VDC_DRING_LOCAL | VDC_DRING_ENTRY) | |
67 #define VDC_HANDSHAKE 0x1000 /* Indicates if a handshake is in progress */ | |
68 #define VDC_HANDSHAKE_STOP 0x2000 /* stop further handshakes */ | |
69 | |
70 /* | |
71 * Definitions of strings to be used to create device node properties. | |
72 * (vdc uses the capitalised versions of these properties as they are 64-bit) | |
73 */ | |
74 #define VDC_NBLOCKS_PROP_NAME "Nblocks" | |
75 #define VDC_SIZE_PROP_NAME "Size" | |
76 | |
77 /* | |
78 * Definitions of MD nodes/properties. | |
79 */ | |
80 #define VDC_MD_CHAN_NAME "channel-endpoint" | |
81 #define VDC_MD_VDEV_NAME "virtual-device" | |
82 #define VDC_MD_DISK_NAME "disk" | |
83 #define VDC_MD_CFG_HDL "cfg-handle" | |
84 #define VDC_ID_PROP "id" | |
85 | |
86 /* | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
87 * Definition of actions to be carried out when processing the sequence ID |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
88 * of a message received from the vDisk server. The function verifying the |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
89 * sequence number checks the 'seq_num_xxx' fields in the soft state and |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
90 * returns whether the message should be processed (VDC_SEQ_NUM_TODO) or |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
91 * whether it was it was previously processed (VDC_SEQ_NUM_SKIP). |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
92 */ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
93 #define VDC_SEQ_NUM_INVALID -1 /* Error */ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
94 #define VDC_SEQ_NUM_SKIP 0 /* Request already processed */ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
95 #define VDC_SEQ_NUM_TODO 1 /* Request needs processing */ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
96 |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
97 /* |
3078
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
98 * Macros to get UNIT and PART number |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
99 */ |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
100 #define VDCUNIT_SHIFT 3 |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
101 #define VDCPART_MASK 7 |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
102 |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
103 #define VDCUNIT(dev) (getminor((dev)) >> VDCUNIT_SHIFT) |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
104 #define VDCPART(dev) (getminor((dev)) & VDCPART_MASK) |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
105 |
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
106 /* |
1991 | 107 * Scheme to store the instance number and the slice number in the minor number. |
3078
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
108 * (NOTE: Uses the same format and definitions as the sd(7D) driver) |
1991 | 109 */ |
3078
aa37b7e3c5c7
6485548 Can not create zpool on guest domain with an entire vdisk
narayan
parents:
2793
diff
changeset
|
110 #define VD_MAKE_DEV(instance, minor) ((instance << VDCUNIT_SHIFT) | minor) |
1991 | 111 |
112 /* | |
113 * variables controlling how long to wait before timing out and how many | |
114 * retries to attempt before giving up when communicating with vds. | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
115 * |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
116 * These values need to be sufficiently large so that a guest can survive |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
117 * the reboot of the service domain. |
1991 | 118 */ |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
119 #define VDC_RETRIES 10 |
1991 | 120 |
121 #define VDC_USEC_TIMEOUT_MIN (30 * MICROSEC) /* 30 sec */ | |
122 | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
123 /* |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
124 * This macro returns the number of Hz that the vdc driver should wait before |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
125 * a timeout is triggered. The 'timeout' parameter specifiecs the wait |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
126 * time in Hz. The 'mul' parameter allows for a multiplier to be |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
127 * specified allowing for a backoff to be implemented (e.g. using the |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
128 * retry number as a multiplier) where the wait time will get longer if |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
129 * there is no response on the previous retry. |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
130 */ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
131 #define VD_GET_TIMEOUT_HZ(timeout, mul) \ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
132 (ddi_get_lbolt() + ((timeout) * MAX(1, (mul)))) |
1991 | 133 |
134 /* | |
135 * Macros to manipulate Descriptor Ring variables in the soft state | |
136 * structure. | |
137 */ | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
138 #define VDC_GET_NEXT_REQ_ID(vdc) ((vdc)->req_id++) |
1991 | 139 |
140 #define VDC_GET_DRING_ENTRY_PTR(vdc, idx) \ | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
141 (vd_dring_entry_t *)((vdc)->dring_mem_info.vaddr + \ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
142 (idx * (vdc)->dring_entry_size)) |
1991 | 143 |
144 #define VDC_MARK_DRING_ENTRY_FREE(vdc, idx) \ | |
145 { \ | |
146 vd_dring_entry_t *dep = NULL; \ | |
147 ASSERT(vdc != NULL); \ | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
148 ASSERT((idx >= 0) && (idx < vdc->dring_len)); \ |
1991 | 149 ASSERT(vdc->dring_mem_info.vaddr != NULL); \ |
150 dep = (vd_dring_entry_t *)(vdc->dring_mem_info.vaddr + \ | |
151 (idx * vdc->dring_entry_size)); \ | |
152 ASSERT(dep != NULL); \ | |
153 dep->hdr.dstate = VIO_DESC_FREE; \ | |
154 } | |
155 | |
156 /* Initialise the Session ID and Sequence Num in the DRing msg */ | |
157 #define VDC_INIT_DRING_DATA_MSG_IDS(dmsg, vdc) \ | |
158 ASSERT(vdc != NULL); \ | |
159 dmsg.tag.vio_sid = vdc->session_id; \ | |
2032
b9ba1b330453
6422255 vdc could handle handshake restarts better
lm66018
parents:
1991
diff
changeset
|
160 dmsg.seq_num = vdc->seq_num; |
1991 | 161 |
162 /* | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
163 * The states that the read thread can be in. |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
164 */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
165 typedef enum vdc_rd_state { |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
166 VDC_READ_IDLE, /* idling - conn is not up */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
167 VDC_READ_WAITING, /* waiting for data */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
168 VDC_READ_PENDING, /* pending data avail for read */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
169 VDC_READ_RESET /* channel was reset - stop reads */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
170 } vdc_rd_state_t; |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
171 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
172 /* |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
173 * The states that the vdc-vds connection can be in. |
1991 | 174 */ |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
175 typedef enum vdc_state { |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
176 VDC_STATE_INIT, /* device is initialized */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
177 VDC_STATE_INIT_WAITING, /* waiting for ldc connection */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
178 VDC_STATE_NEGOTIATE, /* doing handshake negotiation */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
179 VDC_STATE_HANDLE_PENDING, /* handle requests in backup dring */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
180 VDC_STATE_RUNNING, /* running and accepting requests */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
181 VDC_STATE_DETACH, /* detaching */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
182 VDC_STATE_RESETTING /* resetting connection with vds */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
183 } vdc_state_t; |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
184 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
185 /* |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
186 * The states that the vdc instance can be in. |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
187 */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
188 typedef enum vdc_lc_state { |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
189 VDC_LC_ATTACHING, /* driver is attaching */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
190 VDC_LC_ONLINE, /* driver is attached and online */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
191 VDC_LC_DETACHING /* driver is detaching */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
192 } vdc_lc_state_t; |
1991 | 193 |
194 /* | |
195 * Local Descriptor Ring entry | |
196 * | |
197 * vdc creates a Local (private) descriptor ring the same size as the | |
198 * public descriptor ring it exports to vds. | |
199 */ | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
200 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
201 typedef enum { |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
202 VIO_read_dir, /* read data from server */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
203 VIO_write_dir, /* write data to server */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
204 VIO_both_dir /* transfer both in and out in same buffer */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
205 } vio_desc_direction_t; |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
206 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
207 typedef enum { |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
208 CB_STRATEGY, /* non-blocking strategy call */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
209 CB_SYNC /* synchronous operation */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
210 } vio_cb_type_t; |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
211 |
1991 | 212 typedef struct vdc_local_desc { |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
213 boolean_t is_free; /* local state - inuse or not */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
214 |
1991 | 215 int operation; /* VD_OP_xxx to be performed */ |
216 caddr_t addr; /* addr passed in by consumer */ | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
217 int slice; |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
218 diskaddr_t offset; /* disk offset */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
219 size_t nbytes; |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
220 vio_cb_type_t cb_type; /* operation type blk/nonblk */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
221 void *cb_arg; /* buf passed to strategy() */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
222 vio_desc_direction_t dir; /* direction of transfer */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
223 |
1991 | 224 caddr_t align_addr; /* used if addr non-aligned */ |
225 ldc_mem_handle_t desc_mhdl; /* Mem handle of buf */ | |
226 vd_dring_entry_t *dep; /* public Dring Entry Pointer */ | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
227 |
1991 | 228 } vdc_local_desc_t; |
229 | |
230 /* | |
231 * vdc soft state structure | |
232 */ | |
233 typedef struct vdc { | |
234 | |
235 kmutex_t lock; /* protects next 2 sections of vars */ | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
236 kcondvar_t running_cv; /* signal when upper layers can send */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
237 kcondvar_t initwait_cv; /* signal when ldc conn is up */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
238 kcondvar_t dring_free_cv; /* signal when desc is avail */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
239 kcondvar_t membind_cv; /* signal when mem can be bound */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
240 boolean_t self_reset; |
1991 | 241 |
242 int initialized; /* keeps track of what's init'ed */ | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
243 vdc_lc_state_t lifecycle; /* Current state of the vdc instance */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
244 |
2032
b9ba1b330453
6422255 vdc could handle handshake restarts better
lm66018
parents:
1991
diff
changeset
|
245 int hshake_cnt; /* number of failed handshakes */ |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
246 int open_count; /* count of outstanding opens */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
247 int dkio_flush_pending; /* # outstanding DKIO flushes */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
248 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
249 kthread_t *msg_proc_thr; /* main msg processing thread */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
250 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
251 kmutex_t read_lock; /* lock to protect read */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
252 kcondvar_t read_cv; /* cv to wait for READ events */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
253 vdc_rd_state_t read_state; /* current read state */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
254 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
255 uint32_t sync_op_cnt; /* num of active sync operations */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
256 boolean_t sync_op_pending; /* sync operation is pending */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
257 boolean_t sync_op_blocked; /* blocked waiting to do sync op */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
258 uint32_t sync_op_status; /* status of sync operation */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
259 kcondvar_t sync_pending_cv; /* cv wait for sync op to finish */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
260 kcondvar_t sync_blocked_cv; /* cv wait for other syncs to finish */ |
1991 | 261 |
262 uint64_t session_id; /* common ID sent with all messages */ | |
263 uint64_t seq_num; /* most recent sequence num generated */ | |
264 uint64_t seq_num_reply; /* Last seq num ACK/NACK'ed by vds */ | |
265 uint64_t req_id; /* Most recent Request ID generated */ | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
266 uint64_t req_id_proc; /* Last request ID processed by vdc */ |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
267 vdc_state_t state; /* Current disk client-server state */ |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
268 |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
269 dev_info_t *dip; /* device info pointer */ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
270 int instance; /* driver instance number */ |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
271 |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
272 vio_ver_t ver; /* version number agreed with server */ |
1991 | 273 vd_disk_type_t vdisk_type; /* type of device/disk being imported */ |
2531
65c5d20aa275
6419154 libpcp pcp_init routine should accept service names
narayan
parents:
2410
diff
changeset
|
274 vd_disk_label_t vdisk_label; /* label type of device/disk imported */ |
65c5d20aa275
6419154 libpcp pcp_init routine should accept service names
narayan
parents:
2410
diff
changeset
|
275 uint64_t vdisk_size; /* device size in blocks */ |
1991 | 276 uint64_t max_xfer_sz; /* maximum block size of a descriptor */ |
277 uint64_t block_size; /* device block size used */ | |
2032
b9ba1b330453
6422255 vdc could handle handshake restarts better
lm66018
parents:
1991
diff
changeset
|
278 struct dk_label *label; /* structure to store disk label */ |
1991 | 279 struct dk_cinfo *cinfo; /* structure to store DKIOCINFO data */ |
280 struct dk_minfo *minfo; /* structure for DKIOCGMEDIAINFO data */ | |
281 struct vtoc *vtoc; /* structure to store VTOC data */ | |
2531
65c5d20aa275
6419154 libpcp pcp_init routine should accept service names
narayan
parents:
2410
diff
changeset
|
282 ddi_devid_t devid; /* device id */ |
1991 | 283 |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
284 ldc_mem_info_t dring_mem_info; /* dring information */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
285 uint_t dring_curr_idx; /* current index */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
286 uint32_t dring_len; /* dring length */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
287 uint32_t dring_max_cookies; /* dring max cookies */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
288 uint32_t dring_cookie_count; /* num cookies */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
289 uint32_t dring_entry_size; /* descriptor size */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
290 ldc_mem_cookie_t *dring_cookie; /* dring cookies */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
291 uint64_t dring_ident; /* dring ident */ |
1991 | 292 |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
293 uint64_t threads_pending; /* num of threads */ |
1991 | 294 |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
295 vdc_local_desc_t *local_dring; /* local dring */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
296 vdc_local_desc_t *local_dring_backup; /* local dring backup */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
297 int local_dring_backup_tail; /* backup dring tail */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
298 int local_dring_backup_len; /* backup dring len */ |
1991 | 299 |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
300 uint64_t ldc_id; /* LDC channel id */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
301 ldc_status_t ldc_state; /* LDC channel state */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
302 ldc_handle_t ldc_handle; /* LDC handle */ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
303 ldc_dring_handle_t ldc_dring_hdl; /* LDC dring handle */ |
1991 | 304 } vdc_t; |
305 | |
306 /* | |
307 * Debugging macros | |
308 */ | |
309 #ifdef DEBUG | |
310 extern int vdc_msglevel; | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
311 extern uint64_t vdc_matchinst; |
1991 | 312 |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
313 #define DMSG(_vdc, err_level, format, ...) \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
314 do { \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
315 if (vdc_msglevel > err_level && \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
316 (vdc_matchinst & (1ull << (_vdc)->instance))) \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
317 cmn_err(CE_CONT, "?[%d,t@%p] %s: "format, \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
318 (_vdc)->instance, (void *)curthread, \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
319 __func__, __VA_ARGS__); \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
320 _NOTE(CONSTANTCONDITION) \ |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
321 } while (0); |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
322 |
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
323 #define DMSGX(err_level, format, ...) \ |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
324 do { \ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
325 if (vdc_msglevel > err_level) \ |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
326 cmn_err(CE_CONT, "?%s: "format, __func__, __VA_ARGS__);\ |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
327 _NOTE(CONSTANTCONDITION) \ |
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
328 } while (0); |
1991 | 329 |
330 #define VDC_DUMP_DRING_MSG(dmsgp) \ | |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
331 DMSGX(0, "sq:%lu start:%d end:%d ident:%lu\n", \ |
1991 | 332 dmsgp->seq_num, dmsgp->start_idx, \ |
333 dmsgp->end_idx, dmsgp->dring_ident); | |
334 | |
335 #else /* !DEBUG */ | |
2410
0faef06c73cd
6432376 vds and vdc don't negotiate max transfer size supported correctly
lm66018
parents:
2032
diff
changeset
|
336 #define DMSG(err_level, ...) |
2793
a30c4090b49f
6458676 memory leak with 12 hours all_solaris_tests.
lm66018
parents:
2531
diff
changeset
|
337 #define DMSGX(err_level, format, ...) |
1991 | 338 #define VDC_DUMP_DRING_MSG(dmsgp) |
339 | |
340 #endif /* !DEBUG */ | |
341 | |
342 #ifdef __cplusplus | |
343 } | |
344 #endif | |
345 | |
346 #endif /* _VDC_H */ |