Lines Matching defs:vdp

95 logva(xdb_t *vdp, uint64_t va)
100 page_addrs = vdp->page_addrs;
101 for (i = 0; i < XDB_MAX_IO_PAGES(vdp); i++) {
106 for (i = 0; i < XDB_MAX_IO_PAGES(vdp); i++) {
112 ASSERT(i < XDB_MAX_IO_PAGES(vdp));
116 unlogva(xdb_t *vdp, uint64_t va)
121 page_addrs = vdp->page_addrs;
122 for (i = 0; i < XDB_MAX_IO_PAGES(vdp); i++) {
128 ASSERT(i < XDB_MAX_IO_PAGES(vdp));
172 xdb_t *vdp;
178 vdp = ksp->ks_private;
185 (knp++)->value.ui64 = vdp->xs_stat_req_reads;
186 (knp++)->value.ui64 = vdp->xs_stat_req_writes;
187 (knp++)->value.ui64 = vdp->xs_stat_req_barriers;
188 (knp++)->value.ui64 = vdp->xs_stat_req_flushes;
195 xdb_kstat_init(xdb_t *vdp)
201 if ((vdp->xs_kstats = kstat_create("xdb",
202 ddi_get_instance(vdp->xs_dip),
207 vdp->xs_kstats->ks_private = vdp;
208 vdp->xs_kstats->ks_update = xdb_kstat_update;
210 knp = vdp->xs_kstats->ks_data;
218 kstat_install(vdp->xs_kstats);
237 xdb_get_buf(xdb_t *vdp, blkif_request_t *req, xdb_request_t *xreq)
246 acchdl = vdp->xs_ring_hdl;
251 ASSERT(MUTEX_HELD(&vdp->xs_iomutex));
255 xreq->xr_vdp = vdp;
263 "length data buffer!", vdp->xs_peer);
272 "length data buffer!", vdp->xs_peer);
289 vdp->xs_iopage_va, xreq->xr_idx, i);
290 mapops[i].dom = vdp->xs_peer;
331 unlogva(vdp, mapops[j].host_addr);
342 logva(vdp, mapops[i].host_addr);
374 vdp->xs_iopage_va, xreq->xr_idx, i);
404 bp->b_un.b_addr = XDB_IOPAGE_VA(vdp->xs_iopage_va, xreq->xr_idx,
443 xdb_get_req(xdb_t *vdp)
448 ASSERT(MUTEX_HELD(&vdp->xs_iomutex));
449 ASSERT(vdp->xs_free_req != -1);
450 req = &vdp->xs_req[vdp->xs_free_req];
451 vdp->xs_free_req = req->xr_next;
461 xdb_t *vdp = req->xr_vdp;
463 ASSERT(MUTEX_HELD(&vdp->xs_iomutex));
464 req->xr_next = vdp->xs_free_req;
465 vdp->xs_free_req = req->xr_idx;
469 xdb_response(xdb_t *vdp, blkif_request_t *req, boolean_t ok)
471 ddi_acc_handle_t acchdl = vdp->xs_ring_hdl;
473 if (xdb_push_response(vdp, ddi_get64(acchdl, &req->id),
475 xvdi_notify_oe(vdp->xs_dip);
479 xdb_init_ioreqs(xdb_t *vdp)
483 ASSERT(vdp->xs_nentry);
485 if (vdp->xs_req == NULL)
486 vdp->xs_req = kmem_alloc(vdp->xs_nentry *
489 if (vdp->page_addrs == NULL)
490 vdp->page_addrs = kmem_zalloc(XDB_MAX_IO_PAGES(vdp) *
493 for (i = 0; i < vdp->xs_nentry; i++) {
494 vdp->xs_req[i].xr_idx = i;
495 vdp->xs_req[i].xr_next = i + 1;
497 vdp->xs_req[vdp->xs_nentry - 1].xr_next = -1;
498 vdp->xs_free_req = 0;
501 vdp->xs_iopage_va = vmem_xalloc(heap_arena,
502 XDB_MAX_IO_PAGES(vdp) * PAGESIZE, PAGESIZE, 0, 0, 0, 0,
504 for (i = 0; i < XDB_MAX_IO_PAGES(vdp); i++)
506 vdp->xs_iopage_va + i * PAGESIZE, NULL);
510 xdb_uninit_ioreqs(xdb_t *vdp)
514 for (i = 0; i < XDB_MAX_IO_PAGES(vdp); i++)
516 vdp->xs_iopage_va + i * PAGESIZE);
517 vmem_xfree(heap_arena, vdp->xs_iopage_va,
518 XDB_MAX_IO_PAGES(vdp) * PAGESIZE);
519 if (vdp->xs_req != NULL) {
520 kmem_free(vdp->xs_req, vdp->xs_nentry * sizeof (xdb_request_t));
521 vdp->xs_req = NULL;
524 if (vdp->page_addrs != NULL) {
525 kmem_free(vdp->page_addrs, XDB_MAX_IO_PAGES(vdp) *
527 vdp->page_addrs = NULL;
535 xdb_t *vdp = (xdb_t *)arg;
536 dev_info_t *dip = vdp->xs_dip;
545 ddi_get_name_addr(dip), vdp->xs_peer));
547 mutex_enter(&vdp->xs_iomutex);
550 if (!vdp->xs_if_connected) {
551 mutex_exit(&vdp->xs_iomutex);
554 ASSERT(vdp->xs_hp_connected && vdp->xs_fe_initialised);
564 while (xdb_get_request(vdp, reqp)) {
567 op = ddi_get8(vdp->xs_ring_hdl, &reqp->operation);
575 xreq = xdb_get_req(vdp);
579 vdp->xs_stat_req_reads++;
582 vdp->xs_stat_req_barriers++;
585 vdp->xs_stat_req_writes++;
588 vdp->xs_stat_req_flushes++;
593 bp = xdb_get_buf(vdp, reqp, xreq);
597 xdb_response(vdp, reqp, B_FALSE);
608 if (vdp->xs_f_iobuf == NULL) {
609 vdp->xs_f_iobuf = vdp->xs_l_iobuf = bp;
611 vdp->xs_l_iobuf->av_forw = bp;
612 vdp->xs_l_iobuf = bp;
615 xdb_response(vdp, reqp, B_FALSE);
618 ddi_get_name_addr(dip), vdp->xs_peer));
623 cv_broadcast(&vdp->xs_iocv);
625 mutex_exit(&vdp->xs_iomutex);
637 xdb_t *vdp = xreq->xr_vdp;
643 ddi_get_name_addr(vdp->xs_dip), bioerr));
647 nbp = xdb_get_buf(vdp, NULL, xreq);
649 err = ldi_strategy(vdp->xs_ldi_hdl, nbp);
658 ddi_get_name_addr(vdp->xs_dip), err));
673 vdp->xs_iopage_va, xreq->xr_idx, i);
675 mutex_enter(&vdp->xs_iomutex);
676 unlogva(vdp, unmapops[i].host_addr);
677 mutex_exit(&vdp->xs_iomutex);
699 (void) ldi_ioctl(vdp->xs_ldi_hdl,
703 mutex_enter(&vdp->xs_iomutex);
706 if (vdp->xs_if_connected) {
707 ASSERT(vdp->xs_hp_connected && vdp->xs_fe_initialised);
708 if (xdb_push_response(vdp, xreq->xr_id, xreq->xr_op, bioerr))
709 xvdi_notify_oe(vdp->xs_dip);
718 vdp->xs_ionum--;
719 if (!vdp->xs_if_connected && (vdp->xs_ionum == 0)) {
721 cv_signal(&vdp->xs_ionumcv);
724 mutex_exit(&vdp->xs_iomutex);
730 xdb_bindto_frontend(xdb_t *vdp)
736 dev_info_t *dip = vdp->xs_dip;
739 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
764 vdp->xs_blk_protocol = BLKIF_PROTOCOL_NATIVE;
765 vdp->xs_nentry = BLKIF_RING_SIZE;
766 vdp->xs_entrysize = sizeof (union blkif_sring_entry);
779 vdp->xs_blk_protocol = BLKIF_PROTOCOL_X86_32;
780 vdp->xs_nentry = BLKIF_X86_32_RING_SIZE;
781 vdp->xs_entrysize =
785 vdp->xs_blk_protocol = BLKIF_PROTOCOL_X86_64;
786 vdp->xs_nentry = BLKIF_X86_64_RING_SIZE;
787 vdp->xs_entrysize =
804 if (xvdi_map_ring(dip, vdp->xs_nentry, vdp->xs_entrysize,
805 gref, &vdp->xs_ring) != DDI_SUCCESS)
813 vdp->xs_ring_hdl = vdp->xs_ring->xr_acc_hdl;
818 xvdi_unmap_ring(vdp->xs_ring);
826 xdb_unbindfrom_frontend(xdb_t *vdp)
828 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
830 xvdi_free_evtchn(vdp->xs_dip);
831 xvdi_unmap_ring(vdp->xs_ring);
843 xdb_params_change(xdb_t *vdp, char *params, boolean_t update_xs)
846 dev_info_t *dip = vdp->xs_dip;
850 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
851 ASSERT(vdp->xs_params_path != NULL);
855 if (strcmp(vdp->xs_params_path, params) == 0)
863 vdp->xs_fe_initialised = B_FALSE;
901 strfree(vdp->xs_params_path);
902 vdp->xs_params_path = strdup(params);
921 xdb_t *vdp = (xdb_t *)ddi_get_driver_private(dip);
929 mutex_enter(&vdp->xs_cbmutex);
932 mutex_exit(&vdp->xs_cbmutex);
936 if (strcmp(vdp->xs_params_path, str) == 0) {
938 mutex_exit(&vdp->xs_cbmutex);
949 if (!XDB_IS_FE_CD(vdp) ||
961 mutex_exit(&vdp->xs_cbmutex);
968 xdb_params_change(vdp, str, B_FALSE);
969 mutex_exit(&vdp->xs_cbmutex);
989 xdb_t *vdp = (xdb_t *)ddi_get_driver_private(dip);
992 mutex_enter(&vdp->xs_cbmutex);
995 mutex_exit(&vdp->xs_cbmutex);
1000 mutex_exit(&vdp->xs_cbmutex);
1004 if (!XDB_IS_FE_CD(vdp)) {
1007 mutex_exit(&vdp->xs_cbmutex);
1012 mutex_exit(&vdp->xs_cbmutex);
1020 xdb_params_change(vdp, "", B_TRUE);
1023 mutex_exit(&vdp->xs_cbmutex);
1034 xdb_media_req_init(xdb_t *vdp)
1036 dev_info_t *dip = vdp->xs_dip;
1039 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1045 if (!XDB_IS_FE_CD(vdp))
1068 xdb_params_init(xdb_t *vdp)
1070 dev_info_t *dip = vdp->xs_dip;
1074 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1075 ASSERT(vdp->xs_params_path == NULL);
1084 vdp->xs_params_path = str;
1088 strfree(vdp->xs_params_path);
1089 vdp->xs_params_path = NULL;
1101 xdb_setup_node(xdb_t *vdp, char *path)
1103 dev_info_t *dip = vdp->xs_dip;
1109 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1119 vdp->xs_type |= XDB_DEV_BE_LOFI;
1122 if (!XDB_IS_BE_LOFI(vdp)) {
1123 (void) strlcpy(path, vdp->xs_params_path, MAXPATHLEN);
1124 ASSERT(vdp->xs_lofi_path == NULL);
1130 &ldi_hdl, vdp->xs_ldi_li);
1137 (void) strlcpy(li->li_filename, vdp->xs_params_path,
1146 ddi_get_name_addr(dip), vdp->xs_params_path);
1157 ASSERT(vdp->xs_lofi_path == NULL);
1158 vdp->xs_lofi_path = strdup(path);
1164 xdb_teardown_node(xdb_t *vdp)
1166 dev_info_t *dip = vdp->xs_dip;
1171 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1173 if (!XDB_IS_BE_LOFI(vdp))
1176 vdp->xs_type &= ~XDB_DEV_BE_LOFI;
1177 ASSERT(vdp->xs_lofi_path != NULL);
1180 (void) strlcpy(li->li_filename, vdp->xs_params_path,
1185 &ldi_hdl, vdp->xs_ldi_li);
1202 strfree(vdp->xs_lofi_path);
1203 vdp->xs_lofi_path = NULL;
1207 xdb_open_device(xdb_t *vdp)
1209 dev_info_t *dip = vdp->xs_dip;
1217 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1219 if (strlen(vdp->xs_params_path) == 0) {
1225 ASSERT(XDB_IS_FE_CD(vdp));
1226 ASSERT(vdp->xs_sectors == 0);
1227 ASSERT(vdp->xs_ldi_li == NULL);
1228 ASSERT(vdp->xs_ldi_hdl == NULL);
1240 strfree(vdp->xs_params_path);
1241 vdp->xs_params_path = str;
1244 if (ldi_ident_from_dip(dip, &vdp->xs_ldi_li) != 0)
1250 if (xdb_setup_node(vdp, nodepath) != DDI_SUCCESS) {
1253 ldi_ident_release(vdp->xs_ldi_li);
1259 FREAD | (XDB_IS_RO(vdp) ? 0 : FWRITE),
1260 kcred, &vdp->xs_ldi_hdl, vdp->xs_ldi_li) != 0) {
1261 xdb_teardown_node(vdp);
1262 ldi_ident_release(vdp->xs_ldi_li);
1269 if (ldi_get_size(vdp->xs_ldi_hdl, &devsize) != DDI_SUCCESS) {
1270 (void) ldi_close(vdp->xs_ldi_hdl,
1271 FREAD | (XDB_IS_RO(vdp) ? 0 : FWRITE), kcred);
1272 xdb_teardown_node(vdp);
1273 ldi_ident_release(vdp->xs_ldi_li);
1278 blksize = ldi_prop_get_int64(vdp->xs_ldi_hdl,
1282 blksize = ldi_prop_get_int(vdp->xs_ldi_hdl,
1286 vdp->xs_sec_size = blksize;
1287 vdp->xs_sectors = devsize / blksize;
1290 if (ldi_prop_get_int(vdp->xs_ldi_hdl, LDI_DEV_T_ANY | DDI_PROP_DONTPASS,
1292 vdp->xs_type |= XDB_DEV_BE_CD;
1295 if (ldi_prop_exists(vdp->xs_ldi_hdl,
1298 vdp->xs_type |= XDB_DEV_BE_RMB;
1305 xdb_close_device(xdb_t *vdp)
1307 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1309 if (strlen(vdp->xs_params_path) == 0) {
1310 ASSERT(XDB_IS_FE_CD(vdp));
1311 ASSERT(vdp->xs_sectors == 0);
1312 ASSERT(vdp->xs_ldi_li == NULL);
1313 ASSERT(vdp->xs_ldi_hdl == NULL);
1317 (void) ldi_close(vdp->xs_ldi_hdl,
1318 FREAD | (XDB_IS_RO(vdp) ? 0 : FWRITE), kcred);
1319 xdb_teardown_node(vdp);
1320 ldi_ident_release(vdp->xs_ldi_li);
1321 vdp->xs_type &= ~(XDB_DEV_BE_CD | XDB_DEV_BE_RMB);
1322 vdp->xs_sectors = 0;
1323 vdp->xs_ldi_li = NULL;
1324 vdp->xs_ldi_hdl = NULL;
1333 xdb_start_connect(xdb_t *vdp)
1336 dev_info_t *dip = vdp->xs_dip;
1343 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1346 ((vdp->xs_peer = xvdi_get_oeid(dip)) == (domid_t)-1))
1349 mutex_enter(&vdp->xs_iomutex);
1354 if (!vdp->xs_hp_connected || !vdp->xs_fe_initialised) {
1355 ASSERT(!vdp->xs_if_connected);
1356 mutex_exit(&vdp->xs_iomutex);
1361 if (vdp->xs_if_connected) {
1362 mutex_exit(&vdp->xs_iomutex);
1365 mutex_exit(&vdp->xs_iomutex);
1375 if (xdb_open_device(vdp) != DDI_SUCCESS)
1378 if (xdb_bindto_frontend(vdp) != DDI_SUCCESS) {
1379 xdb_close_device(vdp);
1384 xdb_init_ioreqs(vdp);
1386 if (ddi_add_intr(dip, 0, NULL, NULL, xdb_intr, (caddr_t)vdp)
1388 xdb_uninit_ioreqs(vdp);
1389 xdb_unbindfrom_frontend(vdp);
1390 xdb_close_device(vdp);
1395 if (XDB_IS_RO(vdp))
1397 if (XDB_IS_BE_RMB(vdp))
1399 if (XDB_IS_BE_CD(vdp))
1401 if (XDB_IS_FE_CD(vdp))
1408 mutex_enter(&vdp->xs_iomutex);
1409 ASSERT(vdp->xs_fe_initialised);
1410 vdp->xs_if_connected = B_TRUE;
1411 mutex_exit(&vdp->xs_iomutex);
1423 ssize = (vdp->xs_sec_size == 0) ? DEV_BSIZE : vdp->xs_sec_size;
1424 sectors = vdp->xs_sectors;
1459 xdb_t *vdp = (xdb_t *)ddi_get_driver_private(dip);
1461 ASSERT(MUTEX_HELD(&vdp->xs_cbmutex));
1462 mutex_enter(&vdp->xs_iomutex);
1469 if (!vdp->xs_hp_connected || !vdp->xs_fe_initialised) {
1470 ASSERT(!vdp->xs_if_connected);
1471 mutex_exit(&vdp->xs_iomutex);
1476 if (!vdp->xs_if_connected) {
1477 cv_broadcast(&vdp->xs_iocv);
1478 mutex_exit(&vdp->xs_iomutex);
1484 vdp->xs_if_connected = B_FALSE;
1485 cv_broadcast(&vdp->xs_iocv);
1487 mutex_exit(&vdp->xs_iomutex);
1493 mutex_enter(&vdp->xs_iomutex);
1494 while (vdp->xs_ionum > 0)
1495 cv_wait(&vdp->xs_ionumcv, &vdp->xs_iomutex);
1496 mutex_exit(&vdp->xs_iomutex);
1499 xdb_uninit_ioreqs(vdp);
1500 xdb_unbindfrom_frontend(vdp);
1501 xdb_close_device(vdp);
1502 vdp->xs_peer = (domid_t)-1;
1508 xdb_t *vdp = (xdb_t *)arg;
1512 mutex_enter(&vdp->xs_iomutex);
1513 while (vdp->xs_send_buf) {
1514 if ((bp = vdp->xs_f_iobuf) == NULL) {
1518 cv_wait(&vdp->xs_iocv, &vdp->xs_iomutex);
1522 vdp->xs_f_iobuf = bp->av_forw;
1524 vdp->xs_ionum++;
1526 mutex_exit(&vdp->xs_iomutex);
1530 mutex_enter(&vdp->xs_iomutex);
1535 if (vdp->xs_ldi_hdl != NULL)
1536 err = ldi_strategy(vdp->xs_ldi_hdl, bp);
1542 ddi_get_name_addr(vdp->xs_dip), err));
1547 mutex_enter(&vdp->xs_iomutex);
1550 mutex_exit(&vdp->xs_iomutex);
1559 xdb_t *vdp = (xdb_t *)ddi_get_driver_private(dip);
1567 mutex_enter(&vdp->xs_cbmutex);
1570 if (vdp->xs_hp_connected) {
1571 mutex_exit(&vdp->xs_cbmutex);
1575 vdp->xs_hp_connected = B_TRUE;
1576 xdb_start_connect(vdp);
1577 mutex_exit(&vdp->xs_cbmutex);
1586 xdb_t *vdp = (xdb_t *)ddi_get_driver_private(dip);
1591 mutex_enter(&vdp->xs_cbmutex);
1606 vdp->xs_fe_initialised = B_FALSE;
1615 vdp->xs_fe_initialised = B_TRUE;
1616 xdb_start_connect(vdp);
1631 vdp->xs_fe_initialised = B_FALSE;
1636 mutex_exit(&vdp->xs_cbmutex);
1643 xdb_t *vdp;
1674 vdp = ddi_get_soft_state(xdb_statep, instance);
1675 vdp->xs_dip = dip;
1676 mutex_init(&vdp->xs_iomutex, NULL, MUTEX_DRIVER, (void *)ibc);
1677 mutex_init(&vdp->xs_cbmutex, NULL, MUTEX_DRIVER, (void *)ibc);
1678 cv_init(&vdp->xs_iocv, NULL, CV_DRIVER, NULL);
1679 cv_init(&vdp->xs_ionumcv, NULL, CV_DRIVER, NULL);
1680 ddi_set_driver_private(dip, vdp);
1682 if (!xdb_kstat_init(vdp))
1689 vdp->xs_type |= XDB_DEV_FE_CD;
1696 vdp->xs_type |= XDB_DEV_RO;
1699 mutex_enter(&vdp->xs_cbmutex);
1700 if (!xdb_media_req_init(vdp) || !xdb_params_init(vdp)) {
1702 mutex_exit(&vdp->xs_cbmutex);
1705 mutex_exit(&vdp->xs_cbmutex);
1707 vdp->xs_send_buf = B_TRUE;
1708 vdp->xs_iotaskq = ddi_taskq_create(dip, "xdb_iotask", 1,
1710 (void) ddi_taskq_dispatch(vdp->xs_iotaskq, xdb_send_buf, vdp,
1740 ASSERT(vdp->xs_hp_connected && vdp->xs_if_connected);
1745 mutex_enter(&vdp->xs_cbmutex);
1746 mutex_enter(&vdp->xs_iomutex);
1747 vdp->xs_send_buf = B_FALSE;
1748 cv_broadcast(&vdp->xs_iocv);
1749 mutex_exit(&vdp->xs_iomutex);
1750 mutex_exit(&vdp->xs_cbmutex);
1753 ddi_taskq_destroy(vdp->xs_iotaskq);
1756 mutex_enter(&vdp->xs_cbmutex);
1758 mutex_exit(&vdp->xs_cbmutex);
1762 kstat_delete(vdp->xs_kstats);
1767 cv_destroy(&vdp->xs_iocv);
1768 cv_destroy(&vdp->xs_ionumcv);
1769 mutex_destroy(&vdp->xs_cbmutex);
1770 mutex_destroy(&vdp->xs_iomutex);
1781 xdb_t *vdp = XDB_INST2SOFTS(instance);
1795 mutex_enter(&vdp->xs_iomutex);
1796 if (vdp->xs_if_connected) {
1797 mutex_exit(&vdp->xs_iomutex);
1800 vdp->xs_send_buf = B_FALSE;
1801 cv_broadcast(&vdp->xs_iocv);
1802 mutex_exit(&vdp->xs_iomutex);
1807 ddi_taskq_destroy(vdp->xs_iotaskq);
1809 mutex_enter(&vdp->xs_cbmutex);
1811 mutex_exit(&vdp->xs_cbmutex);
1813 cv_destroy(&vdp->xs_iocv);
1814 cv_destroy(&vdp->xs_ionumcv);
1815 mutex_destroy(&vdp->xs_cbmutex);
1816 mutex_destroy(&vdp->xs_iomutex);
1817 kstat_delete(vdp->xs_kstats);
1886 xdb_get_request(xdb_t *vdp, blkif_request_t *req)
1888 void *src = xvdi_ring_get_request(vdp->xs_ring);
1893 switch (vdp->xs_blk_protocol) {
1905 ddi_get_name_addr(vdp->xs_dip),
1906 vdp->xs_blk_protocol);
1912 xdb_push_response(xdb_t *vdp, uint64_t id, uint8_t op, uint16_t status)
1914 ddi_acc_handle_t acchdl = vdp->xs_ring_hdl;
1915 blkif_response_t *rsp = xvdi_ring_get_response(vdp->xs_ring);
1921 switch (vdp->xs_blk_protocol) {
1942 ddi_get_name_addr(vdp->xs_dip),
1943 vdp->xs_blk_protocol);
1946 return (xvdi_ring_push_response(vdp->xs_ring));