Lines Matching refs:state

122 static void xpvtap_drv_fini(xpvtap_state_t *state);
125 typedef void (*xpvtap_rs_cleanup_t)(xpvtap_state_t *state, uint_t rs);
134 static int xpvtap_segmf_register(xpvtap_state_t *state);
137 static int xpvtap_user_init(xpvtap_state_t *state);
138 static void xpvtap_user_fini(xpvtap_state_t *state);
139 static int xpvtap_user_ring_init(xpvtap_state_t *state);
140 static void xpvtap_user_ring_fini(xpvtap_state_t *state);
141 static int xpvtap_user_thread_init(xpvtap_state_t *state);
142 static void xpvtap_user_thread_fini(xpvtap_state_t *state);
144 static void xpvtap_user_thread_stop(xpvtap_state_t *state);
149 static int xpvtap_user_request_map(xpvtap_state_t *state, blkif_request_t *req,
151 static int xpvtap_user_request_push(xpvtap_state_t *state,
153 static int xpvtap_user_response_get(xpvtap_state_t *state,
155 static void xpvtap_user_request_unmap(xpvtap_state_t *state, uint_t uid);
217 xpvtap_state_t *state;
233 /* initialize our state info */
235 state = xpvtap_drv_init(instance);
236 if (state == NULL) {
239 state->bt_dip = dip;
242 args.ar_dip = state->bt_dip;
244 args.ar_intr_arg = (caddr_t)state;
246 args.ar_ringup_arg = (caddr_t)state;
248 args.ar_ringdown_arg = (caddr_t)state;
249 e = blk_ring_init(&args, &state->bt_guest_ring);
267 blk_ring_fini(&state->bt_guest_ring);
269 xpvtap_drv_fini(state);
280 xpvtap_state_t *state;
285 state = ddi_get_soft_state(xpvtap_statep, instance);
286 if (state == NULL) {
299 xpvtap_user_thread_stop(state);
300 blk_ring_fini(&state->bt_guest_ring);
301 xpvtap_drv_fini(state);
315 xpvtap_state_t *state;
326 state = ddi_get_soft_state(xpvtap_statep, instance);
327 if (state == NULL) {
330 *result = (void *)state->bt_dip;
355 xpvtap_state_t *state;
364 state = ddi_get_soft_state(xpvtap_statep, instance);
365 if (state == NULL) {
370 mutex_enter(&state->bt_open.bo_mutex);
371 if (state->bt_open.bo_opened) {
372 mutex_exit(&state->bt_open.bo_mutex);
375 state->bt_open.bo_opened = B_TRUE;
376 mutex_exit(&state->bt_open.bo_mutex);
382 state->bt_map.um_as = curproc->p_as;
395 xpvtap_state_t *state;
400 state = ddi_get_soft_state(xpvtap_statep, instance);
401 if (state == NULL) {
409 mutex_enter(&state->bt_thread.ut_mutex);
410 state->bt_thread.ut_wake = B_TRUE;
411 state->bt_thread.ut_exit = B_TRUE;
412 cv_signal(&state->bt_thread.ut_wake_cv);
413 if (!state->bt_thread.ut_exit_done) {
414 cv_wait(&state->bt_thread.ut_exit_done_cv,
415 &state->bt_thread.ut_mutex);
417 ASSERT(state->bt_thread.ut_exit_done);
418 mutex_exit(&state->bt_thread.ut_mutex);
420 state->bt_map.um_as = NULL;
421 state->bt_map.um_guest_pages = NULL;
429 mutex_enter(&state->bt_open.bo_mutex);
430 ASSERT(state->bt_open.bo_opened);
431 state->bt_open.bo_opened = B_FALSE;
432 cv_signal(&state->bt_open.bo_exit_cv);
433 mutex_exit(&state->bt_open.bo_mutex);
447 xpvtap_state_t *state;
460 state = ddi_get_soft_state(xpvtap_statep, instance);
461 if (state == NULL) {
471 mutex_enter(&state->bt_thread.ut_mutex);
472 state->bt_thread.ut_wake = B_TRUE;
473 cv_signal(&state->bt_thread.ut_wake_cv);
474 mutex_exit(&state->bt_thread.ut_mutex);
496 xpvtap_state_t *state;
506 state = ddi_get_soft_state(xpvtap_statep, instance);
507 if (state == NULL) {
542 ASSERT(asp == state->bt_map.um_as);
568 state->bt_map.um_guest_pages = (caddr_t)*addrp;
569 state->bt_map.um_guest_size = (size_t)len;
572 e = as_add_callback(asp, xpvtap_segmf_unregister, state,
580 mutex_enter(&state->bt_thread.ut_mutex);
581 state->bt_thread.ut_wake = B_TRUE;
582 cv_signal(&state->bt_thread.ut_wake_cv);
583 mutex_exit(&state->bt_thread.ut_mutex);
598 xpvtap_state_t *state;
604 state = ddi_get_soft_state(xpvtap_statep, instance);
605 if (state == NULL) {
623 usring = &state->bt_user_ring;
624 e = devmap_umem_setup(dhp, state->bt_dip, NULL, usring->ur_cookie, 0,
645 xpvtap_state_t *state;
653 state = ddi_get_soft_state(xpvtap_statep, instance);
654 if (state == NULL) {
667 usring = &state->bt_user_ring;
685 *phpp = &state->bt_pollhead;
699 xpvtap_state_t *state;
707 state = ddi_get_soft_state(xpvtap_statep, instance);
708 if (state == NULL) {
712 state->bt_instance = instance;
713 mutex_init(&state->bt_open.bo_mutex, NULL, MUTEX_DRIVER, NULL);
714 cv_init(&state->bt_open.bo_exit_cv, NULL, CV_DRIVER, NULL);
715 state->bt_open.bo_opened = B_FALSE;
716 state->bt_map.um_registered = B_FALSE;
718 /* initialize user ring, thread, mapping state */
719 e = xpvtap_user_init(state);
724 return (state);
727 cv_destroy(&state->bt_open.bo_exit_cv);
728 mutex_destroy(&state->bt_open.bo_mutex);
739 xpvtap_drv_fini(xpvtap_state_t *state)
741 xpvtap_user_fini(state);
742 cv_destroy(&state->bt_open.bo_exit_cv);
743 mutex_destroy(&state->bt_open.bo_mutex);
744 (void) ddi_soft_state_free(xpvtap_statep, state->bt_instance);
755 xpvtap_state_t *state;
758 state = (xpvtap_state_t *)arg;
761 mutex_enter(&state->bt_thread.ut_mutex);
762 state->bt_thread.ut_wake = B_TRUE;
763 cv_signal(&state->bt_thread.ut_wake_cv);
764 mutex_exit(&state->bt_thread.ut_mutex);
774 xpvtap_segmf_register(xpvtap_state_t *state)
784 as = state->bt_map.um_as;
785 pgcnt = btopr(state->bt_map.um_guest_size);
786 uaddr = state->bt_map.um_guest_pages;
794 seg = as_findseg(as, state->bt_map.um_guest_pages, 0);
795 if ((seg == NULL) || ((uaddr + state->bt_map.um_guest_size) >
816 state->bt_map.um_registered = B_TRUE;
832 xpvtap_state_t *state;
838 state = (xpvtap_state_t *)arg;
839 if (!state->bt_map.um_registered) {
845 pgcnt = btopr(state->bt_map.um_guest_size);
846 uaddr = state->bt_map.um_guest_pages;
849 xpvtap_rs_flush(state->bt_map.um_rs, xpvtap_user_request_unmap, state);
864 state->bt_map.um_registered = B_FALSE;
872 xpvtap_user_init(xpvtap_state_t *state)
878 map = &state->bt_map;
881 e = xpvtap_user_ring_init(state);
889 * state we use to track request IDs to the user app. These IDs will
908 e = xpvtap_user_thread_init(state);
919 xpvtap_user_ring_fini(state);
928 xpvtap_user_ring_init(xpvtap_state_t *state)
933 usring = &state->bt_user_ring;
950 xpvtap_user_thread_init(xpvtap_state_t *state)
956 thread = &state->bt_thread;
966 (void) sprintf(taskqname, "xvptap_%d", state->bt_instance);
967 thread->ut_taskq = ddi_taskq_create(state->bt_dip, taskqname, 1,
993 xpvtap_state_t *state;
997 state = (xpvtap_state_t *)arg;
998 thread = &state->bt_thread;
1002 e = ddi_taskq_dispatch(thread->ut_taskq, xpvtap_user_thread, state,
1015 xpvtap_user_thread_stop(xpvtap_state_t *state)
1018 mutex_enter(&state->bt_thread.ut_mutex);
1019 state->bt_thread.ut_wake = B_TRUE;
1020 state->bt_thread.ut_exit = B_TRUE;
1021 cv_signal(&state->bt_thread.ut_wake_cv);
1022 if (!state->bt_thread.ut_exit_done) {
1023 cv_wait(&state->bt_thread.ut_exit_done_cv,
1024 &state->bt_thread.ut_mutex);
1026 mutex_exit(&state->bt_thread.ut_mutex);
1027 ASSERT(state->bt_thread.ut_exit_done);
1035 xpvtap_user_fini(xpvtap_state_t *state)
1040 map = &state->bt_map;
1042 xpvtap_user_thread_fini(state);
1046 xpvtap_user_ring_fini(state);
1054 xpvtap_user_ring_fini(xpvtap_state_t *state)
1056 ddi_umem_free(state->bt_user_ring.ur_cookie);
1064 xpvtap_user_thread_fini(xpvtap_state_t *state)
1066 ddi_taskq_destroy(state->bt_thread.ut_taskq);
1067 cv_destroy(&state->bt_thread.ut_exit_done_cv);
1068 cv_destroy(&state->bt_thread.ut_wake_cv);
1069 mutex_destroy(&state->bt_thread.ut_mutex);
1081 xpvtap_state_t *state;
1088 state = (xpvtap_state_t *)arg;
1089 thread = &state->bt_thread;
1096 cv_signal(&state->bt_thread.ut_exit_done_cv);
1130 e = blk_ring_request_get(state->bt_guest_ring, &req);
1136 e = xpvtap_user_request_map(state, &req, &uid);
1143 blk_ring_request_requeue(state->bt_guest_ring);
1148 e = xpvtap_user_request_push(state, &req, uid);
1153 blk_ring_response_put(state->bt_guest_ring, &resp);
1163 b = xpvtap_user_response_get(state, &resp, &uid);
1172 xpvtap_user_request_unmap(state, uid);
1175 blk_ring_response_put(state->bt_guest_ring, &resp);
1186 xpvtap_user_request_map(xpvtap_state_t *state, blkif_request_t *req,
1199 domid = xvdi_get_oeid(state->bt_dip);
1201 as = state->bt_map.um_as;
1202 if ((as == NULL) || (state->bt_map.um_guest_pages == NULL)) {
1207 if (!state->bt_map.um_registered) {
1209 e = xpvtap_segmf_register(state);
1216 e = xpvtap_rs_alloc(state->bt_map.um_rs, uid);
1229 uaddr = XPVTAP_GREF_REQADDR(state->bt_map.um_guest_pages, *uid);
1232 seg = as_findseg(as, state->bt_map.um_guest_pages, 0);
1262 xpvtap_user_request_push(xpvtap_state_t *state, blkif_request_t *req,
1271 uring = &state->bt_user_ring.ur_ring;
1272 map = &state->bt_map;
1288 pollwakeup(&state->bt_pollhead, POLLIN | POLLRDNORM);
1295 xpvtap_user_request_unmap(xpvtap_state_t *state, uint_t uid)
1304 as = state->bt_map.um_as;
1310 req = &state->bt_map.um_outstanding_reqs[uid];
1316 uaddr = XPVTAP_GREF_REQADDR(state->bt_map.um_guest_pages, uid);
1318 seg = as_findseg(as, state->bt_map.um_guest_pages, 0);
1322 xpvtap_rs_free(state->bt_map.um_rs, uid);
1335 xpvtap_rs_free(state->bt_map.um_rs, uid);
1340 xpvtap_user_response_get(xpvtap_state_t *state, blkif_response_t *resp,
1347 uring = &state->bt_user_ring.ur_ring;
1365 resp->id = state->bt_map.um_outstanding_reqs[*uid].id;
1376 xpvtap_state_t *state;
1379 state = (xpvtap_state_t *)arg;
1385 mutex_enter(&state->bt_open.bo_mutex);
1386 if (state->bt_open.bo_opened) {
1387 rc = cv_reltimedwait(&state->bt_open.bo_exit_cv,
1388 &state->bt_open.bo_mutex, drv_usectohz(10000000),
1395 mutex_exit(&state->bt_open.bo_mutex);