Lines Matching refs:ring

142 static int blk_check_state_transition(blk_ring_t ring, XenbusState oestate);
143 static int blk_start_connect(blk_ring_t ring);
144 static void blk_start_disconnect(blk_ring_t ring);
145 static void blk_ring_close(blk_ring_t ring);
146 static int blk_bindto_frontend(blk_ring_t ring);
147 static void blk_unbindfrom_frontend(blk_ring_t ring);
150 static int blk_kstat_init(blk_ring_t ring);
151 static void blk_kstat_fini(blk_ring_t ring);
171 blk_ring_t ring; in blk_ring_init() local
175 ring = kmem_zalloc(sizeof (struct blk_ring_s), KM_SLEEP); in blk_ring_init()
176 mutex_init(&ring->ri_mutex, NULL, MUTEX_DRIVER, NULL); in blk_ring_init()
177 ring->ri_dip = args->ar_dip; in blk_ring_init()
178 ring->ri_intr = args->ar_intr; in blk_ring_init()
179 ring->ri_intr_arg = args->ar_intr_arg; in blk_ring_init()
180 ring->ri_ringup = args->ar_ringup; in blk_ring_init()
181 ring->ri_ringup_arg = args->ar_ringup_arg; in blk_ring_init()
182 ring->ri_ringdown = args->ar_ringdown; in blk_ring_init()
183 ring->ri_ringdown_arg = args->ar_ringdown_arg; in blk_ring_init()
185 ring->ri_if_status = BLK_IF_UNKNOWN; in blk_ring_init()
186 ring->ri_be_status = BLK_BE_UNKNOWN; in blk_ring_init()
187 ring->ri_fe_status = BLK_FE_UNKNOWN; in blk_ring_init()
188 ring->ri_state.rs_sleeping_on_ring = B_FALSE; in blk_ring_init()
189 ring->ri_state.rs_ring_up = B_FALSE; in blk_ring_init()
191 mutex_init(&ring->ri_state.rs_mutex, NULL, MUTEX_DRIVER, NULL); in blk_ring_init()
192 cv_init(&ring->ri_state.rs_cv, NULL, CV_DRIVER, NULL); in blk_ring_init()
194 e = blk_kstat_init(ring); in blk_ring_init()
200 if (xvdi_add_event_handler(ring->ri_dip, XS_OE_STATE, in blk_ring_init()
201 blk_oe_state_change, ring) != DDI_SUCCESS) { in blk_ring_init()
204 if (xvdi_add_event_handler(ring->ri_dip, XS_HP_STATE, in blk_ring_init()
205 blk_hp_state_change, ring) != DDI_SUCCESS) { in blk_ring_init()
212 if (xvdi_post_event(ring->ri_dip, XEN_HP_ADD) != DDI_SUCCESS) { in blk_ring_init()
214 ddi_get_name_addr(ring->ri_dip)); in blk_ring_init()
222 (void) xvdi_switch_state(ring->ri_dip, XBT_NULL, XenbusStateInitWait); in blk_ring_init()
224 *ringp = ring; in blk_ring_init()
228 xvdi_remove_event_handler(ring->ri_dip, XS_HP_STATE); in blk_ring_init()
230 xvdi_remove_event_handler(ring->ri_dip, XS_OE_STATE); in blk_ring_init()
232 blk_kstat_fini(ring); in blk_ring_init()
234 cv_destroy(&ring->ri_state.rs_cv); in blk_ring_init()
235 mutex_destroy(&ring->ri_state.rs_mutex); in blk_ring_init()
236 mutex_destroy(&ring->ri_mutex); in blk_ring_init()
237 kmem_free(ring, sizeof (struct blk_ring_s)); in blk_ring_init()
248 blk_ring_t ring; in blk_ring_fini() local
251 ring = *ringp; in blk_ring_fini()
253 mutex_enter(&ring->ri_mutex); in blk_ring_fini()
254 if (ring->ri_if_status != BLK_IF_DISCONNECTED) { in blk_ring_fini()
255 blk_ring_close(ring); in blk_ring_fini()
257 mutex_exit(&ring->ri_mutex); in blk_ring_fini()
259 xvdi_remove_event_handler(ring->ri_dip, NULL); in blk_ring_fini()
260 blk_kstat_fini(ring); in blk_ring_fini()
261 cv_destroy(&ring->ri_state.rs_cv); in blk_ring_fini()
262 mutex_destroy(&ring->ri_state.rs_mutex); in blk_ring_fini()
263 mutex_destroy(&ring->ri_mutex); in blk_ring_fini()
264 kmem_free(ring, sizeof (struct blk_ring_s)); in blk_ring_fini()
274 blk_kstat_init(blk_ring_t ring) in blk_kstat_init() argument
280 ring->ri_kstats = kstat_create(ddi_get_name(ring->ri_dip), in blk_kstat_init()
281 ddi_get_instance(ring->ri_dip), "req_statistics", "block", in blk_kstat_init()
283 if (ring->ri_kstats == NULL) { in blk_kstat_init()
287 ring->ri_kstats->ks_private = ring; in blk_kstat_init()
288 ring->ri_kstats->ks_update = blk_kstat_update; in blk_kstat_init()
290 knp = ring->ri_kstats->ks_data; in blk_kstat_init()
298 kstat_install(ring->ri_kstats); in blk_kstat_init()
308 blk_kstat_fini(blk_ring_t ring) in blk_kstat_fini() argument
310 kstat_delete(ring->ri_kstats); in blk_kstat_fini()
322 blk_ring_t ring; in blk_kstat_update() local
329 ring = ksp->ks_private; in blk_kstat_update()
330 stats = &ring->ri_stats; in blk_kstat_update()
356 blk_ring_t ring; in blk_oe_state_change() local
359 ring = (blk_ring_t)arg; in blk_oe_state_change()
362 mutex_enter(&ring->ri_mutex); in blk_oe_state_change()
364 if (blk_check_state_transition(ring, new_state) == DDI_FAILURE) { in blk_oe_state_change()
365 mutex_exit(&ring->ri_mutex); in blk_oe_state_change()
371 ASSERT(ring->ri_if_status == BLK_IF_UNKNOWN); in blk_oe_state_change()
374 ring->ri_fe_status = BLK_FE_READY; in blk_oe_state_change()
376 if (ring->ri_be_status == BLK_BE_READY) { in blk_oe_state_change()
377 mutex_exit(&ring->ri_mutex); in blk_oe_state_change()
378 if (blk_start_connect(ring) != DDI_SUCCESS) in blk_oe_state_change()
379 (void) blk_start_disconnect(ring); in blk_oe_state_change()
380 mutex_enter(&ring->ri_mutex); in blk_oe_state_change()
388 (void) xvdi_post_event(ring->ri_dip, XEN_HP_REMOVE); in blk_oe_state_change()
389 if (ring->ri_ringdown != NULL) { in blk_oe_state_change()
390 (*(ring->ri_ringdown))(ring->ri_ringdown_arg); in blk_oe_state_change()
392 blk_ring_close(ring); in blk_oe_state_change()
395 ring->ri_if_status = BLK_IF_UNKNOWN; in blk_oe_state_change()
396 ring->ri_be_status = BLK_BE_UNKNOWN; in blk_oe_state_change()
397 ring->ri_fe_status = BLK_FE_UNKNOWN; in blk_oe_state_change()
398 ring->ri_state.rs_sleeping_on_ring = B_FALSE; in blk_oe_state_change()
399 ring->ri_state.rs_ring_up = B_FALSE; in blk_oe_state_change()
406 mutex_exit(&ring->ri_mutex); in blk_oe_state_change()
419 blk_ring_t ring; in blk_hp_state_change() local
422 ring = (blk_ring_t)arg; in blk_hp_state_change()
425 mutex_enter(&ring->ri_mutex); in blk_hp_state_change()
428 if (ring->ri_be_status == BLK_BE_UNKNOWN) { in blk_hp_state_change()
429 ring->ri_be_status = BLK_BE_READY; in blk_hp_state_change()
430 if (ring->ri_fe_status == BLK_FE_READY) { in blk_hp_state_change()
431 mutex_exit(&ring->ri_mutex); in blk_hp_state_change()
433 if (blk_start_connect(ring) != DDI_SUCCESS) in blk_hp_state_change()
434 (void) blk_start_disconnect(ring); in blk_hp_state_change()
435 mutex_enter(&ring->ri_mutex); in blk_hp_state_change()
439 mutex_exit(&ring->ri_mutex); in blk_hp_state_change()
450 blk_check_state_transition(blk_ring_t ring, XenbusState oestate) in blk_check_state_transition() argument
452 switch (ring->ri_if_status) { in blk_check_state_transition()
454 if (ring->ri_fe_status == BLK_FE_UNKNOWN) { in blk_check_state_transition()
492 ddi_get_name_addr(ring->ri_dip), oestate, in blk_check_state_transition()
493 ring->ri_if_status); in blk_check_state_transition()
508 blk_start_connect(blk_ring_t ring) in blk_start_connect() argument
518 dip = ring->ri_dip; in blk_start_connect()
525 ASSERT(ring->ri_fe_status == BLK_FE_READY); in blk_start_connect()
526 ASSERT(ring->ri_be_status == BLK_BE_READY); in blk_start_connect()
533 ring->ri_fe = xvdi_get_oeid(dip); in blk_start_connect()
534 if (ring->ri_fe == (domid_t)-1) { in blk_start_connect()
543 e = blk_bindto_frontend(ring); in blk_start_connect()
547 ring->ri_if_status = BLK_IF_CONNECTED; in blk_start_connect()
549 e = ddi_add_intr(dip, 0, NULL, NULL, blk_intr, (caddr_t)ring); in blk_start_connect()
563 ddi_get_instance(ring->ri_dip)); in blk_start_connect()
605 mutex_enter(&ring->ri_state.rs_mutex); in blk_start_connect()
606 ring->ri_state.rs_ring_up = B_TRUE; in blk_start_connect()
607 if (ring->ri_state.rs_sleeping_on_ring) { in blk_start_connect()
608 ring->ri_state.rs_sleeping_on_ring = B_FALSE; in blk_start_connect()
609 cv_signal(&ring->ri_state.rs_cv); in blk_start_connect()
611 mutex_exit(&ring->ri_state.rs_mutex); in blk_start_connect()
613 if (ring->ri_ringup != NULL) { in blk_start_connect()
614 (*(ring->ri_ringup))(ring->ri_ringup_arg); in blk_start_connect()
626 blk_unbindfrom_frontend(ring); in blk_start_connect()
627 ring->ri_fe = (domid_t)-1; in blk_start_connect()
642 blk_start_disconnect(blk_ring_t ring) in blk_start_disconnect() argument
645 (void) xvdi_switch_state(ring->ri_dip, XBT_NULL, XenbusStateClosing); in blk_start_disconnect()
656 blk_ring_close(blk_ring_t ring) in blk_ring_close() argument
662 ASSERT(MUTEX_HELD(&ring->ri_mutex)); in blk_ring_close()
664 dip = ring->ri_dip; in blk_ring_close()
666 if (ring->ri_if_status != BLK_IF_CONNECTED) { in blk_ring_close()
670 ring->ri_if_status = BLK_IF_DISCONNECTED; in blk_ring_close()
671 mutex_exit(&ring->ri_mutex); in blk_ring_close()
676 blk_unbindfrom_frontend(ring); in blk_ring_close()
677 ring->ri_fe = (domid_t)-1; in blk_ring_close()
679 mutex_enter(&ring->ri_mutex); in blk_ring_close()
687 blk_bindto_frontend(blk_ring_t ring) in blk_bindto_frontend() argument
697 dip = ring->ri_dip; in blk_bindto_frontend()
721 ring->ri_protocol = BLKIF_PROTOCOL_NATIVE; in blk_bindto_frontend()
722 ring->ri_nentry = BLKIF_RING_SIZE; in blk_bindto_frontend()
723 ring->ri_entrysize = sizeof (union blkif_sring_entry); in blk_bindto_frontend()
725 ring->ri_protocol = BLKIF_PROTOCOL_X86_32; in blk_bindto_frontend()
726 ring->ri_nentry = BLKIF_X86_32_RING_SIZE; in blk_bindto_frontend()
727 ring->ri_entrysize = sizeof (union blkif_x86_32_sring_entry); in blk_bindto_frontend()
729 ring->ri_protocol = BLKIF_PROTOCOL_X86_64; in blk_bindto_frontend()
730 ring->ri_nentry = BLKIF_X86_64_RING_SIZE; in blk_bindto_frontend()
731 ring->ri_entrysize = sizeof (union blkif_x86_64_sring_entry); in blk_bindto_frontend()
740 e = xvdi_map_ring(dip, ring->ri_nentry, ring->ri_entrysize, gref, in blk_bindto_frontend()
741 &ring->ri_ring); in blk_bindto_frontend()
751 xvdi_unmap_ring(ring->ri_ring); in blk_bindto_frontend()
764 blk_unbindfrom_frontend(blk_ring_t ring) in blk_unbindfrom_frontend() argument
766 xvdi_free_evtchn(ring->ri_dip); in blk_unbindfrom_frontend()
767 xvdi_unmap_ring(ring->ri_ring); in blk_unbindfrom_frontend()
777 blk_ring_t ring; in blk_intr() local
779 ring = (blk_ring_t)arg; in blk_intr()
780 if (ring->ri_if_status != BLK_IF_CONNECTED) { in blk_intr()
784 (void) (*ring->ri_intr)(ring->ri_intr_arg); in blk_intr()
793 blk_ring_request_get(blk_ring_t ring, blkif_request_t *req) in blk_ring_request_get() argument
799 mutex_enter(&ring->ri_mutex); in blk_ring_request_get()
801 if (ring->ri_if_status != BLK_IF_CONNECTED) { in blk_ring_request_get()
802 mutex_exit(&ring->ri_mutex); in blk_ring_request_get()
806 src = xvdi_ring_get_request(ring->ri_ring); in blk_ring_request_get()
808 mutex_exit(&ring->ri_mutex); in blk_ring_request_get()
812 switch (ring->ri_protocol) { in blk_ring_request_get()
824 ddi_get_name_addr(ring->ri_dip), in blk_ring_request_get()
825 ring->ri_protocol); in blk_ring_request_get()
827 mutex_exit(&ring->ri_mutex); in blk_ring_request_get()
829 stats = &ring->ri_stats; in blk_ring_request_get()
855 blk_ring_request_requeue(blk_ring_t ring) in blk_ring_request_requeue() argument
857 mutex_enter(&ring->ri_mutex); in blk_ring_request_requeue()
859 if (ring->ri_if_status != BLK_IF_CONNECTED) { in blk_ring_request_requeue()
860 mutex_exit(&ring->ri_mutex); in blk_ring_request_requeue()
864 ring->ri_ring->xr_sring.br.req_cons--; in blk_ring_request_requeue()
866 mutex_exit(&ring->ri_mutex); in blk_ring_request_requeue()
874 blk_ring_response_put(blk_ring_t ring, blkif_response_t *src) in blk_ring_response_put() argument
880 mutex_enter(&ring->ri_mutex); in blk_ring_response_put()
882 if (ring->ri_if_status != BLK_IF_CONNECTED) { in blk_ring_response_put()
883 mutex_exit(&ring->ri_mutex); in blk_ring_response_put()
887 rsp = xvdi_ring_get_response(ring->ri_ring); in blk_ring_response_put()
890 switch (ring->ri_protocol) { in blk_ring_response_put()
902 ddi_get_name_addr(ring->ri_dip), in blk_ring_response_put()
903 ring->ri_protocol); in blk_ring_response_put()
906 e = xvdi_ring_push_response(ring->ri_ring); in blk_ring_response_put()
908 xvdi_notify_oe(ring->ri_dip); in blk_ring_response_put()
911 mutex_exit(&ring->ri_mutex); in blk_ring_response_put()