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 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * xdf.c - Xen Virtual Block Device Driver 29 * TODO: 30 * - support alternate block size (currently only DEV_BSIZE supported) 31 * - revalidate geometry for removable devices 32 * 33 * This driver export solaris disk device nodes, accepts IO requests from 34 * those nodes, and services those requests by talking to a backend device 35 * in another domain. 36 * 37 * Communication with the backend device is done via a ringbuffer (which is 38 * managed via xvdi interfaces) and dma memory (which is managed via ddi 39 * interfaces). 40 * 41 * Communication with the backend device is dependant upon establishing a 42 * connection to the backend device. This connection process involves 43 * reading device configuration information from xenbus and publishing 44 * some frontend runtime configuration parameters via the xenbus (for 45 * consumption by the backend). Once we've published runtime configuration 46 * information via the xenbus, the backend device can enter the connected 47 * state and we'll enter the XD_CONNECTED state. But before we can allow 48 * random IO to begin, we need to do IO to the backend device to determine 49 * the device label and if flush operations are supported. Once this is 50 * done we enter the XD_READY state and can process any IO operations. 51 * 52 * We recieve notifications of xenbus state changes for the backend device 53 * (aka, the "other end") via the xdf_oe_change() callback. This callback 54 * is single threaded, meaning that we can't recieve new notification of 55 * other end state changes while we're processing an outstanding 56 * notification of an other end state change. There for we can't do any 57 * blocking operations from the xdf_oe_change() callback. This is why we 58 * have a seperate taskq (xdf_ready_tq) which exists to do the necessary 59 * IO to get us from the XD_CONNECTED to the XD_READY state. All IO 60 * generated by the xdf_ready_tq thread (xdf_ready_tq_thread) will go 61 * throught xdf_lb_rdwr(), which is a synchronous IO interface. IOs 62 * generated by the xdf_ready_tq_thread thread have priority over all 63 * other IO requests. 64 * 65 * We also communicate with the backend device via the xenbus "media-req" 66 * (XBP_MEDIA_REQ) property. For more information on this see the 67 * comments in blkif.h. 68 */ 69 70 #include <io/xdf.h> 71 72 #include <sys/conf.h> 73 #include <sys/dkio.h> 74 #include <sys/promif.h> 75 #include <sys/sysmacros.h> 76 #include <sys/kstat.h> 77 #include <sys/mach_mmu.h> 78 #ifdef XPV_HVM_DRIVER 79 #include <sys/xpv_support.h> 80 #include <sys/sunndi.h> 81 #else /* !XPV_HVM_DRIVER */ 82 #include <sys/evtchn_impl.h> 83 #endif /* !XPV_HVM_DRIVER */ 84 #include <public/io/xenbus.h> 85 #include <xen/sys/xenbus_impl.h> 86 #include <sys/scsi/generic/inquiry.h> 87 #include <xen/io/blkif_impl.h> 88 #include <sys/fdio.h> 89 #include <sys/cdio.h> 90 91 /* 92 * DEBUG_EVAL can be used to include debug only statements without 93 * having to use '#ifdef DEBUG' statements 94 */ 95 #ifdef DEBUG 96 #define DEBUG_EVAL(x) (x) 97 #else /* !DEBUG */ 98 #define DEBUG_EVAL(x) 99 #endif /* !DEBUG */ 100 101 #define XDF_DRAIN_MSEC_DELAY (50*1000) /* 00.05 sec */ 102 #define XDF_DRAIN_RETRY_COUNT 200 /* 10.00 sec */ 103 104 #define INVALID_DOMID ((domid_t)-1) 105 #define FLUSH_DISKCACHE 0x1 106 #define WRITE_BARRIER 0x2 107 #define DEFAULT_FLUSH_BLOCK 156 /* block to write to cause a cache flush */ 108 #define USE_WRITE_BARRIER(vdp) \ 109 ((vdp)->xdf_feature_barrier && !(vdp)->xdf_flush_supported) 110 #define USE_FLUSH_DISKCACHE(vdp) \ 111 ((vdp)->xdf_feature_barrier && (vdp)->xdf_flush_supported) 112 #define IS_WRITE_BARRIER(vdp, bp) \ 113 (!IS_READ(bp) && USE_WRITE_BARRIER(vdp) && \ 114 ((bp)->b_un.b_addr == (vdp)->xdf_cache_flush_block)) 115 #define IS_FLUSH_DISKCACHE(bp) \ 116 (!IS_READ(bp) && USE_FLUSH_DISKCACHE(vdp) && ((bp)->b_bcount == 0)) 117 118 #define VREQ_DONE(vreq) \ 119 VOID2BOOLEAN(((vreq)->v_status == VREQ_DMAWIN_DONE) && \ 120 (((vreq)->v_flush_diskcache == FLUSH_DISKCACHE) || \ 121 (((vreq)->v_dmaw + 1) == (vreq)->v_ndmaws))) 122 123 #define BP_VREQ(bp) ((v_req_t *)((bp)->av_back)) 124 #define BP_VREQ_SET(bp, vreq) (((bp)->av_back = (buf_t *)(vreq))) 125 126 extern int do_polled_io; 127 128 /* run-time tunables that we don't want the compiler to optimize away */ 129 volatile int xdf_debug = 0; 130 volatile boolean_t xdf_barrier_flush_disable = B_FALSE; 131 132 /* per module globals */ 133 major_t xdf_major; 134 static void *xdf_ssp; 135 static kmem_cache_t *xdf_vreq_cache; 136 static kmem_cache_t *xdf_gs_cache; 137 static int xdf_maxphys = XB_MAXPHYS; 138 static diskaddr_t xdf_flush_block = DEFAULT_FLUSH_BLOCK; 139 static int xdf_fbrewrites; /* flush block re-write count */ 140 141 /* misc public functions (used by xdf_shell.c) */ 142 int xdf_lb_rdwr(dev_info_t *, uchar_t, void *, diskaddr_t, size_t, void *); 143 int xdf_lb_getinfo(dev_info_t *, int, void *, void *); 144 145 /* misc private functions */ 146 static void xdf_io_start(xdf_t *); 147 148 /* callbacks from commmon label */ 149 static cmlb_tg_ops_t xdf_lb_ops = { 150 TG_DK_OPS_VERSION_1, 151 xdf_lb_rdwr, 152 xdf_lb_getinfo 153 }; 154 155 /* 156 * I/O buffer DMA attributes 157 * Make sure: one DMA window contains BLKIF_MAX_SEGMENTS_PER_REQUEST at most 158 */ 159 static ddi_dma_attr_t xb_dma_attr = { 160 DMA_ATTR_V0, 161 (uint64_t)0, /* lowest address */ 162 (uint64_t)0xffffffffffffffff, /* highest usable address */ 163 (uint64_t)0xffffff, /* DMA counter limit max */ 164 (uint64_t)XB_BSIZE, /* alignment in bytes */ 165 XB_BSIZE - 1, /* bitmap of burst sizes */ 166 XB_BSIZE, /* min transfer */ 167 (uint64_t)XB_MAX_XFER, /* maximum transfer */ 168 (uint64_t)PAGEOFFSET, /* 1 page segment length */ 169 BLKIF_MAX_SEGMENTS_PER_REQUEST, /* maximum number of segments */ 170 XB_BSIZE, /* granularity */ 171 0, /* flags (reserved) */ 172 }; 173 174 static ddi_device_acc_attr_t xc_acc_attr = { 175 DDI_DEVICE_ATTR_V0, 176 DDI_NEVERSWAP_ACC, 177 DDI_STRICTORDER_ACC 178 }; 179 180 static void 181 xdf_timeout_handler(void *arg) 182 { 183 xdf_t *vdp = arg; 184 185 mutex_enter(&vdp->xdf_dev_lk); 186 vdp->xdf_timeout_id = 0; 187 mutex_exit(&vdp->xdf_dev_lk); 188 189 /* new timeout thread could be re-scheduled */ 190 xdf_io_start(vdp); 191 } 192 193 /* 194 * callback func when DMA/GTE resources is available 195 * 196 * Note: we only register one callback function to grant table subsystem 197 * since we only have one 'struct gnttab_free_callback' in xdf_t. 198 */ 199 static int 200 xdf_dmacallback(caddr_t arg) 201 { 202 xdf_t *vdp = (xdf_t *)arg; 203 ASSERT(vdp != NULL); 204 205 DPRINTF(DMA_DBG, ("xdf@%s: DMA callback started\n", 206 vdp->xdf_addr)); 207 208 ddi_trigger_softintr(vdp->xdf_softintr_id); 209 return (DDI_DMA_CALLBACK_DONE); 210 } 211 212 static ge_slot_t * 213 gs_get(xdf_t *vdp, int isread) 214 { 215 grant_ref_t gh; 216 ge_slot_t *gs; 217 218 /* try to alloc GTEs needed in this slot, first */ 219 if (gnttab_alloc_grant_references( 220 BLKIF_MAX_SEGMENTS_PER_REQUEST, &gh) == -1) { 221 if (vdp->xdf_gnt_callback.next == NULL) { 222 SETDMACBON(vdp); 223 gnttab_request_free_callback( 224 &vdp->xdf_gnt_callback, 225 (void (*)(void *))xdf_dmacallback, 226 (void *)vdp, 227 BLKIF_MAX_SEGMENTS_PER_REQUEST); 228 } 229 return (NULL); 230 } 231 232 gs = kmem_cache_alloc(xdf_gs_cache, KM_NOSLEEP); 233 if (gs == NULL) { 234 gnttab_free_grant_references(gh); 235 if (vdp->xdf_timeout_id == 0) 236 /* restart I/O after one second */ 237 vdp->xdf_timeout_id = 238 timeout(xdf_timeout_handler, vdp, hz); 239 return (NULL); 240 } 241 242 /* init gs_slot */ 243 gs->gs_oeid = vdp->xdf_peer; 244 gs->gs_isread = isread; 245 gs->gs_ghead = gh; 246 gs->gs_ngrefs = 0; 247 248 return (gs); 249 } 250 251 static void 252 gs_free(ge_slot_t *gs) 253 { 254 int i; 255 256 /* release all grant table entry resources used in this slot */ 257 for (i = 0; i < gs->gs_ngrefs; i++) 258 gnttab_end_foreign_access(gs->gs_ge[i], !gs->gs_isread, 0); 259 gnttab_free_grant_references(gs->gs_ghead); 260 list_remove(&gs->gs_vreq->v_gs, gs); 261 kmem_cache_free(xdf_gs_cache, gs); 262 } 263 264 static grant_ref_t 265 gs_grant(ge_slot_t *gs, mfn_t mfn) 266 { 267 grant_ref_t gr = gnttab_claim_grant_reference(&gs->gs_ghead); 268 269 ASSERT(gr != -1); 270 ASSERT(gs->gs_ngrefs < BLKIF_MAX_SEGMENTS_PER_REQUEST); 271 gs->gs_ge[gs->gs_ngrefs++] = gr; 272 gnttab_grant_foreign_access_ref(gr, gs->gs_oeid, mfn, !gs->gs_isread); 273 274 return (gr); 275 } 276 277 /* 278 * Alloc a vreq for this bp 279 * bp->av_back contains the pointer to the vreq upon return 280 */ 281 static v_req_t * 282 vreq_get(xdf_t *vdp, buf_t *bp) 283 { 284 v_req_t *vreq = NULL; 285 286 ASSERT(BP_VREQ(bp) == NULL); 287 288 vreq = kmem_cache_alloc(xdf_vreq_cache, KM_NOSLEEP); 289 if (vreq == NULL) { 290 if (vdp->xdf_timeout_id == 0) 291 /* restart I/O after one second */ 292 vdp->xdf_timeout_id = 293 timeout(xdf_timeout_handler, vdp, hz); 294 return (NULL); 295 } 296 bzero(vreq, sizeof (v_req_t)); 297 list_create(&vreq->v_gs, sizeof (ge_slot_t), 298 offsetof(ge_slot_t, gs_vreq_link)); 299 vreq->v_buf = bp; 300 vreq->v_status = VREQ_INIT; 301 vreq->v_runq = B_FALSE; 302 BP_VREQ_SET(bp, vreq); 303 /* init of other fields in vreq is up to the caller */ 304 305 list_insert_head(&vdp->xdf_vreq_act, (void *)vreq); 306 307 return (vreq); 308 } 309 310 static void 311 vreq_free(xdf_t *vdp, v_req_t *vreq) 312 { 313 buf_t *bp = vreq->v_buf; 314 315 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 316 ASSERT(BP_VREQ(bp) == vreq); 317 318 list_remove(&vdp->xdf_vreq_act, vreq); 319 320 if (vreq->v_flush_diskcache == FLUSH_DISKCACHE) 321 goto done; 322 323 switch (vreq->v_status) { 324 case VREQ_DMAWIN_DONE: 325 case VREQ_GS_ALLOCED: 326 case VREQ_DMABUF_BOUND: 327 (void) ddi_dma_unbind_handle(vreq->v_dmahdl); 328 /*FALLTHRU*/ 329 case VREQ_DMAMEM_ALLOCED: 330 if (!ALIGNED_XFER(bp)) { 331 ASSERT(vreq->v_abuf != NULL); 332 if (!IS_ERROR(bp) && IS_READ(bp)) 333 bcopy(vreq->v_abuf, bp->b_un.b_addr, 334 bp->b_bcount); 335 ddi_dma_mem_free(&vreq->v_align); 336 } 337 /*FALLTHRU*/ 338 case VREQ_MEMDMAHDL_ALLOCED: 339 if (!ALIGNED_XFER(bp)) 340 ddi_dma_free_handle(&vreq->v_memdmahdl); 341 /*FALLTHRU*/ 342 case VREQ_DMAHDL_ALLOCED: 343 ddi_dma_free_handle(&vreq->v_dmahdl); 344 break; 345 default: 346 break; 347 } 348 done: 349 ASSERT(!vreq->v_runq); 350 list_destroy(&vreq->v_gs); 351 kmem_cache_free(xdf_vreq_cache, vreq); 352 } 353 354 /* 355 * Snarf new data if our flush block was re-written 356 */ 357 static void 358 check_fbwrite(xdf_t *vdp, buf_t *bp, daddr_t blkno) 359 { 360 int nblks; 361 boolean_t mapin; 362 363 if (IS_WRITE_BARRIER(vdp, bp)) 364 return; /* write was a flush write */ 365 366 mapin = B_FALSE; 367 nblks = bp->b_bcount >> DEV_BSHIFT; 368 if (xdf_flush_block >= blkno && xdf_flush_block < (blkno + nblks)) { 369 xdf_fbrewrites++; 370 if (bp->b_flags & (B_PAGEIO | B_PHYS)) { 371 mapin = B_TRUE; 372 bp_mapin(bp); 373 } 374 bcopy(bp->b_un.b_addr + 375 ((xdf_flush_block - blkno) << DEV_BSHIFT), 376 vdp->xdf_cache_flush_block, DEV_BSIZE); 377 if (mapin) 378 bp_mapout(bp); 379 } 380 } 381 382 /* 383 * Initalize the DMA and grant table resources for the buf 384 */ 385 static int 386 vreq_setup(xdf_t *vdp, v_req_t *vreq) 387 { 388 int rc; 389 ddi_dma_attr_t dmaattr; 390 uint_t ndcs, ndws; 391 ddi_dma_handle_t dh; 392 ddi_dma_handle_t mdh; 393 ddi_dma_cookie_t dc; 394 ddi_acc_handle_t abh; 395 caddr_t aba; 396 ge_slot_t *gs; 397 size_t bufsz; 398 off_t off; 399 size_t sz; 400 buf_t *bp = vreq->v_buf; 401 int dma_flags = (IS_READ(bp) ? DDI_DMA_READ : DDI_DMA_WRITE) | 402 DDI_DMA_STREAMING | DDI_DMA_PARTIAL; 403 404 switch (vreq->v_status) { 405 case VREQ_INIT: 406 if (IS_FLUSH_DISKCACHE(bp)) { 407 if ((gs = gs_get(vdp, IS_READ(bp))) == NULL) { 408 DPRINTF(DMA_DBG, ("xdf@%s: " 409 "get ge_slotfailed\n", vdp->xdf_addr)); 410 return (DDI_FAILURE); 411 } 412 vreq->v_blkno = 0; 413 vreq->v_nslots = 1; 414 vreq->v_flush_diskcache = FLUSH_DISKCACHE; 415 vreq->v_status = VREQ_GS_ALLOCED; 416 gs->gs_vreq = vreq; 417 list_insert_head(&vreq->v_gs, gs); 418 return (DDI_SUCCESS); 419 } 420 421 if (IS_WRITE_BARRIER(vdp, bp)) 422 vreq->v_flush_diskcache = WRITE_BARRIER; 423 vreq->v_blkno = bp->b_blkno + 424 (diskaddr_t)(uintptr_t)bp->b_private; 425 /* See if we wrote new data to our flush block */ 426 if (!IS_READ(bp) && USE_WRITE_BARRIER(vdp)) 427 check_fbwrite(vdp, bp, vreq->v_blkno); 428 vreq->v_status = VREQ_INIT_DONE; 429 /*FALLTHRU*/ 430 431 case VREQ_INIT_DONE: 432 /* 433 * alloc DMA handle 434 */ 435 rc = ddi_dma_alloc_handle(vdp->xdf_dip, &xb_dma_attr, 436 xdf_dmacallback, (caddr_t)vdp, &dh); 437 if (rc != DDI_SUCCESS) { 438 SETDMACBON(vdp); 439 DPRINTF(DMA_DBG, ("xdf@%s: DMA handle alloc failed\n", 440 vdp->xdf_addr)); 441 return (DDI_FAILURE); 442 } 443 444 vreq->v_dmahdl = dh; 445 vreq->v_status = VREQ_DMAHDL_ALLOCED; 446 /*FALLTHRU*/ 447 448 case VREQ_DMAHDL_ALLOCED: 449 /* 450 * alloc dma handle for 512-byte aligned buf 451 */ 452 if (!ALIGNED_XFER(bp)) { 453 /* 454 * XXPV: we need to temporarily enlarge the seg 455 * boundary and s/g length to work round CR6381968 456 */ 457 dmaattr = xb_dma_attr; 458 dmaattr.dma_attr_seg = (uint64_t)-1; 459 dmaattr.dma_attr_sgllen = INT_MAX; 460 rc = ddi_dma_alloc_handle(vdp->xdf_dip, &dmaattr, 461 xdf_dmacallback, (caddr_t)vdp, &mdh); 462 if (rc != DDI_SUCCESS) { 463 SETDMACBON(vdp); 464 DPRINTF(DMA_DBG, ("xdf@%s: " 465 "unaligned buf DMAhandle alloc failed\n", 466 vdp->xdf_addr)); 467 return (DDI_FAILURE); 468 } 469 vreq->v_memdmahdl = mdh; 470 vreq->v_status = VREQ_MEMDMAHDL_ALLOCED; 471 } 472 /*FALLTHRU*/ 473 474 case VREQ_MEMDMAHDL_ALLOCED: 475 /* 476 * alloc 512-byte aligned buf 477 */ 478 if (!ALIGNED_XFER(bp)) { 479 if (bp->b_flags & (B_PAGEIO | B_PHYS)) 480 bp_mapin(bp); 481 rc = ddi_dma_mem_alloc(vreq->v_memdmahdl, 482 roundup(bp->b_bcount, XB_BSIZE), &xc_acc_attr, 483 DDI_DMA_STREAMING, xdf_dmacallback, (caddr_t)vdp, 484 &aba, &bufsz, &abh); 485 if (rc != DDI_SUCCESS) { 486 SETDMACBON(vdp); 487 DPRINTF(DMA_DBG, ("xdf@%s: " 488 "DMA mem allocation failed\n", 489 vdp->xdf_addr)); 490 return (DDI_FAILURE); 491 } 492 493 vreq->v_abuf = aba; 494 vreq->v_align = abh; 495 vreq->v_status = VREQ_DMAMEM_ALLOCED; 496 497 ASSERT(bufsz >= bp->b_bcount); 498 if (!IS_READ(bp)) 499 bcopy(bp->b_un.b_addr, vreq->v_abuf, 500 bp->b_bcount); 501 } 502 /*FALLTHRU*/ 503 504 case VREQ_DMAMEM_ALLOCED: 505 /* 506 * dma bind 507 */ 508 if (ALIGNED_XFER(bp)) { 509 rc = ddi_dma_buf_bind_handle(vreq->v_dmahdl, bp, 510 dma_flags, xdf_dmacallback, (caddr_t)vdp, 511 &dc, &ndcs); 512 } else { 513 rc = ddi_dma_addr_bind_handle(vreq->v_dmahdl, 514 NULL, vreq->v_abuf, bp->b_bcount, dma_flags, 515 xdf_dmacallback, (caddr_t)vdp, &dc, &ndcs); 516 } 517 if (rc == DDI_DMA_MAPPED || rc == DDI_DMA_PARTIAL_MAP) { 518 /* get num of dma windows */ 519 if (rc == DDI_DMA_PARTIAL_MAP) { 520 rc = ddi_dma_numwin(vreq->v_dmahdl, &ndws); 521 ASSERT(rc == DDI_SUCCESS); 522 } else { 523 ndws = 1; 524 } 525 } else { 526 SETDMACBON(vdp); 527 DPRINTF(DMA_DBG, ("xdf@%s: DMA bind failed\n", 528 vdp->xdf_addr)); 529 return (DDI_FAILURE); 530 } 531 532 vreq->v_dmac = dc; 533 vreq->v_dmaw = 0; 534 vreq->v_ndmacs = ndcs; 535 vreq->v_ndmaws = ndws; 536 vreq->v_nslots = ndws; 537 vreq->v_status = VREQ_DMABUF_BOUND; 538 /*FALLTHRU*/ 539 540 case VREQ_DMABUF_BOUND: 541 /* 542 * get ge_slot, callback is set upon failure from gs_get(), 543 * if not set previously 544 */ 545 if ((gs = gs_get(vdp, IS_READ(bp))) == NULL) { 546 DPRINTF(DMA_DBG, ("xdf@%s: get ge_slot failed\n", 547 vdp->xdf_addr)); 548 return (DDI_FAILURE); 549 } 550 551 vreq->v_status = VREQ_GS_ALLOCED; 552 gs->gs_vreq = vreq; 553 list_insert_head(&vreq->v_gs, gs); 554 break; 555 556 case VREQ_GS_ALLOCED: 557 /* nothing need to be done */ 558 break; 559 560 case VREQ_DMAWIN_DONE: 561 /* 562 * move to the next dma window 563 */ 564 ASSERT((vreq->v_dmaw + 1) < vreq->v_ndmaws); 565 566 /* get a ge_slot for this DMA window */ 567 if ((gs = gs_get(vdp, IS_READ(bp))) == NULL) { 568 DPRINTF(DMA_DBG, ("xdf@%s: get ge_slot failed\n", 569 vdp->xdf_addr)); 570 return (DDI_FAILURE); 571 } 572 573 vreq->v_dmaw++; 574 VERIFY(ddi_dma_getwin(vreq->v_dmahdl, vreq->v_dmaw, &off, &sz, 575 &vreq->v_dmac, &vreq->v_ndmacs) == DDI_SUCCESS); 576 vreq->v_status = VREQ_GS_ALLOCED; 577 gs->gs_vreq = vreq; 578 list_insert_head(&vreq->v_gs, gs); 579 break; 580 581 default: 582 return (DDI_FAILURE); 583 } 584 585 return (DDI_SUCCESS); 586 } 587 588 static int 589 xdf_cmlb_attach(xdf_t *vdp) 590 { 591 dev_info_t *dip = vdp->xdf_dip; 592 593 return (cmlb_attach(dip, &xdf_lb_ops, 594 XD_IS_CD(vdp) ? DTYPE_RODIRECT : DTYPE_DIRECT, 595 XD_IS_RM(vdp), 596 B_TRUE, 597 XD_IS_CD(vdp) ? DDI_NT_CD_XVMD : DDI_NT_BLOCK_XVMD, 598 #if defined(XPV_HVM_DRIVER) 599 (XD_IS_CD(vdp) ? 0 : CMLB_CREATE_ALTSLICE_VTOC_16_DTYPE_DIRECT) | 600 CMLB_INTERNAL_MINOR_NODES, 601 #else /* !XPV_HVM_DRIVER */ 602 XD_IS_CD(vdp) ? 0 : CMLB_FAKE_LABEL_ONE_PARTITION, 603 #endif /* !XPV_HVM_DRIVER */ 604 vdp->xdf_vd_lbl, NULL)); 605 } 606 607 static void 608 xdf_io_err(buf_t *bp, int err, size_t resid) 609 { 610 bioerror(bp, err); 611 if (resid == 0) 612 bp->b_resid = bp->b_bcount; 613 biodone(bp); 614 } 615 616 static void 617 xdf_kstat_enter(xdf_t *vdp, buf_t *bp) 618 { 619 v_req_t *vreq = BP_VREQ(bp); 620 621 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 622 623 if (vdp->xdf_xdev_iostat == NULL) 624 return; 625 if ((vreq != NULL) && vreq->v_runq) { 626 kstat_runq_enter(KSTAT_IO_PTR(vdp->xdf_xdev_iostat)); 627 } else { 628 kstat_waitq_enter(KSTAT_IO_PTR(vdp->xdf_xdev_iostat)); 629 } 630 } 631 632 static void 633 xdf_kstat_exit(xdf_t *vdp, buf_t *bp) 634 { 635 v_req_t *vreq = BP_VREQ(bp); 636 637 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 638 639 if (vdp->xdf_xdev_iostat == NULL) 640 return; 641 if ((vreq != NULL) && vreq->v_runq) { 642 kstat_runq_exit(KSTAT_IO_PTR(vdp->xdf_xdev_iostat)); 643 } else { 644 kstat_waitq_exit(KSTAT_IO_PTR(vdp->xdf_xdev_iostat)); 645 } 646 } 647 648 static void 649 xdf_kstat_waitq_to_runq(xdf_t *vdp, buf_t *bp) 650 { 651 v_req_t *vreq = BP_VREQ(bp); 652 653 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 654 ASSERT(!vreq->v_runq); 655 656 vreq->v_runq = B_TRUE; 657 if (vdp->xdf_xdev_iostat == NULL) 658 return; 659 kstat_waitq_to_runq(KSTAT_IO_PTR(vdp->xdf_xdev_iostat)); 660 } 661 662 static void 663 xdf_kstat_runq_to_waitq(xdf_t *vdp, buf_t *bp) 664 { 665 v_req_t *vreq = BP_VREQ(bp); 666 667 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 668 ASSERT(vreq->v_runq); 669 670 vreq->v_runq = B_FALSE; 671 if (vdp->xdf_xdev_iostat == NULL) 672 return; 673 kstat_runq_back_to_waitq(KSTAT_IO_PTR(vdp->xdf_xdev_iostat)); 674 } 675 676 int 677 xdf_kstat_create(dev_info_t *dip, char *ks_module, int instance) 678 { 679 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 680 kstat_t *kstat; 681 buf_t *bp; 682 683 if ((kstat = kstat_create( 684 ks_module, instance, NULL, "disk", 685 KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT)) == NULL) 686 return (-1); 687 688 /* See comment about locking in xdf_kstat_delete(). */ 689 mutex_enter(&vdp->xdf_iostat_lk); 690 mutex_enter(&vdp->xdf_dev_lk); 691 692 /* only one kstat can exist at a time */ 693 if (vdp->xdf_xdev_iostat != NULL) { 694 mutex_exit(&vdp->xdf_dev_lk); 695 mutex_exit(&vdp->xdf_iostat_lk); 696 kstat_delete(kstat); 697 return (-1); 698 } 699 700 vdp->xdf_xdev_iostat = kstat; 701 vdp->xdf_xdev_iostat->ks_lock = &vdp->xdf_dev_lk; 702 kstat_install(vdp->xdf_xdev_iostat); 703 704 /* 705 * Now that we've created a kstat, we need to update the waitq and 706 * runq counts for the kstat to reflect our current state. 707 * 708 * For a buf_t structure to be on the runq, it must have a ring 709 * buffer slot associated with it. To get a ring buffer slot the 710 * buf must first have a v_req_t and a ge_slot_t associated with it. 711 * Then when it is granted a ring buffer slot, v_runq will be set to 712 * true. 713 * 714 * For a buf_t structure to be on the waitq, it must not be on the 715 * runq. So to find all the buf_t's that should be on waitq, we 716 * walk the active buf list and add any buf_t's which aren't on the 717 * runq to the waitq. 718 */ 719 bp = vdp->xdf_f_act; 720 while (bp != NULL) { 721 xdf_kstat_enter(vdp, bp); 722 bp = bp->av_forw; 723 } 724 if (vdp->xdf_ready_tq_bp != NULL) 725 xdf_kstat_enter(vdp, vdp->xdf_ready_tq_bp); 726 727 mutex_exit(&vdp->xdf_dev_lk); 728 mutex_exit(&vdp->xdf_iostat_lk); 729 return (0); 730 } 731 732 void 733 xdf_kstat_delete(dev_info_t *dip) 734 { 735 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 736 kstat_t *kstat; 737 buf_t *bp; 738 739 /* 740 * The locking order here is xdf_iostat_lk and then xdf_dev_lk. 741 * xdf_dev_lk is used to protect the xdf_xdev_iostat pointer 742 * and the contents of the our kstat. xdf_iostat_lk is used 743 * to protect the allocation and freeing of the actual kstat. 744 * xdf_dev_lk can't be used for this purpose because kstat 745 * readers use it to access the contents of the kstat and 746 * hence it can't be held when calling kstat_delete(). 747 */ 748 mutex_enter(&vdp->xdf_iostat_lk); 749 mutex_enter(&vdp->xdf_dev_lk); 750 751 if (vdp->xdf_xdev_iostat == NULL) { 752 mutex_exit(&vdp->xdf_dev_lk); 753 mutex_exit(&vdp->xdf_iostat_lk); 754 return; 755 } 756 757 /* 758 * We're about to destroy the kstat structures, so it isn't really 759 * necessary to update the runq and waitq counts. But, since this 760 * isn't a hot code path we can afford to be a little pedantic and 761 * go ahead and decrement the runq and waitq kstat counters to zero 762 * before free'ing them. This helps us ensure that we've gotten all 763 * our accounting correct. 764 * 765 * For an explanation of how we determine which buffers go on the 766 * runq vs which go on the waitq, see the comments in 767 * xdf_kstat_create(). 768 */ 769 bp = vdp->xdf_f_act; 770 while (bp != NULL) { 771 xdf_kstat_exit(vdp, bp); 772 bp = bp->av_forw; 773 } 774 if (vdp->xdf_ready_tq_bp != NULL) 775 xdf_kstat_exit(vdp, vdp->xdf_ready_tq_bp); 776 777 kstat = vdp->xdf_xdev_iostat; 778 vdp->xdf_xdev_iostat = NULL; 779 mutex_exit(&vdp->xdf_dev_lk); 780 kstat_delete(kstat); 781 mutex_exit(&vdp->xdf_iostat_lk); 782 } 783 784 /* 785 * Add an IO requests onto the active queue. 786 * 787 * We have to detect IOs generated by xdf_ready_tq_thread. These IOs 788 * are used to establish a connection to the backend, so they recieve 789 * priority over all other IOs. Since xdf_ready_tq_thread only does 790 * synchronous IO, there can only be one xdf_ready_tq_thread request at any 791 * given time and we record the buf associated with that request in 792 * xdf_ready_tq_bp. 793 */ 794 static void 795 xdf_bp_push(xdf_t *vdp, buf_t *bp) 796 { 797 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 798 ASSERT(bp->av_forw == NULL); 799 800 xdf_kstat_enter(vdp, bp); 801 802 if (curthread == vdp->xdf_ready_tq_thread) { 803 /* new IO requests from the ready thread */ 804 ASSERT(vdp->xdf_ready_tq_bp == NULL); 805 vdp->xdf_ready_tq_bp = bp; 806 return; 807 } 808 809 /* this is normal IO request */ 810 ASSERT(bp != vdp->xdf_ready_tq_bp); 811 812 if (vdp->xdf_f_act == NULL) { 813 /* this is only only IO on the active queue */ 814 ASSERT(vdp->xdf_l_act == NULL); 815 ASSERT(vdp->xdf_i_act == NULL); 816 vdp->xdf_f_act = vdp->xdf_l_act = vdp->xdf_i_act = bp; 817 return; 818 } 819 820 /* add this IO to the tail of the active queue */ 821 vdp->xdf_l_act->av_forw = bp; 822 vdp->xdf_l_act = bp; 823 if (vdp->xdf_i_act == NULL) 824 vdp->xdf_i_act = bp; 825 } 826 827 static void 828 xdf_bp_pop(xdf_t *vdp, buf_t *bp) 829 { 830 buf_t *bp_iter; 831 832 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 833 ASSERT(VREQ_DONE(BP_VREQ(bp))); 834 835 if (vdp->xdf_ready_tq_bp == bp) { 836 /* we're done with a ready thread IO request */ 837 ASSERT(bp->av_forw == NULL); 838 vdp->xdf_ready_tq_bp = NULL; 839 return; 840 } 841 842 /* we're done with a normal IO request */ 843 ASSERT((bp->av_forw != NULL) || (bp == vdp->xdf_l_act)); 844 ASSERT((bp->av_forw == NULL) || (bp != vdp->xdf_l_act)); 845 ASSERT(VREQ_DONE(BP_VREQ(vdp->xdf_f_act))); 846 ASSERT(vdp->xdf_f_act != vdp->xdf_i_act); 847 848 if (bp == vdp->xdf_f_act) { 849 /* This IO was at the head of our active queue. */ 850 vdp->xdf_f_act = bp->av_forw; 851 if (bp == vdp->xdf_l_act) 852 vdp->xdf_l_act = NULL; 853 } else { 854 /* There IO finished before some other pending IOs. */ 855 bp_iter = vdp->xdf_f_act; 856 while (bp != bp_iter->av_forw) { 857 bp_iter = bp_iter->av_forw; 858 ASSERT(VREQ_DONE(BP_VREQ(bp_iter))); 859 ASSERT(bp_iter != vdp->xdf_i_act); 860 } 861 bp_iter->av_forw = bp->av_forw; 862 if (bp == vdp->xdf_l_act) 863 vdp->xdf_l_act = bp_iter; 864 } 865 bp->av_forw = NULL; 866 } 867 868 static buf_t * 869 xdf_bp_next(xdf_t *vdp) 870 { 871 v_req_t *vreq; 872 buf_t *bp; 873 874 if (vdp->xdf_state == XD_CONNECTED) { 875 /* 876 * If we're in the XD_CONNECTED state, we only service IOs 877 * from the xdf_ready_tq_thread thread. 878 */ 879 if ((bp = vdp->xdf_ready_tq_bp) == NULL) 880 return (NULL); 881 if (((vreq = BP_VREQ(bp)) == NULL) || (!VREQ_DONE(vreq))) 882 return (bp); 883 return (NULL); 884 } 885 886 /* if we're not in the XD_CONNECTED or XD_READY state we can't do IO */ 887 if (vdp->xdf_state != XD_READY) 888 return (NULL); 889 890 ASSERT(vdp->xdf_ready_tq_bp == NULL); 891 for (;;) { 892 if ((bp = vdp->xdf_i_act) == NULL) 893 return (NULL); 894 if (((vreq = BP_VREQ(bp)) == NULL) || (!VREQ_DONE(vreq))) 895 return (bp); 896 897 /* advance the active buf index pointer */ 898 vdp->xdf_i_act = bp->av_forw; 899 } 900 } 901 902 static void 903 xdf_io_fini(xdf_t *vdp, uint64_t id, int bioerr) 904 { 905 ge_slot_t *gs = (ge_slot_t *)(uintptr_t)id; 906 v_req_t *vreq = gs->gs_vreq; 907 buf_t *bp = vreq->v_buf; 908 909 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 910 ASSERT(BP_VREQ(bp) == vreq); 911 912 gs_free(gs); 913 914 if (bioerr != 0) 915 bioerror(bp, bioerr); 916 ASSERT(vreq->v_nslots > 0); 917 if (--vreq->v_nslots > 0) 918 return; 919 920 /* remove this IO from our active queue */ 921 xdf_bp_pop(vdp, bp); 922 923 ASSERT(vreq->v_runq); 924 xdf_kstat_exit(vdp, bp); 925 vreq->v_runq = B_FALSE; 926 vreq_free(vdp, vreq); 927 928 if (IS_ERROR(bp)) { 929 xdf_io_err(bp, geterror(bp), 0); 930 } else if (bp->b_resid != 0) { 931 /* Partial transfers are an error */ 932 xdf_io_err(bp, EIO, bp->b_resid); 933 } else { 934 biodone(bp); 935 } 936 } 937 938 /* 939 * xdf interrupt handler 940 */ 941 static uint_t 942 xdf_intr_locked(xdf_t *vdp) 943 { 944 xendev_ring_t *xbr; 945 blkif_response_t *resp; 946 int bioerr; 947 uint64_t id; 948 uint8_t op; 949 uint16_t status; 950 ddi_acc_handle_t acchdl; 951 952 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 953 954 if ((xbr = vdp->xdf_xb_ring) == NULL) 955 return (DDI_INTR_UNCLAIMED); 956 957 acchdl = vdp->xdf_xb_ring_hdl; 958 959 /* 960 * complete all requests which have a response 961 */ 962 while (resp = xvdi_ring_get_response(xbr)) { 963 id = ddi_get64(acchdl, &resp->id); 964 op = ddi_get8(acchdl, &resp->operation); 965 status = ddi_get16(acchdl, (uint16_t *)&resp->status); 966 DPRINTF(INTR_DBG, ("resp: op %d id %"PRIu64" status %d\n", 967 op, id, status)); 968 969 if (status != BLKIF_RSP_OKAY) { 970 DPRINTF(IO_DBG, ("xdf@%s: I/O error while %s", 971 vdp->xdf_addr, 972 (op == BLKIF_OP_READ) ? "reading" : "writing")); 973 bioerr = EIO; 974 } else { 975 bioerr = 0; 976 } 977 978 xdf_io_fini(vdp, id, bioerr); 979 } 980 return (DDI_INTR_CLAIMED); 981 } 982 983 /* 984 * xdf_intr runs at PIL 5, so no one else can grab xdf_dev_lk and 985 * block at a lower pil. 986 */ 987 static uint_t 988 xdf_intr(caddr_t arg) 989 { 990 xdf_t *vdp = (xdf_t *)arg; 991 int rv; 992 993 mutex_enter(&vdp->xdf_dev_lk); 994 rv = xdf_intr_locked(vdp); 995 mutex_exit(&vdp->xdf_dev_lk); 996 997 if (!do_polled_io) 998 xdf_io_start(vdp); 999 1000 return (rv); 1001 } 1002 1003 static void 1004 xdf_ring_push(xdf_t *vdp) 1005 { 1006 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1007 1008 if (vdp->xdf_xb_ring == NULL) 1009 return; 1010 1011 if (xvdi_ring_push_request(vdp->xdf_xb_ring)) { 1012 DPRINTF(IO_DBG, ( 1013 "xdf@%s: xdf_ring_push: sent request(s) to backend\n", 1014 vdp->xdf_addr)); 1015 } 1016 1017 if (xvdi_get_evtchn(vdp->xdf_dip) != INVALID_EVTCHN) 1018 xvdi_notify_oe(vdp->xdf_dip); 1019 } 1020 1021 static int 1022 xdf_ring_drain_locked(xdf_t *vdp) 1023 { 1024 int pollc, rv = 0; 1025 1026 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1027 1028 if (xdf_debug & SUSRES_DBG) 1029 xen_printf("xdf_ring_drain: start\n"); 1030 1031 for (pollc = 0; pollc < XDF_DRAIN_RETRY_COUNT; pollc++) { 1032 if (vdp->xdf_xb_ring == NULL) 1033 goto out; 1034 1035 if (xvdi_ring_has_unconsumed_responses(vdp->xdf_xb_ring)) 1036 (void) xdf_intr_locked(vdp); 1037 if (!xvdi_ring_has_incomp_request(vdp->xdf_xb_ring)) 1038 goto out; 1039 xdf_ring_push(vdp); 1040 1041 /* file-backed devices can be slow */ 1042 mutex_exit(&vdp->xdf_dev_lk); 1043 #ifdef XPV_HVM_DRIVER 1044 (void) HYPERVISOR_yield(); 1045 #endif /* XPV_HVM_DRIVER */ 1046 delay(drv_usectohz(XDF_DRAIN_MSEC_DELAY)); 1047 mutex_enter(&vdp->xdf_dev_lk); 1048 } 1049 cmn_err(CE_WARN, "xdf@%s: xdf_ring_drain: timeout", vdp->xdf_addr); 1050 1051 out: 1052 if (vdp->xdf_xb_ring != NULL) { 1053 if (xvdi_ring_has_incomp_request(vdp->xdf_xb_ring) || 1054 xvdi_ring_has_unconsumed_responses(vdp->xdf_xb_ring)) 1055 rv = EIO; 1056 } 1057 if (xdf_debug & SUSRES_DBG) 1058 xen_printf("xdf@%s: xdf_ring_drain: end, err=%d\n", 1059 vdp->xdf_addr, rv); 1060 return (rv); 1061 } 1062 1063 static int 1064 xdf_ring_drain(xdf_t *vdp) 1065 { 1066 int rv; 1067 mutex_enter(&vdp->xdf_dev_lk); 1068 rv = xdf_ring_drain_locked(vdp); 1069 mutex_exit(&vdp->xdf_dev_lk); 1070 return (rv); 1071 } 1072 1073 /* 1074 * Destroy all v_req_t, grant table entries, and our ring buffer. 1075 */ 1076 static void 1077 xdf_ring_destroy(xdf_t *vdp) 1078 { 1079 v_req_t *vreq; 1080 buf_t *bp; 1081 ge_slot_t *gs; 1082 1083 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1084 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1085 1086 if ((vdp->xdf_state != XD_INIT) && 1087 (vdp->xdf_state != XD_CONNECTED) && 1088 (vdp->xdf_state != XD_READY)) { 1089 ASSERT(vdp->xdf_xb_ring == NULL); 1090 ASSERT(vdp->xdf_xb_ring_hdl == NULL); 1091 ASSERT(vdp->xdf_peer == INVALID_DOMID); 1092 ASSERT(vdp->xdf_evtchn == INVALID_EVTCHN); 1093 ASSERT(list_is_empty(&vdp->xdf_vreq_act)); 1094 return; 1095 } 1096 1097 /* 1098 * We don't want to recieve async notifications from the backend 1099 * when it finishes processing ring entries. 1100 */ 1101 #ifdef XPV_HVM_DRIVER 1102 ec_unbind_evtchn(vdp->xdf_evtchn); 1103 #else /* !XPV_HVM_DRIVER */ 1104 (void) ddi_remove_intr(vdp->xdf_dip, 0, NULL); 1105 #endif /* !XPV_HVM_DRIVER */ 1106 1107 /* 1108 * Drain any requests in the ring. We need to do this before we 1109 * can free grant table entries, because if active ring entries 1110 * point to grants, then the backend could be trying to access 1111 * those grants. 1112 */ 1113 (void) xdf_ring_drain_locked(vdp); 1114 1115 /* We're done talking to the backend so free up our event channel */ 1116 xvdi_free_evtchn(vdp->xdf_dip); 1117 vdp->xdf_evtchn = INVALID_EVTCHN; 1118 1119 while ((vreq = list_head(&vdp->xdf_vreq_act)) != NULL) { 1120 bp = vreq->v_buf; 1121 ASSERT(BP_VREQ(bp) == vreq); 1122 1123 /* Free up any grant table entries associaed with this IO */ 1124 while ((gs = list_head(&vreq->v_gs)) != NULL) 1125 gs_free(gs); 1126 1127 /* If this IO was on the runq, move it back to the waitq. */ 1128 if (vreq->v_runq) 1129 xdf_kstat_runq_to_waitq(vdp, bp); 1130 1131 /* 1132 * Reset any buf IO state since we're going to re-issue the 1133 * IO when we reconnect. 1134 */ 1135 vreq_free(vdp, vreq); 1136 BP_VREQ_SET(bp, NULL); 1137 bioerror(bp, 0); 1138 } 1139 1140 /* reset the active queue index pointer */ 1141 vdp->xdf_i_act = vdp->xdf_f_act; 1142 1143 /* Destroy the ring */ 1144 xvdi_free_ring(vdp->xdf_xb_ring); 1145 vdp->xdf_xb_ring = NULL; 1146 vdp->xdf_xb_ring_hdl = NULL; 1147 vdp->xdf_peer = INVALID_DOMID; 1148 } 1149 1150 void 1151 xdfmin(struct buf *bp) 1152 { 1153 if (bp->b_bcount > xdf_maxphys) 1154 bp->b_bcount = xdf_maxphys; 1155 } 1156 1157 /* 1158 * Check if we have a pending "eject" media request. 1159 */ 1160 static int 1161 xdf_eject_pending(xdf_t *vdp) 1162 { 1163 dev_info_t *dip = vdp->xdf_dip; 1164 char *xsname, *str; 1165 1166 if (!vdp->xdf_media_req_supported) 1167 return (B_FALSE); 1168 1169 if (((xsname = xvdi_get_xsname(dip)) == NULL) || 1170 (xenbus_read_str(xsname, XBP_MEDIA_REQ, &str) != 0)) 1171 return (B_FALSE); 1172 1173 if (strcmp(str, XBV_MEDIA_REQ_EJECT) != 0) { 1174 strfree(str); 1175 return (B_FALSE); 1176 } 1177 strfree(str); 1178 return (B_TRUE); 1179 } 1180 1181 /* 1182 * Generate a media request. 1183 */ 1184 static int 1185 xdf_media_req(xdf_t *vdp, char *req, boolean_t media_required) 1186 { 1187 dev_info_t *dip = vdp->xdf_dip; 1188 char *xsname; 1189 1190 /* 1191 * we can't be holding xdf_dev_lk because xenbus_printf() can 1192 * block while waiting for a PIL 1 interrupt message. this 1193 * would cause a deadlock with xdf_intr() which needs to grab 1194 * xdf_dev_lk as well and runs at PIL 5. 1195 */ 1196 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1197 ASSERT(MUTEX_NOT_HELD(&vdp->xdf_dev_lk)); 1198 1199 if ((xsname = xvdi_get_xsname(dip)) == NULL) 1200 return (ENXIO); 1201 1202 /* Check if we support media requests */ 1203 if (!XD_IS_CD(vdp) || !vdp->xdf_media_req_supported) 1204 return (ENOTTY); 1205 1206 /* If an eject is pending then don't allow any new requests */ 1207 if (xdf_eject_pending(vdp)) 1208 return (ENXIO); 1209 1210 /* Make sure that there is media present */ 1211 if (media_required && (vdp->xdf_xdev_nblocks == 0)) 1212 return (ENXIO); 1213 1214 /* We only allow operations when the device is ready and connected */ 1215 if (vdp->xdf_state != XD_READY) 1216 return (EIO); 1217 1218 if (xenbus_printf(XBT_NULL, xsname, XBP_MEDIA_REQ, "%s", req) != 0) 1219 return (EIO); 1220 1221 return (0); 1222 } 1223 1224 /* 1225 * populate a single blkif_request_t w/ a buf 1226 */ 1227 static void 1228 xdf_process_rreq(xdf_t *vdp, struct buf *bp, blkif_request_t *rreq) 1229 { 1230 grant_ref_t gr; 1231 uint8_t fsect, lsect; 1232 size_t bcnt; 1233 paddr_t dma_addr; 1234 off_t blk_off; 1235 dev_info_t *dip = vdp->xdf_dip; 1236 blkif_vdev_t vdev = xvdi_get_vdevnum(dip); 1237 v_req_t *vreq = BP_VREQ(bp); 1238 uint64_t blkno = vreq->v_blkno; 1239 uint_t ndmacs = vreq->v_ndmacs; 1240 ddi_acc_handle_t acchdl = vdp->xdf_xb_ring_hdl; 1241 int seg = 0; 1242 int isread = IS_READ(bp); 1243 ge_slot_t *gs = list_head(&vreq->v_gs); 1244 1245 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1246 ASSERT(vreq->v_status == VREQ_GS_ALLOCED); 1247 1248 if (isread) 1249 ddi_put8(acchdl, &rreq->operation, BLKIF_OP_READ); 1250 else { 1251 switch (vreq->v_flush_diskcache) { 1252 case FLUSH_DISKCACHE: 1253 ddi_put8(acchdl, &rreq->operation, 1254 BLKIF_OP_FLUSH_DISKCACHE); 1255 ddi_put16(acchdl, &rreq->handle, vdev); 1256 ddi_put64(acchdl, &rreq->id, 1257 (uint64_t)(uintptr_t)(gs)); 1258 ddi_put8(acchdl, &rreq->nr_segments, 0); 1259 vreq->v_status = VREQ_DMAWIN_DONE; 1260 return; 1261 case WRITE_BARRIER: 1262 ddi_put8(acchdl, &rreq->operation, 1263 BLKIF_OP_WRITE_BARRIER); 1264 break; 1265 default: 1266 if (!vdp->xdf_wce) 1267 ddi_put8(acchdl, &rreq->operation, 1268 BLKIF_OP_WRITE_BARRIER); 1269 else 1270 ddi_put8(acchdl, &rreq->operation, 1271 BLKIF_OP_WRITE); 1272 break; 1273 } 1274 } 1275 1276 ddi_put16(acchdl, &rreq->handle, vdev); 1277 ddi_put64(acchdl, &rreq->sector_number, blkno); 1278 ddi_put64(acchdl, &rreq->id, (uint64_t)(uintptr_t)(gs)); 1279 1280 /* 1281 * loop until all segments are populated or no more dma cookie in buf 1282 */ 1283 for (;;) { 1284 /* 1285 * Each segment of a blkif request can transfer up to 1286 * one 4K page of data. 1287 */ 1288 bcnt = vreq->v_dmac.dmac_size; 1289 dma_addr = vreq->v_dmac.dmac_laddress; 1290 blk_off = (uint_t)((paddr_t)XB_SEGOFFSET & dma_addr); 1291 fsect = blk_off >> XB_BSHIFT; 1292 lsect = fsect + (bcnt >> XB_BSHIFT) - 1; 1293 1294 ASSERT(bcnt <= PAGESIZE); 1295 ASSERT((bcnt % XB_BSIZE) == 0); 1296 ASSERT((blk_off & XB_BMASK) == 0); 1297 ASSERT(fsect < XB_MAX_SEGLEN / XB_BSIZE && 1298 lsect < XB_MAX_SEGLEN / XB_BSIZE); 1299 1300 gr = gs_grant(gs, PATOMA(dma_addr) >> PAGESHIFT); 1301 ddi_put32(acchdl, &rreq->seg[seg].gref, gr); 1302 ddi_put8(acchdl, &rreq->seg[seg].first_sect, fsect); 1303 ddi_put8(acchdl, &rreq->seg[seg].last_sect, lsect); 1304 1305 DPRINTF(IO_DBG, ( 1306 "xdf@%s: seg%d: dmacS %lu blk_off %ld\n", 1307 vdp->xdf_addr, seg, vreq->v_dmac.dmac_size, blk_off)); 1308 DPRINTF(IO_DBG, ( 1309 "xdf@%s: seg%d: fs %d ls %d gr %d dma 0x%"PRIx64"\n", 1310 vdp->xdf_addr, seg, fsect, lsect, gr, dma_addr)); 1311 1312 blkno += (bcnt >> XB_BSHIFT); 1313 seg++; 1314 ASSERT(seg <= BLKIF_MAX_SEGMENTS_PER_REQUEST); 1315 if (--ndmacs) { 1316 ddi_dma_nextcookie(vreq->v_dmahdl, &vreq->v_dmac); 1317 continue; 1318 } 1319 1320 vreq->v_status = VREQ_DMAWIN_DONE; 1321 vreq->v_blkno = blkno; 1322 break; 1323 } 1324 ddi_put8(acchdl, &rreq->nr_segments, seg); 1325 DPRINTF(IO_DBG, ( 1326 "xdf@%s: xdf_process_rreq: request id=%"PRIx64" ready\n", 1327 vdp->xdf_addr, rreq->id)); 1328 } 1329 1330 static void 1331 xdf_io_start(xdf_t *vdp) 1332 { 1333 struct buf *bp; 1334 v_req_t *vreq; 1335 blkif_request_t *rreq; 1336 boolean_t rreqready = B_FALSE; 1337 1338 mutex_enter(&vdp->xdf_dev_lk); 1339 1340 /* 1341 * Populate the ring request(s). Loop until there is no buf to 1342 * transfer or no free slot available in I/O ring. 1343 */ 1344 for (;;) { 1345 /* don't start any new IO if we're suspending */ 1346 if (vdp->xdf_suspending) 1347 break; 1348 if ((bp = xdf_bp_next(vdp)) == NULL) 1349 break; 1350 1351 /* if the buf doesn't already have a vreq, allocate one */ 1352 if (((vreq = BP_VREQ(bp)) == NULL) && 1353 ((vreq = vreq_get(vdp, bp)) == NULL)) 1354 break; 1355 1356 /* alloc DMA/GTE resources */ 1357 if (vreq_setup(vdp, vreq) != DDI_SUCCESS) 1358 break; 1359 1360 /* get next blkif_request in the ring */ 1361 if ((rreq = xvdi_ring_get_request(vdp->xdf_xb_ring)) == NULL) 1362 break; 1363 bzero(rreq, sizeof (blkif_request_t)); 1364 rreqready = B_TRUE; 1365 1366 /* populate blkif_request with this buf */ 1367 xdf_process_rreq(vdp, bp, rreq); 1368 1369 /* 1370 * This buffer/vreq pair is has been allocated a ring buffer 1371 * resources, so if it isn't already in our runq, add it. 1372 */ 1373 if (!vreq->v_runq) 1374 xdf_kstat_waitq_to_runq(vdp, bp); 1375 } 1376 1377 /* Send the request(s) to the backend */ 1378 if (rreqready) 1379 xdf_ring_push(vdp); 1380 1381 mutex_exit(&vdp->xdf_dev_lk); 1382 } 1383 1384 1385 /* check if partition is open, -1 - check all partitions on the disk */ 1386 static boolean_t 1387 xdf_isopen(xdf_t *vdp, int partition) 1388 { 1389 int i; 1390 ulong_t parbit; 1391 boolean_t rval = B_FALSE; 1392 1393 ASSERT((partition == -1) || 1394 ((partition >= 0) || (partition < XDF_PEXT))); 1395 1396 if (partition == -1) 1397 parbit = (ulong_t)-1; 1398 else 1399 parbit = 1 << partition; 1400 1401 for (i = 0; i < OTYPCNT; i++) { 1402 if (vdp->xdf_vd_open[i] & parbit) 1403 rval = B_TRUE; 1404 } 1405 1406 return (rval); 1407 } 1408 1409 /* 1410 * The connection should never be closed as long as someone is holding 1411 * us open, there is pending IO, or someone is waiting waiting for a 1412 * connection. 1413 */ 1414 static boolean_t 1415 xdf_busy(xdf_t *vdp) 1416 { 1417 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1418 1419 if ((vdp->xdf_xb_ring != NULL) && 1420 xvdi_ring_has_unconsumed_responses(vdp->xdf_xb_ring)) { 1421 ASSERT(vdp->xdf_state != XD_CLOSED); 1422 return (B_TRUE); 1423 } 1424 1425 if (!list_is_empty(&vdp->xdf_vreq_act) || (vdp->xdf_f_act != NULL)) { 1426 ASSERT(vdp->xdf_state != XD_CLOSED); 1427 return (B_TRUE); 1428 } 1429 1430 if (xdf_isopen(vdp, -1)) { 1431 ASSERT(vdp->xdf_state != XD_CLOSED); 1432 return (B_TRUE); 1433 } 1434 1435 if (vdp->xdf_connect_req > 0) { 1436 ASSERT(vdp->xdf_state != XD_CLOSED); 1437 return (B_TRUE); 1438 } 1439 1440 return (B_FALSE); 1441 } 1442 1443 static void 1444 xdf_set_state(xdf_t *vdp, xdf_state_t new_state) 1445 { 1446 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1447 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1448 DPRINTF(DDI_DBG, ("xdf@%s: state change %d -> %d\n", 1449 vdp->xdf_addr, vdp->xdf_state, new_state)); 1450 vdp->xdf_state = new_state; 1451 cv_broadcast(&vdp->xdf_dev_cv); 1452 } 1453 1454 static void 1455 xdf_disconnect(xdf_t *vdp, xdf_state_t new_state, boolean_t quiet) 1456 { 1457 dev_info_t *dip = vdp->xdf_dip; 1458 boolean_t busy; 1459 1460 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1461 ASSERT(MUTEX_NOT_HELD(&vdp->xdf_dev_lk)); 1462 ASSERT((new_state == XD_UNKNOWN) || (new_state == XD_CLOSED)); 1463 1464 /* Check if we're already there. */ 1465 if (vdp->xdf_state == new_state) 1466 return; 1467 1468 mutex_enter(&vdp->xdf_dev_lk); 1469 busy = xdf_busy(vdp); 1470 1471 /* If we're already closed then there's nothing todo. */ 1472 if (vdp->xdf_state == XD_CLOSED) { 1473 ASSERT(!busy); 1474 xdf_set_state(vdp, new_state); 1475 mutex_exit(&vdp->xdf_dev_lk); 1476 return; 1477 } 1478 1479 #ifdef DEBUG 1480 /* UhOh. Warn the user that something bad has happened. */ 1481 if (!quiet && busy && (vdp->xdf_state == XD_READY) && 1482 (vdp->xdf_xdev_nblocks != 0)) { 1483 cmn_err(CE_WARN, "xdf@%s: disconnected while in use", 1484 vdp->xdf_addr); 1485 } 1486 #endif /* DEBUG */ 1487 1488 xdf_ring_destroy(vdp); 1489 1490 /* If we're busy then we can only go into the unknown state */ 1491 xdf_set_state(vdp, (busy) ? XD_UNKNOWN : new_state); 1492 mutex_exit(&vdp->xdf_dev_lk); 1493 1494 /* if we're closed now, let the other end know */ 1495 if (vdp->xdf_state == XD_CLOSED) 1496 (void) xvdi_switch_state(dip, XBT_NULL, XenbusStateClosed); 1497 } 1498 1499 1500 /* 1501 * Kick-off connect process 1502 * Status should be XD_UNKNOWN or XD_CLOSED 1503 * On success, status will be changed to XD_INIT 1504 * On error, it will be changed to XD_UNKNOWN 1505 */ 1506 static int 1507 xdf_setstate_init(xdf_t *vdp) 1508 { 1509 dev_info_t *dip = vdp->xdf_dip; 1510 xenbus_transaction_t xbt; 1511 grant_ref_t gref; 1512 char *xsname, *str; 1513 int rv; 1514 1515 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1516 ASSERT(MUTEX_NOT_HELD(&vdp->xdf_dev_lk)); 1517 ASSERT((vdp->xdf_state == XD_UNKNOWN) || 1518 (vdp->xdf_state == XD_CLOSED)); 1519 1520 DPRINTF(DDI_DBG, 1521 ("xdf@%s: starting connection process\n", vdp->xdf_addr)); 1522 1523 /* 1524 * If an eject is pending then don't allow a new connection. 1525 * (Only the backend can clear media request eject request.) 1526 */ 1527 if (xdf_eject_pending(vdp)) 1528 return (DDI_FAILURE); 1529 1530 if ((xsname = xvdi_get_xsname(dip)) == NULL) 1531 goto errout; 1532 1533 if ((vdp->xdf_peer = xvdi_get_oeid(dip)) == INVALID_DOMID) 1534 goto errout; 1535 1536 (void) xvdi_switch_state(dip, XBT_NULL, XenbusStateInitialising); 1537 1538 /* 1539 * Sanity check for the existance of the xenbus device-type property. 1540 * This property might not exist if we our xenbus device nodes was 1541 * force destroyed while we were still connected to the backend. 1542 */ 1543 if (xenbus_read_str(xsname, XBP_DEV_TYPE, &str) != 0) 1544 goto errout; 1545 strfree(str); 1546 1547 if (xvdi_alloc_evtchn(dip) != DDI_SUCCESS) 1548 goto errout; 1549 1550 vdp->xdf_evtchn = xvdi_get_evtchn(dip); 1551 #ifdef XPV_HVM_DRIVER 1552 ec_bind_evtchn_to_handler(vdp->xdf_evtchn, IPL_VBD, xdf_intr, vdp); 1553 #else /* !XPV_HVM_DRIVER */ 1554 if (ddi_add_intr(dip, 0, NULL, NULL, xdf_intr, (caddr_t)vdp) != 1555 DDI_SUCCESS) { 1556 cmn_err(CE_WARN, "xdf@%s: xdf_setstate_init: " 1557 "failed to add intr handler", vdp->xdf_addr); 1558 goto errout1; 1559 } 1560 #endif /* !XPV_HVM_DRIVER */ 1561 1562 if (xvdi_alloc_ring(dip, BLKIF_RING_SIZE, 1563 sizeof (union blkif_sring_entry), &gref, &vdp->xdf_xb_ring) != 1564 DDI_SUCCESS) { 1565 cmn_err(CE_WARN, "xdf@%s: failed to alloc comm ring", 1566 vdp->xdf_addr); 1567 goto errout2; 1568 } 1569 vdp->xdf_xb_ring_hdl = vdp->xdf_xb_ring->xr_acc_hdl; /* ugly!! */ 1570 1571 /* 1572 * Write into xenstore the info needed by backend 1573 */ 1574 trans_retry: 1575 if (xenbus_transaction_start(&xbt)) { 1576 cmn_err(CE_WARN, "xdf@%s: failed to start transaction", 1577 vdp->xdf_addr); 1578 xvdi_fatal_error(dip, EIO, "connect transaction init"); 1579 goto fail_trans; 1580 } 1581 1582 /* 1583 * XBP_PROTOCOL is written by the domain builder in the case of PV 1584 * domains. However, it is not written for HVM domains, so let's 1585 * write it here. 1586 */ 1587 if (((rv = xenbus_printf(xbt, xsname, 1588 XBP_MEDIA_REQ, "%s", XBV_MEDIA_REQ_NONE)) != 0) || 1589 ((rv = xenbus_printf(xbt, xsname, 1590 XBP_RING_REF, "%u", gref)) != 0) || 1591 ((rv = xenbus_printf(xbt, xsname, 1592 XBP_EVENT_CHAN, "%u", vdp->xdf_evtchn)) != 0) || 1593 ((rv = xenbus_printf(xbt, xsname, 1594 XBP_PROTOCOL, "%s", XEN_IO_PROTO_ABI_NATIVE)) != 0) || 1595 ((rv = xvdi_switch_state(dip, xbt, XenbusStateInitialised)) > 0)) { 1596 (void) xenbus_transaction_end(xbt, 1); 1597 xvdi_fatal_error(dip, rv, "connect transaction setup"); 1598 goto fail_trans; 1599 } 1600 1601 /* kick-off connect process */ 1602 if (rv = xenbus_transaction_end(xbt, 0)) { 1603 if (rv == EAGAIN) 1604 goto trans_retry; 1605 xvdi_fatal_error(dip, rv, "connect transaction commit"); 1606 goto fail_trans; 1607 } 1608 1609 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1610 mutex_enter(&vdp->xdf_dev_lk); 1611 xdf_set_state(vdp, XD_INIT); 1612 mutex_exit(&vdp->xdf_dev_lk); 1613 1614 return (DDI_SUCCESS); 1615 1616 fail_trans: 1617 xvdi_free_ring(vdp->xdf_xb_ring); 1618 errout2: 1619 #ifdef XPV_HVM_DRIVER 1620 ec_unbind_evtchn(vdp->xdf_evtchn); 1621 #else /* !XPV_HVM_DRIVER */ 1622 (void) ddi_remove_intr(vdp->xdf_dip, 0, NULL); 1623 #endif /* !XPV_HVM_DRIVER */ 1624 errout1: 1625 xvdi_free_evtchn(dip); 1626 vdp->xdf_evtchn = INVALID_EVTCHN; 1627 errout: 1628 xdf_disconnect(vdp, XD_UNKNOWN, B_FALSE); 1629 cmn_err(CE_WARN, "xdf@%s: failed to start connection to backend", 1630 vdp->xdf_addr); 1631 return (DDI_FAILURE); 1632 } 1633 1634 int 1635 xdf_get_flush_block(xdf_t *vdp) 1636 { 1637 /* 1638 * Get a DEV_BSIZE aligned bufer 1639 */ 1640 vdp->xdf_flush_mem = kmem_alloc(vdp->xdf_xdev_secsize * 2, KM_SLEEP); 1641 vdp->xdf_cache_flush_block = 1642 (char *)P2ROUNDUP((uintptr_t)(vdp->xdf_flush_mem), 1643 (int)vdp->xdf_xdev_secsize); 1644 1645 if (xdf_lb_rdwr(vdp->xdf_dip, TG_READ, vdp->xdf_cache_flush_block, 1646 xdf_flush_block, vdp->xdf_xdev_secsize, NULL) != 0) 1647 return (DDI_FAILURE); 1648 return (DDI_SUCCESS); 1649 } 1650 1651 static void 1652 xdf_setstate_ready(void *arg) 1653 { 1654 xdf_t *vdp = (xdf_t *)arg; 1655 1656 vdp->xdf_ready_tq_thread = curthread; 1657 1658 /* 1659 * We've created all the minor nodes via cmlb_attach() using default 1660 * value in xdf_attach() to make it possible to block in xdf_open(), 1661 * in case there's anyone (say, booting thread) ever trying to open 1662 * it before connected to backend. We will refresh all those minor 1663 * nodes w/ latest info we've got now when we are almost connected. 1664 */ 1665 mutex_enter(&vdp->xdf_dev_lk); 1666 if (vdp->xdf_cmbl_reattach) { 1667 vdp->xdf_cmbl_reattach = B_FALSE; 1668 1669 mutex_exit(&vdp->xdf_dev_lk); 1670 if (xdf_cmlb_attach(vdp) != 0) { 1671 xdf_disconnect(vdp, XD_UNKNOWN, B_FALSE); 1672 return; 1673 } 1674 mutex_enter(&vdp->xdf_dev_lk); 1675 } 1676 1677 /* If we're not still trying to get to the ready state, then bail. */ 1678 if (vdp->xdf_state != XD_CONNECTED) { 1679 mutex_exit(&vdp->xdf_dev_lk); 1680 return; 1681 } 1682 mutex_exit(&vdp->xdf_dev_lk); 1683 1684 /* 1685 * If backend has feature-barrier, see if it supports disk 1686 * cache flush op. 1687 */ 1688 vdp->xdf_flush_supported = B_FALSE; 1689 if (vdp->xdf_feature_barrier) { 1690 /* 1691 * Pretend we already know flush is supported so probe 1692 * will attempt the correct op. 1693 */ 1694 vdp->xdf_flush_supported = B_TRUE; 1695 if (xdf_lb_rdwr(vdp->xdf_dip, TG_WRITE, NULL, 0, 0, 0) == 0) { 1696 vdp->xdf_flush_supported = B_TRUE; 1697 } else { 1698 vdp->xdf_flush_supported = B_FALSE; 1699 /* 1700 * If the other end does not support the cache flush op 1701 * then we must use a barrier-write to force disk 1702 * cache flushing. Barrier writes require that a data 1703 * block actually be written. 1704 * Cache a block to barrier-write when we are 1705 * asked to perform a flush. 1706 * XXX - would it be better to just copy 1 block 1707 * (512 bytes) from whatever write we did last 1708 * and rewrite that block? 1709 */ 1710 if (xdf_get_flush_block(vdp) != DDI_SUCCESS) { 1711 xdf_disconnect(vdp, XD_UNKNOWN, B_FALSE); 1712 return; 1713 } 1714 } 1715 } 1716 1717 mutex_enter(&vdp->xdf_cb_lk); 1718 mutex_enter(&vdp->xdf_dev_lk); 1719 if (vdp->xdf_state == XD_CONNECTED) 1720 xdf_set_state(vdp, XD_READY); 1721 mutex_exit(&vdp->xdf_dev_lk); 1722 1723 /* Restart any currently queued up io */ 1724 xdf_io_start(vdp); 1725 1726 mutex_exit(&vdp->xdf_cb_lk); 1727 } 1728 1729 /* 1730 * synthetic geometry 1731 */ 1732 #define XDF_NSECTS 256 1733 #define XDF_NHEADS 16 1734 1735 static void 1736 xdf_synthetic_pgeom(dev_info_t *dip, cmlb_geom_t *geomp) 1737 { 1738 xdf_t *vdp; 1739 uint_t ncyl; 1740 1741 vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip)); 1742 1743 ncyl = vdp->xdf_xdev_nblocks / (XDF_NHEADS * XDF_NSECTS); 1744 1745 bzero(geomp, sizeof (*geomp)); 1746 geomp->g_ncyl = ncyl == 0 ? 1 : ncyl; 1747 geomp->g_acyl = 0; 1748 geomp->g_nhead = XDF_NHEADS; 1749 geomp->g_nsect = XDF_NSECTS; 1750 geomp->g_secsize = vdp->xdf_xdev_secsize; 1751 geomp->g_capacity = vdp->xdf_xdev_nblocks; 1752 geomp->g_intrlv = 0; 1753 geomp->g_rpm = 7200; 1754 } 1755 1756 /* 1757 * Finish other initialization after we've connected to backend 1758 * Status should be XD_INIT before calling this routine 1759 * On success, status should be changed to XD_CONNECTED. 1760 * On error, status should stay XD_INIT 1761 */ 1762 static int 1763 xdf_setstate_connected(xdf_t *vdp) 1764 { 1765 dev_info_t *dip = vdp->xdf_dip; 1766 cmlb_geom_t pgeom; 1767 diskaddr_t nblocks = 0; 1768 uint_t secsize = 0; 1769 char *oename, *xsname, *str; 1770 uint_t dinfo; 1771 1772 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1773 ASSERT(MUTEX_NOT_HELD(&vdp->xdf_dev_lk)); 1774 ASSERT(vdp->xdf_state == XD_INIT); 1775 1776 if (((xsname = xvdi_get_xsname(dip)) == NULL) || 1777 ((oename = xvdi_get_oename(dip)) == NULL)) 1778 return (DDI_FAILURE); 1779 1780 /* Make sure the other end is XenbusStateConnected */ 1781 if (xenbus_read_driver_state(oename) != XenbusStateConnected) 1782 return (DDI_FAILURE); 1783 1784 /* Determine if feature barrier is supported by backend */ 1785 if (!(vdp->xdf_feature_barrier = xenbus_exists(oename, XBP_FB))) 1786 cmn_err(CE_NOTE, "!xdf@%s: feature-barrier not supported", 1787 vdp->xdf_addr); 1788 1789 /* 1790 * Probe backend. Read the device size into xdf_xdev_nblocks 1791 * and set the VDISK_READONLY, VDISK_CDROM, and VDISK_REMOVABLE 1792 * flags in xdf_dinfo. If the emulated device type is "cdrom", 1793 * we always set VDISK_CDROM, regardless of if it's present in 1794 * the xenbus info parameter. 1795 */ 1796 if (xenbus_gather(XBT_NULL, oename, 1797 XBP_SECTORS, "%"SCNu64, &nblocks, 1798 XBP_SECTOR_SIZE, "%u", &secsize, 1799 XBP_INFO, "%u", &dinfo, 1800 NULL) != 0) { 1801 cmn_err(CE_WARN, "xdf@%s: xdf_setstate_connected: " 1802 "cannot read backend info", vdp->xdf_addr); 1803 return (DDI_FAILURE); 1804 } 1805 if (xenbus_read_str(xsname, XBP_DEV_TYPE, &str) != 0) { 1806 cmn_err(CE_WARN, "xdf@%s: cannot read device-type", 1807 vdp->xdf_addr); 1808 return (DDI_FAILURE); 1809 } 1810 if (strcmp(str, XBV_DEV_TYPE_CD) == 0) 1811 dinfo |= VDISK_CDROM; 1812 strfree(str); 1813 1814 if (secsize == 0 || !(ISP2(secsize / DEV_BSIZE))) 1815 secsize = DEV_BSIZE; 1816 vdp->xdf_xdev_nblocks = nblocks; 1817 vdp->xdf_xdev_secsize = secsize; 1818 #ifdef _ILP32 1819 if (vdp->xdf_xdev_nblocks > DK_MAX_BLOCKS) { 1820 cmn_err(CE_WARN, "xdf@%s: xdf_setstate_connected: " 1821 "backend disk device too large with %llu blocks for" 1822 " 32-bit kernel", vdp->xdf_addr, vdp->xdf_xdev_nblocks); 1823 xvdi_fatal_error(dip, EFBIG, "reading backend info"); 1824 return (DDI_FAILURE); 1825 } 1826 #endif 1827 1828 /* 1829 * If the physical geometry for a fixed disk has been explicity 1830 * set then make sure that the specified physical geometry isn't 1831 * larger than the device we connected to. 1832 */ 1833 if (vdp->xdf_pgeom_fixed && 1834 (vdp->xdf_pgeom.g_capacity > vdp->xdf_xdev_nblocks)) { 1835 cmn_err(CE_WARN, 1836 "xdf@%s: connect failed, fixed geometry too large", 1837 vdp->xdf_addr); 1838 return (DDI_FAILURE); 1839 } 1840 1841 vdp->xdf_media_req_supported = xenbus_exists(oename, XBP_MEDIA_REQ_SUP); 1842 1843 /* mark vbd is ready for I/O */ 1844 mutex_enter(&vdp->xdf_dev_lk); 1845 xdf_set_state(vdp, XD_CONNECTED); 1846 1847 /* check if the cmlb label should be updated */ 1848 xdf_synthetic_pgeom(dip, &pgeom); 1849 if ((vdp->xdf_dinfo != dinfo) || 1850 (!vdp->xdf_pgeom_fixed && 1851 (memcmp(&vdp->xdf_pgeom, &pgeom, sizeof (pgeom)) != 0))) { 1852 vdp->xdf_cmbl_reattach = B_TRUE; 1853 1854 vdp->xdf_dinfo = dinfo; 1855 if (!vdp->xdf_pgeom_fixed) 1856 vdp->xdf_pgeom = pgeom; 1857 } 1858 1859 if (XD_IS_CD(vdp) || XD_IS_RM(vdp)) { 1860 if (vdp->xdf_xdev_nblocks == 0) { 1861 vdp->xdf_mstate = DKIO_EJECTED; 1862 cv_broadcast(&vdp->xdf_mstate_cv); 1863 } else { 1864 vdp->xdf_mstate = DKIO_INSERTED; 1865 cv_broadcast(&vdp->xdf_mstate_cv); 1866 } 1867 } else { 1868 if (vdp->xdf_mstate != DKIO_NONE) { 1869 vdp->xdf_mstate = DKIO_NONE; 1870 cv_broadcast(&vdp->xdf_mstate_cv); 1871 } 1872 } 1873 1874 mutex_exit(&vdp->xdf_dev_lk); 1875 1876 cmn_err(CE_CONT, "?xdf@%s: %"PRIu64" blocks", vdp->xdf_addr, 1877 (uint64_t)vdp->xdf_xdev_nblocks); 1878 1879 /* Restart any currently queued up io */ 1880 xdf_io_start(vdp); 1881 1882 /* 1883 * To get to the ready state we have to do IO to the backend device, 1884 * but we can't initiate IO from the other end change callback thread 1885 * (which is the current context we're executing in.) This is because 1886 * if the other end disconnects while we're doing IO from the callback 1887 * thread, then we can't recieve that disconnect event and we hang 1888 * waiting for an IO that can never complete. 1889 */ 1890 (void) ddi_taskq_dispatch(vdp->xdf_ready_tq, xdf_setstate_ready, vdp, 1891 DDI_SLEEP); 1892 1893 (void) xvdi_switch_state(dip, XBT_NULL, XenbusStateConnected); 1894 return (DDI_SUCCESS); 1895 } 1896 1897 /*ARGSUSED*/ 1898 static void 1899 xdf_oe_change(dev_info_t *dip, ddi_eventcookie_t id, void *arg, void *impl_data) 1900 { 1901 XenbusState new_state = *(XenbusState *)impl_data; 1902 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 1903 1904 DPRINTF(DDI_DBG, ("xdf@%s: otherend state change to %d!\n", 1905 vdp->xdf_addr, new_state)); 1906 1907 mutex_enter(&vdp->xdf_cb_lk); 1908 1909 /* We assume that this callback is single threaded */ 1910 ASSERT(vdp->xdf_oe_change_thread == NULL); 1911 DEBUG_EVAL(vdp->xdf_oe_change_thread = curthread); 1912 1913 /* ignore any backend state changes if we're suspending/suspended */ 1914 if (vdp->xdf_suspending || (vdp->xdf_state == XD_SUSPEND)) { 1915 DEBUG_EVAL(vdp->xdf_oe_change_thread = NULL); 1916 mutex_exit(&vdp->xdf_cb_lk); 1917 return; 1918 } 1919 1920 switch (new_state) { 1921 case XenbusStateUnknown: 1922 case XenbusStateInitialising: 1923 case XenbusStateInitWait: 1924 case XenbusStateInitialised: 1925 if (vdp->xdf_state == XD_INIT) 1926 break; 1927 1928 xdf_disconnect(vdp, XD_UNKNOWN, B_FALSE); 1929 if (xdf_setstate_init(vdp) != DDI_SUCCESS) 1930 break; 1931 ASSERT(vdp->xdf_state == XD_INIT); 1932 break; 1933 1934 case XenbusStateConnected: 1935 if ((vdp->xdf_state == XD_CONNECTED) || 1936 (vdp->xdf_state == XD_READY)) 1937 break; 1938 1939 if (vdp->xdf_state != XD_INIT) { 1940 xdf_disconnect(vdp, XD_UNKNOWN, B_FALSE); 1941 if (xdf_setstate_init(vdp) != DDI_SUCCESS) 1942 break; 1943 ASSERT(vdp->xdf_state == XD_INIT); 1944 } 1945 1946 if (xdf_setstate_connected(vdp) != DDI_SUCCESS) { 1947 xdf_disconnect(vdp, XD_UNKNOWN, B_FALSE); 1948 break; 1949 } 1950 ASSERT(vdp->xdf_state == XD_CONNECTED); 1951 break; 1952 1953 case XenbusStateClosing: 1954 if (xdf_isopen(vdp, -1)) { 1955 cmn_err(CE_NOTE, 1956 "xdf@%s: hot-unplug failed, still in use", 1957 vdp->xdf_addr); 1958 break; 1959 } 1960 /*FALLTHROUGH*/ 1961 case XenbusStateClosed: 1962 xdf_disconnect(vdp, XD_CLOSED, B_FALSE); 1963 break; 1964 } 1965 1966 /* notify anybody waiting for oe state change */ 1967 cv_broadcast(&vdp->xdf_dev_cv); 1968 DEBUG_EVAL(vdp->xdf_oe_change_thread = NULL); 1969 mutex_exit(&vdp->xdf_cb_lk); 1970 } 1971 1972 static int 1973 xdf_connect_locked(xdf_t *vdp, boolean_t wait) 1974 { 1975 int rv, timeouts = 0, reset = 20; 1976 1977 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 1978 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 1979 1980 /* we can't connect once we're in the closed state */ 1981 if (vdp->xdf_state == XD_CLOSED) 1982 return (XD_CLOSED); 1983 1984 vdp->xdf_connect_req++; 1985 while (vdp->xdf_state != XD_READY) { 1986 mutex_exit(&vdp->xdf_dev_lk); 1987 1988 /* only one thread at a time can be the connection thread */ 1989 if (vdp->xdf_connect_thread == NULL) 1990 vdp->xdf_connect_thread = curthread; 1991 1992 if (vdp->xdf_connect_thread == curthread) { 1993 if ((timeouts > 0) && ((timeouts % reset) == 0)) { 1994 /* 1995 * If we haven't establised a connection 1996 * within the reset time, then disconnect 1997 * so we can try again, and double the reset 1998 * time. The reset time starts at 2 sec. 1999 */ 2000 (void) xdf_disconnect(vdp, XD_UNKNOWN, B_TRUE); 2001 reset *= 2; 2002 } 2003 if (vdp->xdf_state == XD_UNKNOWN) 2004 (void) xdf_setstate_init(vdp); 2005 if (vdp->xdf_state == XD_INIT) 2006 (void) xdf_setstate_connected(vdp); 2007 } 2008 2009 mutex_enter(&vdp->xdf_dev_lk); 2010 if (!wait || (vdp->xdf_state == XD_READY)) 2011 goto out; 2012 2013 mutex_exit((&vdp->xdf_cb_lk)); 2014 if (vdp->xdf_connect_thread != curthread) { 2015 rv = cv_wait_sig(&vdp->xdf_dev_cv, &vdp->xdf_dev_lk); 2016 } else { 2017 /* delay for 0.1 sec */ 2018 rv = cv_reltimedwait_sig(&vdp->xdf_dev_cv, 2019 &vdp->xdf_dev_lk, drv_usectohz(100*1000), 2020 TR_CLOCK_TICK); 2021 if (rv == -1) 2022 timeouts++; 2023 } 2024 mutex_exit((&vdp->xdf_dev_lk)); 2025 mutex_enter((&vdp->xdf_cb_lk)); 2026 mutex_enter((&vdp->xdf_dev_lk)); 2027 if (rv == 0) 2028 goto out; 2029 } 2030 2031 out: 2032 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 2033 ASSERT(MUTEX_HELD(&vdp->xdf_dev_lk)); 2034 2035 if (vdp->xdf_connect_thread == curthread) { 2036 /* 2037 * wake up someone else so they can become the connection 2038 * thread. 2039 */ 2040 cv_signal(&vdp->xdf_dev_cv); 2041 vdp->xdf_connect_thread = NULL; 2042 } 2043 2044 /* Try to lock the media */ 2045 mutex_exit((&vdp->xdf_dev_lk)); 2046 (void) xdf_media_req(vdp, XBV_MEDIA_REQ_LOCK, B_TRUE); 2047 mutex_enter((&vdp->xdf_dev_lk)); 2048 2049 vdp->xdf_connect_req--; 2050 return (vdp->xdf_state); 2051 } 2052 2053 static uint_t 2054 xdf_iorestart(caddr_t arg) 2055 { 2056 xdf_t *vdp = (xdf_t *)arg; 2057 2058 ASSERT(vdp != NULL); 2059 2060 mutex_enter(&vdp->xdf_dev_lk); 2061 ASSERT(ISDMACBON(vdp)); 2062 SETDMACBOFF(vdp); 2063 mutex_exit(&vdp->xdf_dev_lk); 2064 2065 xdf_io_start(vdp); 2066 2067 return (DDI_INTR_CLAIMED); 2068 } 2069 2070 #if defined(XPV_HVM_DRIVER) 2071 2072 typedef struct xdf_hvm_entry { 2073 list_node_t xdf_he_list; 2074 char *xdf_he_path; 2075 dev_info_t *xdf_he_dip; 2076 } xdf_hvm_entry_t; 2077 2078 static list_t xdf_hvm_list; 2079 static kmutex_t xdf_hvm_list_lock; 2080 2081 static xdf_hvm_entry_t * 2082 i_xdf_hvm_find(const char *path, dev_info_t *dip) 2083 { 2084 xdf_hvm_entry_t *i; 2085 2086 ASSERT((path != NULL) || (dip != NULL)); 2087 ASSERT(MUTEX_HELD(&xdf_hvm_list_lock)); 2088 2089 i = list_head(&xdf_hvm_list); 2090 while (i != NULL) { 2091 if ((path != NULL) && strcmp(i->xdf_he_path, path) != 0) { 2092 i = list_next(&xdf_hvm_list, i); 2093 continue; 2094 } 2095 if ((dip != NULL) && (i->xdf_he_dip != dip)) { 2096 i = list_next(&xdf_hvm_list, i); 2097 continue; 2098 } 2099 break; 2100 } 2101 return (i); 2102 } 2103 2104 dev_info_t * 2105 xdf_hvm_hold(const char *path) 2106 { 2107 xdf_hvm_entry_t *i; 2108 dev_info_t *dip; 2109 2110 mutex_enter(&xdf_hvm_list_lock); 2111 i = i_xdf_hvm_find(path, NULL); 2112 if (i == NULL) { 2113 mutex_exit(&xdf_hvm_list_lock); 2114 return (B_FALSE); 2115 } 2116 ndi_hold_devi(dip = i->xdf_he_dip); 2117 mutex_exit(&xdf_hvm_list_lock); 2118 return (dip); 2119 } 2120 2121 static void 2122 xdf_hvm_add(dev_info_t *dip) 2123 { 2124 xdf_hvm_entry_t *i; 2125 char *path; 2126 2127 /* figure out the path for the dip */ 2128 path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); 2129 (void) ddi_pathname(dip, path); 2130 2131 i = kmem_alloc(sizeof (*i), KM_SLEEP); 2132 i->xdf_he_dip = dip; 2133 i->xdf_he_path = i_ddi_strdup(path, KM_SLEEP); 2134 2135 mutex_enter(&xdf_hvm_list_lock); 2136 ASSERT(i_xdf_hvm_find(path, NULL) == NULL); 2137 ASSERT(i_xdf_hvm_find(NULL, dip) == NULL); 2138 list_insert_head(&xdf_hvm_list, i); 2139 mutex_exit(&xdf_hvm_list_lock); 2140 2141 kmem_free(path, MAXPATHLEN); 2142 } 2143 2144 static void 2145 xdf_hvm_rm(dev_info_t *dip) 2146 { 2147 xdf_hvm_entry_t *i; 2148 2149 mutex_enter(&xdf_hvm_list_lock); 2150 VERIFY((i = i_xdf_hvm_find(NULL, dip)) != NULL); 2151 list_remove(&xdf_hvm_list, i); 2152 mutex_exit(&xdf_hvm_list_lock); 2153 2154 kmem_free(i->xdf_he_path, strlen(i->xdf_he_path) + 1); 2155 kmem_free(i, sizeof (*i)); 2156 } 2157 2158 static void 2159 xdf_hvm_init(void) 2160 { 2161 list_create(&xdf_hvm_list, sizeof (xdf_hvm_entry_t), 2162 offsetof(xdf_hvm_entry_t, xdf_he_list)); 2163 mutex_init(&xdf_hvm_list_lock, NULL, MUTEX_DEFAULT, NULL); 2164 } 2165 2166 static void 2167 xdf_hvm_fini(void) 2168 { 2169 ASSERT(list_head(&xdf_hvm_list) == NULL); 2170 list_destroy(&xdf_hvm_list); 2171 mutex_destroy(&xdf_hvm_list_lock); 2172 } 2173 2174 boolean_t 2175 xdf_hvm_connect(dev_info_t *dip) 2176 { 2177 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 2178 char *oename, *str; 2179 int rv; 2180 2181 mutex_enter(&vdp->xdf_cb_lk); 2182 2183 /* 2184 * Before try to establish a connection we need to wait for the 2185 * backend hotplug scripts to have run. Once they are run the 2186 * "<oename>/hotplug-status" property will be set to "connected". 2187 */ 2188 for (;;) { 2189 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 2190 2191 /* 2192 * Get the xenbus path to the backend device. Note that 2193 * we can't cache this path (and we look it up on each pass 2194 * through this loop) because it could change during 2195 * suspend, resume, and migration operations. 2196 */ 2197 if ((oename = xvdi_get_oename(dip)) == NULL) { 2198 mutex_exit(&vdp->xdf_cb_lk); 2199 return (B_FALSE); 2200 } 2201 2202 str = NULL; 2203 if ((xenbus_read_str(oename, XBP_HP_STATUS, &str) == 0) && 2204 (strcmp(str, XBV_HP_STATUS_CONN) == 0)) 2205 break; 2206 2207 if (str != NULL) 2208 strfree(str); 2209 2210 /* wait for an update to "<oename>/hotplug-status" */ 2211 if (cv_wait_sig(&vdp->xdf_hp_status_cv, &vdp->xdf_cb_lk) == 0) { 2212 /* we got interrupted by a signal */ 2213 mutex_exit(&vdp->xdf_cb_lk); 2214 return (B_FALSE); 2215 } 2216 } 2217 2218 /* Good news. The backend hotplug scripts have been run. */ 2219 ASSERT(MUTEX_HELD(&vdp->xdf_cb_lk)); 2220 ASSERT(strcmp(str, XBV_HP_STATUS_CONN) == 0); 2221 strfree(str); 2222 2223 /* 2224 * If we're emulating a cd device and if the backend doesn't support 2225 * media request opreations, then we're not going to bother trying 2226 * to establish a connection for a couple reasons. First off, media 2227 * requests support is required to support operations like eject and 2228 * media locking. Second, other backend platforms like Linux don't 2229 * support hvm pv cdrom access. They don't even have a backend pv 2230 * driver for cdrom device nodes, so we don't want to block forever 2231 * waiting for a connection to a backend driver that doesn't exist. 2232 */ 2233 if (XD_IS_CD(vdp) && !xenbus_exists(oename, XBP_MEDIA_REQ_SUP)) { 2234 mutex_exit(&vdp->xdf_cb_lk); 2235 return (B_FALSE); 2236 } 2237 2238 mutex_enter(&vdp->xdf_dev_lk); 2239 rv = xdf_connect_locked(vdp, B_TRUE); 2240 mutex_exit(&vdp->xdf_dev_lk); 2241 mutex_exit(&vdp->xdf_cb_lk); 2242 2243 return ((rv == XD_READY) ? B_TRUE : B_FALSE); 2244 } 2245 2246 int 2247 xdf_hvm_setpgeom(dev_info_t *dip, cmlb_geom_t *geomp) 2248 { 2249 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 2250 2251 /* sanity check the requested physical geometry */ 2252 mutex_enter(&vdp->xdf_dev_lk); 2253 if ((geomp->g_secsize != XB_BSIZE) || 2254 (geomp->g_capacity == 0)) { 2255 mutex_exit(&vdp->xdf_dev_lk); 2256 return (EINVAL); 2257 } 2258 2259 /* 2260 * If we've already connected to the backend device then make sure 2261 * we're not defining a physical geometry larger than our backend 2262 * device. 2263 */ 2264 if ((vdp->xdf_xdev_nblocks != 0) && 2265 (geomp->g_capacity > vdp->xdf_xdev_nblocks)) { 2266 mutex_exit(&vdp->xdf_dev_lk); 2267 return (EINVAL); 2268 } 2269 2270 bzero(&vdp->xdf_pgeom, sizeof (vdp->xdf_pgeom)); 2271 vdp->xdf_pgeom.g_ncyl = geomp->g_ncyl; 2272 vdp->xdf_pgeom.g_acyl = geomp->g_acyl; 2273 vdp->xdf_pgeom.g_nhead = geomp->g_nhead; 2274 vdp->xdf_pgeom.g_nsect = geomp->g_nsect; 2275 vdp->xdf_pgeom.g_secsize = geomp->g_secsize; 2276 vdp->xdf_pgeom.g_capacity = geomp->g_capacity; 2277 vdp->xdf_pgeom.g_intrlv = geomp->g_intrlv; 2278 vdp->xdf_pgeom.g_rpm = geomp->g_rpm; 2279 2280 vdp->xdf_pgeom_fixed = B_TRUE; 2281 mutex_exit(&vdp->xdf_dev_lk); 2282 2283 /* force a re-validation */ 2284 cmlb_invalidate(vdp->xdf_vd_lbl, NULL); 2285 2286 return (0); 2287 } 2288 2289 boolean_t 2290 xdf_is_cd(dev_info_t *dip) 2291 { 2292 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 2293 boolean_t rv; 2294 2295 mutex_enter(&vdp->xdf_cb_lk); 2296 rv = XD_IS_CD(vdp); 2297 mutex_exit(&vdp->xdf_cb_lk); 2298 return (rv); 2299 } 2300 2301 boolean_t 2302 xdf_is_rm(dev_info_t *dip) 2303 { 2304 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 2305 boolean_t rv; 2306 2307 mutex_enter(&vdp->xdf_cb_lk); 2308 rv = XD_IS_RM(vdp); 2309 mutex_exit(&vdp->xdf_cb_lk); 2310 return (rv); 2311 } 2312 2313 boolean_t 2314 xdf_media_req_supported(dev_info_t *dip) 2315 { 2316 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 2317 boolean_t rv; 2318 2319 mutex_enter(&vdp->xdf_cb_lk); 2320 rv = vdp->xdf_media_req_supported; 2321 mutex_exit(&vdp->xdf_cb_lk); 2322 return (rv); 2323 } 2324 2325 #endif /* XPV_HVM_DRIVER */ 2326 2327 static int 2328 xdf_lb_getcap(dev_info_t *dip, diskaddr_t *capp) 2329 { 2330 xdf_t *vdp; 2331 vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip)); 2332 2333 if (vdp == NULL) 2334 return (ENXIO); 2335 2336 mutex_enter(&vdp->xdf_dev_lk); 2337 *capp = vdp->xdf_pgeom.g_capacity; 2338 DPRINTF(LBL_DBG, ("xdf@%s:capacity %llu\n", vdp->xdf_addr, *capp)); 2339 mutex_exit(&vdp->xdf_dev_lk); 2340 return (0); 2341 } 2342 2343 static int 2344 xdf_lb_getpgeom(dev_info_t *dip, cmlb_geom_t *geomp) 2345 { 2346 xdf_t *vdp; 2347 2348 if ((vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip))) == NULL) 2349 return (ENXIO); 2350 *geomp = vdp->xdf_pgeom; 2351 return (0); 2352 } 2353 2354 /* 2355 * No real HBA, no geometry available from it 2356 */ 2357 /*ARGSUSED*/ 2358 static int 2359 xdf_lb_getvgeom(dev_info_t *dip, cmlb_geom_t *geomp) 2360 { 2361 return (EINVAL); 2362 } 2363 2364 static int 2365 xdf_lb_getattribute(dev_info_t *dip, tg_attribute_t *tgattributep) 2366 { 2367 xdf_t *vdp; 2368 2369 if (!(vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip)))) 2370 return (ENXIO); 2371 2372 if (XD_IS_RO(vdp)) 2373 tgattributep->media_is_writable = 0; 2374 else 2375 tgattributep->media_is_writable = 1; 2376 return (0); 2377 } 2378 2379 /* ARGSUSED3 */ 2380 int 2381 xdf_lb_getinfo(dev_info_t *dip, int cmd, void *arg, void *tg_cookie) 2382 { 2383 int instance; 2384 xdf_t *vdp; 2385 2386 instance = ddi_get_instance(dip); 2387 2388 if ((vdp = ddi_get_soft_state(xdf_ssp, instance)) == NULL) 2389 return (ENXIO); 2390 2391 switch (cmd) { 2392 case TG_GETPHYGEOM: 2393 return (xdf_lb_getpgeom(dip, (cmlb_geom_t *)arg)); 2394 case TG_GETVIRTGEOM: 2395 return (xdf_lb_getvgeom(dip, (cmlb_geom_t *)arg)); 2396 case TG_GETCAPACITY: 2397 return (xdf_lb_getcap(dip, (diskaddr_t *)arg)); 2398 case TG_GETBLOCKSIZE: 2399 mutex_enter(&vdp->xdf_cb_lk); 2400 *(uint32_t *)arg = vdp->xdf_xdev_secsize; 2401 mutex_exit(&vdp->xdf_cb_lk); 2402 return (0); 2403 case TG_GETATTR: 2404 return (xdf_lb_getattribute(dip, (tg_attribute_t *)arg)); 2405 default: 2406 return (ENOTTY); 2407 } 2408 } 2409 2410 /* ARGSUSED5 */ 2411 int 2412 xdf_lb_rdwr(dev_info_t *dip, uchar_t cmd, void *bufp, 2413 diskaddr_t start, size_t reqlen, void *tg_cookie) 2414 { 2415 xdf_t *vdp; 2416 struct buf *bp; 2417 int err = 0; 2418 2419 vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip)); 2420 2421 /* We don't allow IO from the oe_change callback thread */ 2422 ASSERT(curthread != vdp->xdf_oe_change_thread); 2423 2424 if ((start + ((reqlen / (vdp->xdf_xdev_secsize / DEV_BSIZE)) 2425 >> DEV_BSHIFT)) > vdp->xdf_pgeom.g_capacity) 2426 return (EINVAL); 2427 2428 bp = getrbuf(KM_SLEEP); 2429 if (cmd == TG_READ) 2430 bp->b_flags = B_BUSY | B_READ; 2431 else 2432 bp->b_flags = B_BUSY | B_WRITE; 2433 2434 bp->b_un.b_addr = bufp; 2435 bp->b_bcount = reqlen; 2436 bp->b_blkno = start * (vdp->xdf_xdev_secsize / DEV_BSIZE); 2437 bp->b_edev = DDI_DEV_T_NONE; /* don't have dev_t */ 2438 2439 mutex_enter(&vdp->xdf_dev_lk); 2440 xdf_bp_push(vdp, bp); 2441 mutex_exit(&vdp->xdf_dev_lk); 2442 xdf_io_start(vdp); 2443 if (curthread == vdp->xdf_ready_tq_thread) 2444 (void) xdf_ring_drain(vdp); 2445 err = biowait(bp); 2446 ASSERT(bp->b_flags & B_DONE); 2447 freerbuf(bp); 2448 return (err); 2449 } 2450 2451 /* 2452 * Lock the current media. Set the media state to "lock". 2453 * (Media locks are only respected by the backend driver.) 2454 */ 2455 static int 2456 xdf_ioctl_mlock(xdf_t *vdp) 2457 { 2458 int rv; 2459 mutex_enter(&vdp->xdf_cb_lk); 2460 rv = xdf_media_req(vdp, XBV_MEDIA_REQ_LOCK, B_TRUE); 2461 mutex_exit(&vdp->xdf_cb_lk); 2462 return (rv); 2463 } 2464 2465 /* 2466 * Release a media lock. Set the media state to "none". 2467 */ 2468 static int 2469 xdf_ioctl_munlock(xdf_t *vdp) 2470 { 2471 int rv; 2472 mutex_enter(&vdp->xdf_cb_lk); 2473 rv = xdf_media_req(vdp, XBV_MEDIA_REQ_NONE, B_TRUE); 2474 mutex_exit(&vdp->xdf_cb_lk); 2475 return (rv); 2476 } 2477 2478 /* 2479 * Eject the current media. Ignores any media locks. (Media locks 2480 * are only for benifit of the the backend.) 2481 */ 2482 static int 2483 xdf_ioctl_eject(xdf_t *vdp) 2484 { 2485 int rv; 2486 2487 mutex_enter(&vdp->xdf_cb_lk); 2488 if ((rv = xdf_media_req(vdp, XBV_MEDIA_REQ_EJECT, B_FALSE)) != 0) { 2489 mutex_exit(&vdp->xdf_cb_lk); 2490 return (rv); 2491 } 2492 2493 /* 2494 * We've set the media requests xenbus parameter to eject, so now 2495 * disconnect from the backend, wait for the backend to clear 2496 * the media requets xenbus paramter, and then we can reconnect 2497 * to the backend. 2498 */ 2499 (void) xdf_disconnect(vdp, XD_UNKNOWN, B_TRUE); 2500 mutex_enter(&vdp->xdf_dev_lk); 2501 if (xdf_connect_locked(vdp, B_TRUE) != XD_READY) { 2502 mutex_exit(&vdp->xdf_dev_lk); 2503 mutex_exit(&vdp->xdf_cb_lk); 2504 return (EIO); 2505 } 2506 mutex_exit(&vdp->xdf_dev_lk); 2507 mutex_exit(&vdp->xdf_cb_lk); 2508 return (0); 2509 } 2510 2511 /* 2512 * Watch for media state changes. This can be an insertion of a device 2513 * (triggered by a 'xm block-configure' request in another domain) or 2514 * the ejection of a device (triggered by a local "eject" operation). 2515 * For a full description of the DKIOCSTATE ioctl behavior see dkio(7I). 2516 */ 2517 static int 2518 xdf_dkstate(xdf_t *vdp, enum dkio_state mstate) 2519 { 2520 enum dkio_state prev_state; 2521 2522 mutex_enter(&vdp->xdf_cb_lk); 2523 prev_state = vdp->xdf_mstate; 2524 2525 if (vdp->xdf_mstate == mstate) { 2526 while (vdp->xdf_mstate == prev_state) { 2527 if (cv_wait_sig(&vdp->xdf_mstate_cv, 2528 &vdp->xdf_cb_lk) == 0) { 2529 mutex_exit(&vdp->xdf_cb_lk); 2530 return (EINTR); 2531 } 2532 } 2533 } 2534 2535 if ((prev_state != DKIO_INSERTED) && 2536 (vdp->xdf_mstate == DKIO_INSERTED)) { 2537 (void) xdf_media_req(vdp, XBV_MEDIA_REQ_LOCK, B_TRUE); 2538 mutex_exit(&vdp->xdf_cb_lk); 2539 return (0); 2540 } 2541 2542 mutex_exit(&vdp->xdf_cb_lk); 2543 return (0); 2544 } 2545 2546 /*ARGSUSED*/ 2547 static int 2548 xdf_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, 2549 int *rvalp) 2550 { 2551 minor_t minor = getminor(dev); 2552 int part = XDF_PART(minor); 2553 xdf_t *vdp; 2554 int rv; 2555 2556 if (((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) || 2557 (!xdf_isopen(vdp, part))) 2558 return (ENXIO); 2559 2560 DPRINTF(IOCTL_DBG, ("xdf@%s:ioctl: cmd %d (0x%x)\n", 2561 vdp->xdf_addr, cmd, cmd)); 2562 2563 switch (cmd) { 2564 default: 2565 return (ENOTTY); 2566 case DKIOCG_PHYGEOM: 2567 case DKIOCG_VIRTGEOM: 2568 case DKIOCGGEOM: 2569 case DKIOCSGEOM: 2570 case DKIOCGAPART: 2571 case DKIOCSAPART: 2572 case DKIOCGVTOC: 2573 case DKIOCSVTOC: 2574 case DKIOCPARTINFO: 2575 case DKIOCGEXTVTOC: 2576 case DKIOCSEXTVTOC: 2577 case DKIOCEXTPARTINFO: 2578 case DKIOCGMBOOT: 2579 case DKIOCSMBOOT: 2580 case DKIOCGETEFI: 2581 case DKIOCSETEFI: 2582 case DKIOCSETEXTPART: 2583 case DKIOCPARTITION: 2584 return (cmlb_ioctl(vdp->xdf_vd_lbl, dev, cmd, arg, mode, credp, 2585 rvalp, NULL)); 2586 case FDEJECT: 2587 case DKIOCEJECT: 2588 case CDROMEJECT: 2589 return (xdf_ioctl_eject(vdp)); 2590 case DKIOCLOCK: 2591 return (xdf_ioctl_mlock(vdp)); 2592 case DKIOCUNLOCK: 2593 return (xdf_ioctl_munlock(vdp)); 2594 case CDROMREADOFFSET: { 2595 int offset = 0; 2596 if (!XD_IS_CD(vdp)) 2597 return (ENOTTY); 2598 if (ddi_copyout(&offset, (void *)arg, sizeof (int), mode)) 2599 return (EFAULT); 2600 return (0); 2601 } 2602 case DKIOCGMEDIAINFO: { 2603 struct dk_minfo media_info; 2604 2605 media_info.dki_lbsize = vdp->xdf_xdev_secsize; 2606 media_info.dki_capacity = vdp->xdf_pgeom.g_capacity; 2607 if (XD_IS_CD(vdp)) 2608 media_info.dki_media_type = DK_CDROM; 2609 else 2610 media_info.dki_media_type = DK_FIXED_DISK; 2611 2612 if (ddi_copyout(&media_info, (void *)arg, 2613 sizeof (struct dk_minfo), mode)) 2614 return (EFAULT); 2615 return (0); 2616 } 2617 case DKIOCINFO: { 2618 struct dk_cinfo info; 2619 2620 /* controller information */ 2621 if (XD_IS_CD(vdp)) 2622 info.dki_ctype = DKC_CDROM; 2623 else 2624 info.dki_ctype = DKC_VBD; 2625 2626 info.dki_cnum = 0; 2627 (void) strncpy((char *)(&info.dki_cname), "xdf", 8); 2628 2629 /* unit information */ 2630 info.dki_unit = ddi_get_instance(vdp->xdf_dip); 2631 (void) strncpy((char *)(&info.dki_dname), "xdf", 8); 2632 info.dki_flags = DKI_FMTVOL; 2633 info.dki_partition = part; 2634 info.dki_maxtransfer = maxphys / DEV_BSIZE; 2635 info.dki_addr = 0; 2636 info.dki_space = 0; 2637 info.dki_prio = 0; 2638 info.dki_vec = 0; 2639 2640 if (ddi_copyout(&info, (void *)arg, sizeof (info), mode)) 2641 return (EFAULT); 2642 return (0); 2643 } 2644 case DKIOCSTATE: { 2645 enum dkio_state mstate; 2646 2647 if (ddi_copyin((void *)arg, &mstate, 2648 sizeof (mstate), mode) != 0) 2649 return (EFAULT); 2650 if ((rv = xdf_dkstate(vdp, mstate)) != 0) 2651 return (rv); 2652 mstate = vdp->xdf_mstate; 2653 if (ddi_copyout(&mstate, (void *)arg, 2654 sizeof (mstate), mode) != 0) 2655 return (EFAULT); 2656 return (0); 2657 } 2658 case DKIOCREMOVABLE: { 2659 int i = BOOLEAN2VOID(XD_IS_RM(vdp)); 2660 if (ddi_copyout(&i, (caddr_t)arg, sizeof (i), mode)) 2661 return (EFAULT); 2662 return (0); 2663 } 2664 case DKIOCGETWCE: { 2665 int i = BOOLEAN2VOID(XD_IS_RM(vdp)); 2666 if (ddi_copyout(&i, (void *)arg, sizeof (i), mode)) 2667 return (EFAULT); 2668 return (0); 2669 } 2670 case DKIOCSETWCE: { 2671 int i; 2672 if (ddi_copyin((void *)arg, &i, sizeof (i), mode)) 2673 return (EFAULT); 2674 vdp->xdf_wce = VOID2BOOLEAN(i); 2675 return (0); 2676 } 2677 case DKIOCFLUSHWRITECACHE: { 2678 struct dk_callback *dkc = (struct dk_callback *)arg; 2679 2680 if (vdp->xdf_flush_supported) { 2681 rv = xdf_lb_rdwr(vdp->xdf_dip, TG_WRITE, 2682 NULL, 0, 0, (void *)dev); 2683 } else if (vdp->xdf_feature_barrier && 2684 !xdf_barrier_flush_disable) { 2685 rv = xdf_lb_rdwr(vdp->xdf_dip, TG_WRITE, 2686 vdp->xdf_cache_flush_block, xdf_flush_block, 2687 vdp->xdf_xdev_secsize, (void *)dev); 2688 } else { 2689 return (ENOTTY); 2690 } 2691 if ((mode & FKIOCTL) && (dkc != NULL) && 2692 (dkc->dkc_callback != NULL)) { 2693 (*dkc->dkc_callback)(dkc->dkc_cookie, rv); 2694 /* need to return 0 after calling callback */ 2695 rv = 0; 2696 } 2697 return (rv); 2698 } 2699 } 2700 /*NOTREACHED*/ 2701 } 2702 2703 static int 2704 xdf_strategy(struct buf *bp) 2705 { 2706 xdf_t *vdp; 2707 minor_t minor; 2708 diskaddr_t p_blkct, p_blkst; 2709 daddr_t blkno; 2710 ulong_t nblks; 2711 int part; 2712 2713 minor = getminor(bp->b_edev); 2714 part = XDF_PART(minor); 2715 vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor)); 2716 2717 mutex_enter(&vdp->xdf_dev_lk); 2718 if (!xdf_isopen(vdp, part)) { 2719 mutex_exit(&vdp->xdf_dev_lk); 2720 xdf_io_err(bp, ENXIO, 0); 2721 return (0); 2722 } 2723 2724 /* We don't allow IO from the oe_change callback thread */ 2725 ASSERT(curthread != vdp->xdf_oe_change_thread); 2726 2727 /* Check for writes to a read only device */ 2728 if (!IS_READ(bp) && XD_IS_RO(vdp)) { 2729 mutex_exit(&vdp->xdf_dev_lk); 2730 xdf_io_err(bp, EROFS, 0); 2731 return (0); 2732 } 2733 2734 /* Check if this I/O is accessing a partition or the entire disk */ 2735 if ((long)bp->b_private == XB_SLICE_NONE) { 2736 /* This I/O is using an absolute offset */ 2737 p_blkct = vdp->xdf_xdev_nblocks; 2738 p_blkst = 0; 2739 } else { 2740 /* This I/O is using a partition relative offset */ 2741 mutex_exit(&vdp->xdf_dev_lk); 2742 if (cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkct, 2743 &p_blkst, NULL, NULL, NULL)) { 2744 xdf_io_err(bp, ENXIO, 0); 2745 return (0); 2746 } 2747 mutex_enter(&vdp->xdf_dev_lk); 2748 } 2749 2750 /* 2751 * Adjust the real blkno and bcount according to the underline 2752 * physical sector size. 2753 */ 2754 blkno = bp->b_blkno / (vdp->xdf_xdev_secsize / XB_BSIZE); 2755 2756 /* check for a starting block beyond the disk or partition limit */ 2757 if (blkno > p_blkct) { 2758 DPRINTF(IO_DBG, ("xdf@%s: block %lld exceeds VBD size %"PRIu64, 2759 vdp->xdf_addr, (longlong_t)blkno, (uint64_t)p_blkct)); 2760 mutex_exit(&vdp->xdf_dev_lk); 2761 xdf_io_err(bp, EINVAL, 0); 2762 return (0); 2763 } 2764 2765 /* Legacy: don't set error flag at this case */ 2766 if (blkno == p_blkct) { 2767 mutex_exit(&vdp->xdf_dev_lk); 2768 bp->b_resid = bp->b_bcount; 2769 biodone(bp); 2770 return (0); 2771 } 2772 2773 /* sanitize the input buf */ 2774 bioerror(bp, 0); 2775 bp->b_resid = 0; 2776 bp->av_back = bp->av_forw = NULL; 2777 2778 /* Adjust for partial transfer, this will result in an error later */ 2779 if (vdp->xdf_xdev_secsize != 0 && 2780 vdp->xdf_xdev_secsize != XB_BSIZE) { 2781 nblks = bp->b_bcount / vdp->xdf_xdev_secsize; 2782 } else { 2783 nblks = bp->b_bcount >> XB_BSHIFT; 2784 } 2785 2786 if ((blkno + nblks) > p_blkct) { 2787 if (vdp->xdf_xdev_secsize != 0 && 2788 vdp->xdf_xdev_secsize != XB_BSIZE) { 2789 bp->b_resid = 2790 ((blkno + nblks) - p_blkct) * 2791 vdp->xdf_xdev_secsize; 2792 } else { 2793 bp->b_resid = 2794 ((blkno + nblks) - p_blkct) << 2795 XB_BSHIFT; 2796 } 2797 bp->b_bcount -= bp->b_resid; 2798 } 2799 2800 DPRINTF(IO_DBG, ("xdf@%s: strategy blk %lld len %lu\n", 2801 vdp->xdf_addr, (longlong_t)blkno, (ulong_t)bp->b_bcount)); 2802 2803 /* Fix up the buf struct */ 2804 bp->b_flags |= B_BUSY; 2805 bp->b_private = (void *)(uintptr_t)p_blkst; 2806 2807 xdf_bp_push(vdp, bp); 2808 mutex_exit(&vdp->xdf_dev_lk); 2809 xdf_io_start(vdp); 2810 if (do_polled_io) 2811 (void) xdf_ring_drain(vdp); 2812 return (0); 2813 } 2814 2815 /*ARGSUSED*/ 2816 static int 2817 xdf_read(dev_t dev, struct uio *uiop, cred_t *credp) 2818 { 2819 xdf_t *vdp; 2820 minor_t minor; 2821 diskaddr_t p_blkcnt; 2822 int part; 2823 2824 minor = getminor(dev); 2825 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 2826 return (ENXIO); 2827 2828 DPRINTF(IO_DBG, ("xdf@%s: read offset 0x%"PRIx64"\n", 2829 vdp->xdf_addr, (int64_t)uiop->uio_offset)); 2830 2831 part = XDF_PART(minor); 2832 if (!xdf_isopen(vdp, part)) 2833 return (ENXIO); 2834 2835 if (cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkcnt, 2836 NULL, NULL, NULL, NULL)) 2837 return (ENXIO); 2838 2839 if (uiop->uio_loffset >= XB_DTOB(p_blkcnt, vdp)) 2840 return (ENOSPC); 2841 2842 if (U_INVAL(uiop)) 2843 return (EINVAL); 2844 2845 return (physio(xdf_strategy, NULL, dev, B_READ, xdfmin, uiop)); 2846 } 2847 2848 /*ARGSUSED*/ 2849 static int 2850 xdf_write(dev_t dev, struct uio *uiop, cred_t *credp) 2851 { 2852 xdf_t *vdp; 2853 minor_t minor; 2854 diskaddr_t p_blkcnt; 2855 int part; 2856 2857 minor = getminor(dev); 2858 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 2859 return (ENXIO); 2860 2861 DPRINTF(IO_DBG, ("xdf@%s: write offset 0x%"PRIx64"\n", 2862 vdp->xdf_addr, (int64_t)uiop->uio_offset)); 2863 2864 part = XDF_PART(minor); 2865 if (!xdf_isopen(vdp, part)) 2866 return (ENXIO); 2867 2868 if (cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkcnt, 2869 NULL, NULL, NULL, NULL)) 2870 return (ENXIO); 2871 2872 if (uiop->uio_loffset >= XB_DTOB(p_blkcnt, vdp)) 2873 return (ENOSPC); 2874 2875 if (U_INVAL(uiop)) 2876 return (EINVAL); 2877 2878 return (physio(xdf_strategy, NULL, dev, B_WRITE, xdfmin, uiop)); 2879 } 2880 2881 /*ARGSUSED*/ 2882 static int 2883 xdf_aread(dev_t dev, struct aio_req *aiop, cred_t *credp) 2884 { 2885 xdf_t *vdp; 2886 minor_t minor; 2887 struct uio *uiop = aiop->aio_uio; 2888 diskaddr_t p_blkcnt; 2889 int part; 2890 2891 minor = getminor(dev); 2892 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 2893 return (ENXIO); 2894 2895 part = XDF_PART(minor); 2896 if (!xdf_isopen(vdp, part)) 2897 return (ENXIO); 2898 2899 if (cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkcnt, 2900 NULL, NULL, NULL, NULL)) 2901 return (ENXIO); 2902 2903 if (uiop->uio_loffset >= XB_DTOB(p_blkcnt, vdp)) 2904 return (ENOSPC); 2905 2906 if (U_INVAL(uiop)) 2907 return (EINVAL); 2908 2909 return (aphysio(xdf_strategy, anocancel, dev, B_READ, xdfmin, aiop)); 2910 } 2911 2912 /*ARGSUSED*/ 2913 static int 2914 xdf_awrite(dev_t dev, struct aio_req *aiop, cred_t *credp) 2915 { 2916 xdf_t *vdp; 2917 minor_t minor; 2918 struct uio *uiop = aiop->aio_uio; 2919 diskaddr_t p_blkcnt; 2920 int part; 2921 2922 minor = getminor(dev); 2923 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 2924 return (ENXIO); 2925 2926 part = XDF_PART(minor); 2927 if (!xdf_isopen(vdp, part)) 2928 return (ENXIO); 2929 2930 if (cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkcnt, 2931 NULL, NULL, NULL, NULL)) 2932 return (ENXIO); 2933 2934 if (uiop->uio_loffset >= XB_DTOB(p_blkcnt, vdp)) 2935 return (ENOSPC); 2936 2937 if (U_INVAL(uiop)) 2938 return (EINVAL); 2939 2940 return (aphysio(xdf_strategy, anocancel, dev, B_WRITE, xdfmin, aiop)); 2941 } 2942 2943 static int 2944 xdf_dump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk) 2945 { 2946 struct buf dumpbuf, *dbp = &dumpbuf; 2947 xdf_t *vdp; 2948 minor_t minor; 2949 int err = 0; 2950 int part; 2951 diskaddr_t p_blkcnt, p_blkst; 2952 2953 minor = getminor(dev); 2954 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 2955 return (ENXIO); 2956 2957 DPRINTF(IO_DBG, ("xdf@%s: dump addr (0x%p) blk (%ld) nblks (%d)\n", 2958 vdp->xdf_addr, (void *)addr, blkno, nblk)); 2959 2960 /* We don't allow IO from the oe_change callback thread */ 2961 ASSERT(curthread != vdp->xdf_oe_change_thread); 2962 2963 part = XDF_PART(minor); 2964 if (!xdf_isopen(vdp, part)) 2965 return (ENXIO); 2966 2967 if (cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkcnt, &p_blkst, 2968 NULL, NULL, NULL)) 2969 return (ENXIO); 2970 2971 if ((blkno + nblk) > 2972 (p_blkcnt * (vdp->xdf_xdev_secsize / XB_BSIZE))) { 2973 cmn_err(CE_WARN, "xdf@%s: block %ld exceeds VBD size %"PRIu64, 2974 vdp->xdf_addr, (daddr_t)((blkno + nblk) / 2975 (vdp->xdf_xdev_secsize / XB_BSIZE)), (uint64_t)p_blkcnt); 2976 return (EINVAL); 2977 } 2978 2979 bioinit(dbp); 2980 dbp->b_flags = B_BUSY; 2981 dbp->b_un.b_addr = addr; 2982 dbp->b_bcount = nblk << DEV_BSHIFT; 2983 dbp->b_blkno = blkno; 2984 dbp->b_edev = dev; 2985 dbp->b_private = (void *)(uintptr_t)p_blkst; 2986 2987 mutex_enter(&vdp->xdf_dev_lk); 2988 xdf_bp_push(vdp, dbp); 2989 mutex_exit(&vdp->xdf_dev_lk); 2990 xdf_io_start(vdp); 2991 err = xdf_ring_drain(vdp); 2992 biofini(dbp); 2993 return (err); 2994 } 2995 2996 /*ARGSUSED*/ 2997 static int 2998 xdf_close(dev_t dev, int flag, int otyp, struct cred *credp) 2999 { 3000 minor_t minor; 3001 xdf_t *vdp; 3002 int part; 3003 ulong_t parbit; 3004 3005 minor = getminor(dev); 3006 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 3007 return (ENXIO); 3008 3009 mutex_enter(&vdp->xdf_dev_lk); 3010 part = XDF_PART(minor); 3011 if (!xdf_isopen(vdp, part)) { 3012 mutex_exit(&vdp->xdf_dev_lk); 3013 return (ENXIO); 3014 } 3015 parbit = 1 << part; 3016 3017 ASSERT((vdp->xdf_vd_open[otyp] & parbit) != 0); 3018 if (otyp == OTYP_LYR) { 3019 ASSERT(vdp->xdf_vd_lyropen[part] > 0); 3020 if (--vdp->xdf_vd_lyropen[part] == 0) 3021 vdp->xdf_vd_open[otyp] &= ~parbit; 3022 } else { 3023 vdp->xdf_vd_open[otyp] &= ~parbit; 3024 } 3025 vdp->xdf_vd_exclopen &= ~parbit; 3026 3027 mutex_exit(&vdp->xdf_dev_lk); 3028 return (0); 3029 } 3030 3031 static int 3032 xdf_open(dev_t *devp, int flag, int otyp, cred_t *credp) 3033 { 3034 minor_t minor; 3035 xdf_t *vdp; 3036 int part; 3037 ulong_t parbit; 3038 diskaddr_t p_blkct = 0; 3039 boolean_t firstopen; 3040 boolean_t nodelay; 3041 3042 minor = getminor(*devp); 3043 if ((vdp = ddi_get_soft_state(xdf_ssp, XDF_INST(minor))) == NULL) 3044 return (ENXIO); 3045 3046 nodelay = (flag & (FNDELAY | FNONBLOCK)); 3047 3048 DPRINTF(DDI_DBG, ("xdf@%s: opening\n", vdp->xdf_addr)); 3049 3050 /* do cv_wait until connected or failed */ 3051 mutex_enter(&vdp->xdf_cb_lk); 3052 mutex_enter(&vdp->xdf_dev_lk); 3053 if (!nodelay && (xdf_connect_locked(vdp, B_TRUE) != XD_READY)) { 3054 mutex_exit(&vdp->xdf_dev_lk); 3055 mutex_exit(&vdp->xdf_cb_lk); 3056 return (ENXIO); 3057 } 3058 mutex_exit(&vdp->xdf_cb_lk); 3059 3060 if ((flag & FWRITE) && XD_IS_RO(vdp)) { 3061 mutex_exit(&vdp->xdf_dev_lk); 3062 return (EROFS); 3063 } 3064 3065 part = XDF_PART(minor); 3066 parbit = 1 << part; 3067 if ((vdp->xdf_vd_exclopen & parbit) || 3068 ((flag & FEXCL) && xdf_isopen(vdp, part))) { 3069 mutex_exit(&vdp->xdf_dev_lk); 3070 return (EBUSY); 3071 } 3072 3073 /* are we the first one to open this node? */ 3074 firstopen = !xdf_isopen(vdp, -1); 3075 3076 if (otyp == OTYP_LYR) 3077 vdp->xdf_vd_lyropen[part]++; 3078 3079 vdp->xdf_vd_open[otyp] |= parbit; 3080 3081 if (flag & FEXCL) 3082 vdp->xdf_vd_exclopen |= parbit; 3083 3084 mutex_exit(&vdp->xdf_dev_lk); 3085 3086 /* force a re-validation */ 3087 if (firstopen) 3088 cmlb_invalidate(vdp->xdf_vd_lbl, NULL); 3089 3090 /* If this is a non-blocking open then we're done */ 3091 if (nodelay) 3092 return (0); 3093 3094 /* 3095 * This is a blocking open, so we require: 3096 * - that the disk have a valid label on it 3097 * - that the size of the partition that we're opening is non-zero 3098 */ 3099 if ((cmlb_partinfo(vdp->xdf_vd_lbl, part, &p_blkct, 3100 NULL, NULL, NULL, NULL) != 0) || (p_blkct == 0)) { 3101 (void) xdf_close(*devp, flag, otyp, credp); 3102 return (ENXIO); 3103 } 3104 3105 return (0); 3106 } 3107 3108 /*ARGSUSED*/ 3109 static void 3110 xdf_watch_hp_status_cb(dev_info_t *dip, const char *path, void *arg) 3111 { 3112 xdf_t *vdp = (xdf_t *)ddi_get_driver_private(dip); 3113 cv_broadcast(&vdp->xdf_hp_status_cv); 3114 } 3115 3116 static int 3117 xdf_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int flags, 3118 char *name, caddr_t valuep, int *lengthp) 3119 { 3120 xdf_t *vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip)); 3121 3122 /* 3123 * Sanity check that if a dev_t or dip were specified that they 3124 * correspond to this device driver. On debug kernels we'll 3125 * panic and on non-debug kernels we'll return failure. 3126 */ 3127 ASSERT(ddi_driver_major(dip) == xdf_major); 3128 ASSERT((dev == DDI_DEV_T_ANY) || (getmajor(dev) == xdf_major)); 3129 if ((ddi_driver_major(dip) != xdf_major) || 3130 ((dev != DDI_DEV_T_ANY) && (getmajor(dev) != xdf_major))) 3131 return (DDI_PROP_NOT_FOUND); 3132 3133 if (vdp == NULL) 3134 return (ddi_prop_op(dev, dip, prop_op, flags, 3135 name, valuep, lengthp)); 3136 3137 return (cmlb_prop_op(vdp->xdf_vd_lbl, 3138 dev, dip, prop_op, flags, name, valuep, lengthp, 3139 XDF_PART(getminor(dev)), NULL)); 3140 } 3141 3142 /*ARGSUSED*/ 3143 static int 3144 xdf_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **rp) 3145 { 3146 int instance = XDF_INST(getminor((dev_t)arg)); 3147 xdf_t *vbdp; 3148 3149 switch (cmd) { 3150 case DDI_INFO_DEVT2DEVINFO: 3151 if ((vbdp = ddi_get_soft_state(xdf_ssp, instance)) == NULL) { 3152 *rp = NULL; 3153 return (DDI_FAILURE); 3154 } 3155 *rp = vbdp->xdf_dip; 3156 return (DDI_SUCCESS); 3157 3158 case DDI_INFO_DEVT2INSTANCE: 3159 *rp = (void *)(uintptr_t)instance; 3160 return (DDI_SUCCESS); 3161 3162 default: 3163 return (DDI_FAILURE); 3164 } 3165 } 3166 3167 /*ARGSUSED*/ 3168 static int 3169 xdf_resume(dev_info_t *dip) 3170 { 3171 xdf_t *vdp; 3172 char *oename; 3173 3174 if ((vdp = ddi_get_soft_state(xdf_ssp, ddi_get_instance(dip))) == NULL) 3175 goto err; 3176 3177 if (xdf_debug & SUSRES_DBG) 3178 xen_printf("xdf@%s: xdf_resume\n", vdp->xdf_addr); 3179 3180 mutex_enter(&vdp->xdf_cb_lk); 3181 3182 if (xvdi_resume(dip) != DDI_SUCCESS) { 3183 mutex_exit(&vdp->xdf_cb_lk); 3184 goto err; 3185 } 3186 3187 if (((oename = xvdi_get_oename(dip)) == NULL) || 3188 (xvdi_add_xb_watch_handler(dip, oename, XBP_HP_STATUS, 3189 xdf_watch_hp_status_cb, NULL) != DDI_SUCCESS)) { 3190 mutex_exit(&vdp->xdf_cb_lk); 3191 goto err; 3192 } 3193 3194 mutex_enter(&vdp->xdf_dev_lk); 3195 ASSERT(vdp->xdf_state != XD_READY); 3196 xdf_set_state(vdp, XD_UNKNOWN); 3197 mutex_exit(&vdp->xdf_dev_lk); 3198 3199 if (xdf_setstate_init(vdp) != DDI_SUCCESS) { 3200 mutex_exit(&vdp->xdf_cb_lk); 3201 goto err; 3202 } 3203 3204 mutex_exit(&vdp->xdf_cb_lk); 3205 3206 if (xdf_debug & SUSRES_DBG) 3207 xen_printf("xdf@%s: xdf_resume: done\n", vdp->xdf_addr); 3208 return (DDI_SUCCESS); 3209 err: 3210 if (xdf_debug & SUSRES_DBG) 3211 xen_printf("xdf@%s: xdf_resume: fail\n", vdp->xdf_addr); 3212 return (DDI_FAILURE); 3213 } 3214 3215 static int 3216 xdf_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 3217 { 3218 int n, instance = ddi_get_instance(dip); 3219 ddi_iblock_cookie_t ibc, softibc; 3220 boolean_t dev_iscd = B_FALSE; 3221 xdf_t *vdp; 3222 char *oename, *xsname, *str; 3223 3224 if ((n = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_NOTPROM, 3225 "xdf_debug", 0)) != 0) 3226 xdf_debug = n; 3227 3228 switch (cmd) { 3229 case DDI_RESUME: 3230 return (xdf_resume(dip)); 3231 case DDI_ATTACH: 3232 break; 3233 default: 3234 return (DDI_FAILURE); 3235 } 3236 /* DDI_ATTACH */ 3237 3238 if (((xsname = xvdi_get_xsname(dip)) == NULL) || 3239 ((oename = xvdi_get_oename(dip)) == NULL)) 3240 return (DDI_FAILURE); 3241 3242 /* 3243 * Disable auto-detach. This is necessary so that we don't get 3244 * detached while we're disconnected from the back end. 3245 */ 3246 if ((ddi_prop_update_int(DDI_DEV_T_NONE, dip, 3247 DDI_NO_AUTODETACH, 1) != DDI_PROP_SUCCESS)) 3248 return (DDI_FAILURE); 3249 3250 /* driver handles kernel-issued IOCTLs */ 3251 if (ddi_prop_create(DDI_DEV_T_NONE, dip, 3252 DDI_PROP_CANSLEEP, DDI_KERNEL_IOCTL, NULL, 0) != DDI_PROP_SUCCESS) 3253 return (DDI_FAILURE); 3254 3255 if (ddi_get_iblock_cookie(dip, 0, &ibc) != DDI_SUCCESS) 3256 return (DDI_FAILURE); 3257 3258 if (ddi_get_soft_iblock_cookie(dip, 3259 DDI_SOFTINT_LOW, &softibc) != DDI_SUCCESS) 3260 return (DDI_FAILURE); 3261 3262 if (xenbus_read_str(xsname, XBP_DEV_TYPE, &str) != 0) { 3263 cmn_err(CE_WARN, "xdf@%s: cannot read device-type", 3264 ddi_get_name_addr(dip)); 3265 return (DDI_FAILURE); 3266 } 3267 if (strcmp(str, XBV_DEV_TYPE_CD) == 0) 3268 dev_iscd = B_TRUE; 3269 strfree(str); 3270 3271 if (ddi_soft_state_zalloc(xdf_ssp, instance) != DDI_SUCCESS) 3272 return (DDI_FAILURE); 3273 3274 DPRINTF(DDI_DBG, ("xdf@%s: attaching\n", ddi_get_name_addr(dip))); 3275 vdp = ddi_get_soft_state(xdf_ssp, instance); 3276 ddi_set_driver_private(dip, vdp); 3277 vdp->xdf_dip = dip; 3278 vdp->xdf_addr = ddi_get_name_addr(dip); 3279 vdp->xdf_suspending = B_FALSE; 3280 vdp->xdf_media_req_supported = B_FALSE; 3281 vdp->xdf_peer = INVALID_DOMID; 3282 vdp->xdf_evtchn = INVALID_EVTCHN; 3283 list_create(&vdp->xdf_vreq_act, sizeof (v_req_t), 3284 offsetof(v_req_t, v_link)); 3285 cv_init(&vdp->xdf_dev_cv, NULL, CV_DEFAULT, NULL); 3286 cv_init(&vdp->xdf_hp_status_cv, NULL, CV_DEFAULT, NULL); 3287 cv_init(&vdp->xdf_mstate_cv, NULL, CV_DEFAULT, NULL); 3288 mutex_init(&vdp->xdf_dev_lk, NULL, MUTEX_DRIVER, (void *)ibc); 3289 mutex_init(&vdp->xdf_cb_lk, NULL, MUTEX_DRIVER, (void *)ibc); 3290 mutex_init(&vdp->xdf_iostat_lk, NULL, MUTEX_DRIVER, (void *)ibc); 3291 vdp->xdf_cmbl_reattach = B_TRUE; 3292 if (dev_iscd) { 3293 vdp->xdf_dinfo |= VDISK_CDROM; 3294 vdp->xdf_mstate = DKIO_EJECTED; 3295 } else { 3296 vdp->xdf_mstate = DKIO_NONE; 3297 } 3298 3299 if ((vdp->xdf_ready_tq = ddi_taskq_create(dip, "xdf_ready_tq", 3300 1, TASKQ_DEFAULTPRI, 0)) == NULL) 3301 goto errout0; 3302 3303 if (xvdi_add_xb_watch_handler(dip, oename, XBP_HP_STATUS, 3304 xdf_watch_hp_status_cb, NULL) != DDI_SUCCESS) 3305 goto errout0; 3306 3307 if (ddi_add_softintr(dip, DDI_SOFTINT_LOW, &vdp->xdf_softintr_id, 3308 &softibc, NULL, xdf_iorestart, (caddr_t)vdp) != DDI_SUCCESS) { 3309 cmn_err(CE_WARN, "xdf@%s: failed to add softintr", 3310 ddi_get_name_addr(dip)); 3311 goto errout0; 3312 } 3313 3314 /* 3315 * Initialize the physical geometry stucture. Note that currently 3316 * we don't know the size of the backend device so the number 3317 * of blocks on the device will be initialized to zero. Once 3318 * we connect to the backend device we'll update the physical 3319 * geometry to reflect the real size of the device. 3320 */ 3321 xdf_synthetic_pgeom(dip, &vdp->xdf_pgeom); 3322 vdp->xdf_pgeom_fixed = B_FALSE; 3323 3324 /* 3325 * create default device minor nodes: non-removable disk 3326 * we will adjust minor nodes after we are connected w/ backend 3327 */ 3328 cmlb_alloc_handle(&vdp->xdf_vd_lbl); 3329 if (xdf_cmlb_attach(vdp) != 0) { 3330 cmn_err(CE_WARN, 3331 "xdf@%s: attach failed, cmlb attach failed", 3332 ddi_get_name_addr(dip)); 3333 goto errout0; 3334 } 3335 3336 /* 3337 * We ship with cache-enabled disks 3338 */ 3339 vdp->xdf_wce = B_TRUE; 3340 3341 mutex_enter(&vdp->xdf_cb_lk); 3342 /* Watch backend XenbusState change */ 3343 if (xvdi_add_event_handler(dip, 3344 XS_OE_STATE, xdf_oe_change, NULL) != DDI_SUCCESS) { 3345 mutex_exit(&vdp->xdf_cb_lk); 3346 goto errout0; 3347 } 3348 3349 if (xdf_setstate_init(vdp) != DDI_SUCCESS) { 3350 cmn_err(CE_WARN, "xdf@%s: start connection failed", 3351 ddi_get_name_addr(dip)); 3352 mutex_exit(&vdp->xdf_cb_lk); 3353 goto errout1; 3354 } 3355 mutex_exit(&vdp->xdf_cb_lk); 3356 3357 #if defined(XPV_HVM_DRIVER) 3358 3359 xdf_hvm_add(dip); 3360 3361 /* Report our version to dom0. */ 3362 if (xenbus_printf(XBT_NULL, "guest/xdf", "version", "%d", 3363 HVMPV_XDF_VERS)) 3364 cmn_err(CE_WARN, "xdf: couldn't write version\n"); 3365 3366 #else /* !XPV_HVM_DRIVER */ 3367 3368 /* create kstat for iostat(1M) */ 3369 if (xdf_kstat_create(dip, "xdf", instance) != 0) { 3370 cmn_err(CE_WARN, "xdf@%s: failed to create kstat", 3371 ddi_get_name_addr(dip)); 3372 goto errout1; 3373 } 3374 3375 #endif /* !XPV_HVM_DRIVER */ 3376 3377 ddi_report_dev(dip); 3378 DPRINTF(DDI_DBG, ("xdf@%s: attached\n", vdp->xdf_addr)); 3379 return (DDI_SUCCESS); 3380 3381 errout1: 3382 (void) xvdi_switch_state(vdp->xdf_dip, XBT_NULL, XenbusStateClosed); 3383 xvdi_remove_event_handler(dip, XS_OE_STATE); 3384 errout0: 3385 if (vdp->xdf_vd_lbl != NULL) { 3386 cmlb_detach(vdp->xdf_vd_lbl, NULL); 3387 cmlb_free_handle(&vdp->xdf_vd_lbl); 3388 vdp->xdf_vd_lbl = NULL; 3389 } 3390 if (vdp->xdf_softintr_id != NULL) 3391 ddi_remove_softintr(vdp->xdf_softintr_id); 3392 xvdi_remove_xb_watch_handlers(dip); 3393 if (vdp->xdf_ready_tq != NULL) 3394 ddi_taskq_destroy(vdp->xdf_ready_tq); 3395 mutex_destroy(&vdp->xdf_cb_lk); 3396 mutex_destroy(&vdp->xdf_dev_lk); 3397 cv_destroy(&vdp->xdf_dev_cv); 3398 cv_destroy(&vdp->xdf_hp_status_cv); 3399 ddi_soft_state_free(xdf_ssp, instance); 3400 ddi_set_driver_private(dip, NULL); 3401 ddi_prop_remove_all(dip); 3402 cmn_err(CE_WARN, "xdf@%s: attach failed", ddi_get_name_addr(dip)); 3403 return (DDI_FAILURE); 3404 } 3405 3406 static int 3407 xdf_suspend(dev_info_t *dip) 3408 { 3409 int instance = ddi_get_instance(dip); 3410 xdf_t *vdp; 3411 3412 if ((vdp = ddi_get_soft_state(xdf_ssp, instance)) == NULL) 3413 return (DDI_FAILURE); 3414 3415 if (xdf_debug & SUSRES_DBG) 3416 xen_printf("xdf@%s: xdf_suspend\n", vdp->xdf_addr); 3417 3418 xvdi_suspend(dip); 3419 3420 mutex_enter(&vdp->xdf_cb_lk); 3421 mutex_enter(&vdp->xdf_dev_lk); 3422 3423 vdp->xdf_suspending = B_TRUE; 3424 xdf_ring_destroy(vdp); 3425 xdf_set_state(vdp, XD_SUSPEND); 3426 vdp->xdf_suspending = B_FALSE; 3427 3428 mutex_exit(&vdp->xdf_dev_lk); 3429 mutex_exit(&vdp->xdf_cb_lk); 3430 3431 if (xdf_debug & SUSRES_DBG) 3432 xen_printf("xdf@%s: xdf_suspend: done\n", vdp->xdf_addr); 3433 3434 return (DDI_SUCCESS); 3435 } 3436 3437 static int 3438 xdf_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 3439 { 3440 xdf_t *vdp; 3441 int instance; 3442 3443 switch (cmd) { 3444 3445 case DDI_PM_SUSPEND: 3446 break; 3447 3448 case DDI_SUSPEND: 3449 return (xdf_suspend(dip)); 3450 3451 case DDI_DETACH: 3452 break; 3453 3454 default: 3455 return (DDI_FAILURE); 3456 } 3457 3458 instance = ddi_get_instance(dip); 3459 DPRINTF(DDI_DBG, ("xdf@%s: detaching\n", ddi_get_name_addr(dip))); 3460 vdp = ddi_get_soft_state(xdf_ssp, instance); 3461 3462 if (vdp == NULL) 3463 return (DDI_FAILURE); 3464 3465 mutex_enter(&vdp->xdf_cb_lk); 3466 xdf_disconnect(vdp, XD_CLOSED, B_FALSE); 3467 if (vdp->xdf_state != XD_CLOSED) { 3468 mutex_exit(&vdp->xdf_cb_lk); 3469 return (DDI_FAILURE); 3470 } 3471 mutex_exit(&vdp->xdf_cb_lk); 3472 3473 ASSERT(!ISDMACBON(vdp)); 3474 3475 #if defined(XPV_HVM_DRIVER) 3476 xdf_hvm_rm(dip); 3477 #endif /* XPV_HVM_DRIVER */ 3478 3479 if (vdp->xdf_timeout_id != 0) 3480 (void) untimeout(vdp->xdf_timeout_id); 3481 3482 xvdi_remove_event_handler(dip, XS_OE_STATE); 3483 ddi_taskq_destroy(vdp->xdf_ready_tq); 3484 3485 cmlb_detach(vdp->xdf_vd_lbl, NULL); 3486 cmlb_free_handle(&vdp->xdf_vd_lbl); 3487 3488 /* we'll support backend running in domU later */ 3489 #ifdef DOMU_BACKEND 3490 (void) xvdi_post_event(dip, XEN_HP_REMOVE); 3491 #endif 3492 3493 list_destroy(&vdp->xdf_vreq_act); 3494 ddi_prop_remove_all(dip); 3495 xdf_kstat_delete(dip); 3496 ddi_remove_softintr(vdp->xdf_softintr_id); 3497 xvdi_remove_xb_watch_handlers(dip); 3498 ddi_set_driver_private(dip, NULL); 3499 cv_destroy(&vdp->xdf_dev_cv); 3500 mutex_destroy(&vdp->xdf_cb_lk); 3501 mutex_destroy(&vdp->xdf_dev_lk); 3502 if (vdp->xdf_cache_flush_block != NULL) 3503 kmem_free(vdp->xdf_flush_mem, 2 * vdp->xdf_xdev_secsize); 3504 ddi_soft_state_free(xdf_ssp, instance); 3505 return (DDI_SUCCESS); 3506 } 3507 3508 /* 3509 * Driver linkage structures. 3510 */ 3511 static struct cb_ops xdf_cbops = { 3512 xdf_open, 3513 xdf_close, 3514 xdf_strategy, 3515 nodev, 3516 xdf_dump, 3517 xdf_read, 3518 xdf_write, 3519 xdf_ioctl, 3520 nodev, 3521 nodev, 3522 nodev, 3523 nochpoll, 3524 xdf_prop_op, 3525 NULL, 3526 D_MP | D_NEW | D_64BIT, 3527 CB_REV, 3528 xdf_aread, 3529 xdf_awrite 3530 }; 3531 3532 struct dev_ops xdf_devops = { 3533 DEVO_REV, /* devo_rev */ 3534 0, /* devo_refcnt */ 3535 xdf_getinfo, /* devo_getinfo */ 3536 nulldev, /* devo_identify */ 3537 nulldev, /* devo_probe */ 3538 xdf_attach, /* devo_attach */ 3539 xdf_detach, /* devo_detach */ 3540 nodev, /* devo_reset */ 3541 &xdf_cbops, /* devo_cb_ops */ 3542 NULL, /* devo_bus_ops */ 3543 NULL, /* devo_power */ 3544 ddi_quiesce_not_supported, /* devo_quiesce */ 3545 }; 3546 3547 /* 3548 * Module linkage structures. 3549 */ 3550 static struct modldrv modldrv = { 3551 &mod_driverops, /* Type of module. This one is a driver */ 3552 "virtual block driver", /* short description */ 3553 &xdf_devops /* driver specific ops */ 3554 }; 3555 3556 static struct modlinkage xdf_modlinkage = { 3557 MODREV_1, (void *)&modldrv, NULL 3558 }; 3559 3560 /* 3561 * standard module entry points 3562 */ 3563 int 3564 _init(void) 3565 { 3566 int rc; 3567 3568 xdf_major = ddi_name_to_major("xdf"); 3569 if (xdf_major == (major_t)-1) 3570 return (EINVAL); 3571 3572 if ((rc = ddi_soft_state_init(&xdf_ssp, sizeof (xdf_t), 0)) != 0) 3573 return (rc); 3574 3575 xdf_vreq_cache = kmem_cache_create("xdf_vreq_cache", 3576 sizeof (v_req_t), 0, NULL, NULL, NULL, NULL, NULL, 0); 3577 xdf_gs_cache = kmem_cache_create("xdf_gs_cache", 3578 sizeof (ge_slot_t), 0, NULL, NULL, NULL, NULL, NULL, 0); 3579 3580 #if defined(XPV_HVM_DRIVER) 3581 xdf_hvm_init(); 3582 #endif /* XPV_HVM_DRIVER */ 3583 3584 if ((rc = mod_install(&xdf_modlinkage)) != 0) { 3585 #if defined(XPV_HVM_DRIVER) 3586 xdf_hvm_fini(); 3587 #endif /* XPV_HVM_DRIVER */ 3588 kmem_cache_destroy(xdf_vreq_cache); 3589 kmem_cache_destroy(xdf_gs_cache); 3590 ddi_soft_state_fini(&xdf_ssp); 3591 return (rc); 3592 } 3593 3594 return (rc); 3595 } 3596 3597 int 3598 _fini(void) 3599 { 3600 int err; 3601 if ((err = mod_remove(&xdf_modlinkage)) != 0) 3602 return (err); 3603 3604 #if defined(XPV_HVM_DRIVER) 3605 xdf_hvm_fini(); 3606 #endif /* XPV_HVM_DRIVER */ 3607 3608 kmem_cache_destroy(xdf_vreq_cache); 3609 kmem_cache_destroy(xdf_gs_cache); 3610 ddi_soft_state_fini(&xdf_ssp); 3611 3612 return (0); 3613 } 3614 3615 int 3616 _info(struct modinfo *modinfop) 3617 { 3618 return (mod_info(&xdf_modlinkage, modinfop)); 3619 }