Lines Matching refs:seg
452 static int rsm_closeconnection(rsmseg_t *seg, void **cookie);
453 static int rsm_unpublish(rsmseg_t *seg, int mode);
454 static int rsm_unbind(rsmseg_t *seg);
462 int rsm_disconnect(rsmseg_t *seg);
1742 rsmsharecv_signal(rsmseg_t *seg, int oldstate, int newstate) in rsmsharecv_signal() argument
1744 ASSERT(rsmsharelock_held(seg)); in rsmsharecv_signal()
1746 if (seg->s_share->rsmsi_state == oldstate) { in rsmsharecv_signal()
1747 seg->s_share->rsmsi_state = newstate; in rsmsharecv_signal()
1748 cv_broadcast(&seg->s_share->rsmsi_cv); in rsmsharecv_signal()
1831 rsmseg_free(rsmseg_t *seg) in rsmseg_free() argument
1839 rsmseglock_acquire(seg); in rsmseg_free()
1840 if (seg->s_ckl != NULL) { in rsmseg_free()
1842 seg->s_state = RSM_STATE_END; in rsmseg_free()
1843 rsmseglock_release(seg); in rsmseg_free()
1849 rsmseglock_release(seg); in rsmseg_free()
1851 ASSERT(seg->s_state == RSM_STATE_END || seg->s_state == RSM_STATE_NEW); in rsmseg_free()
1858 if (seg->s_share != NULL) { in rsmseg_free()
1860 ASSERT(seg->s_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsmseg_free()
1862 rsmsharelock_acquire(seg); in rsmseg_free()
1864 ASSERT(seg->s_share->rsmsi_refcnt > 0); in rsmseg_free()
1866 seg->s_share->rsmsi_refcnt--; in rsmseg_free()
1868 if (seg->s_share->rsmsi_refcnt == 0) { in rsmseg_free()
1869 rsmsharelock_release(seg); in rsmseg_free()
1870 mutex_destroy(&seg->s_share->rsmsi_lock); in rsmseg_free()
1871 cv_destroy(&seg->s_share->rsmsi_cv); in rsmseg_free()
1872 kmem_free((void *)(seg->s_share), in rsmseg_free()
1875 rsmsharelock_release(seg); in rsmseg_free()
1881 seg->s_share = NULL; in rsmseg_free()
1884 cv_destroy(&seg->s_cv); in rsmseg_free()
1885 mutex_destroy(&seg->s_lock); in rsmseg_free()
1886 rsmacl_free(seg->s_acl, seg->s_acl_len); in rsmseg_free()
1887 rsmpiacl_free(seg->s_acl_in, seg->s_acl_len); in rsmseg_free()
1888 if (seg->s_adapter) in rsmseg_free()
1889 rsmka_release_adapter(seg->s_adapter); in rsmseg_free()
1891 kmem_free((void *)seg, sizeof (*seg)); in rsmseg_free()
1997 rsmseg_close(rsmseg_t *seg, int force_flag) in rsmseg_close() argument
2005 rsmseglock_acquire(seg); in rsmseg_close()
2006 if (!force_flag && (seg->s_hdr.rsmrc_type == in rsmseg_close()
2014 while (seg->s_flags & RSM_FORCE_DESTROY_WAIT) { in rsmseg_close()
2015 cv_wait(&seg->s_cv, &seg->s_lock); in rsmseg_close()
2018 rsmseglock_release(seg); in rsmseg_close()
2021 switch (seg->s_state) { in rsmseg_close()
2025 e = rsm_unpublish(seg, 1); in rsmseg_close()
2030 e = rsm_unbind(seg); in rsmseg_close()
2033 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_EXPORT_SEGMENT); in rsmseg_close()
2036 rsmseglock_acquire(seg); in rsmseg_close()
2037 seg->s_state = RSM_STATE_NEW; in rsmseg_close()
2038 cv_broadcast(&seg->s_cv); in rsmseg_close()
2039 rsmseglock_release(seg); in rsmseg_close()
2060 rsmseglock_acquire(seg); in rsmseg_close()
2061 seg->s_state = RSM_STATE_NEW; in rsmseg_close()
2062 rsmseglock_release(seg); in rsmseg_close()
2070 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsmseg_close()
2071 (void) rsm_disconnect(seg); in rsmseg_close()
2077 "Invalid segment state %d in rsm_close\n", seg->s_state)); in rsmseg_close()
2081 "Invalid segment state %d in rsm_close\n", seg->s_state)); in rsmseg_close()
2090 ASSERT(seg->s_state == RSM_STATE_NEW); in rsmseg_close()
2102 rsmseglock_acquire(seg); in rsmseg_close()
2103 seg->s_state = RSM_STATE_ZOMBIE; in rsmseg_close()
2104 rsmseglock_release(seg); in rsmseg_close()
2106 rsmseg_free(seg); in rsmseg_close()
2286 rsm_unbind_pages(rsmseg_t *seg) in rsm_unbind_pages() argument
2292 ASSERT(rsmseglock_held(seg)); in rsm_unbind_pages()
2294 if (seg->s_cookie != NULL) { in rsm_unbind_pages()
2296 ddi_umem_unlock(seg->s_cookie); in rsm_unbind_pages()
2297 rsm_dec_pgcnt(btopr(seg->s_len)); in rsm_unbind_pages()
2298 seg->s_cookie = NULL; in rsm_unbind_pages()
2308 rsm_bind(rsmseg_t *seg, rsm_ioctlmsg_t *msg, intptr_t dataptr, int mode) in rsm_bind() argument
2338 rsmseglock_acquire(seg); in rsm_bind()
2340 while (seg->s_state == RSM_STATE_NEW_QUIESCED) { in rsm_bind()
2341 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsm_bind()
2345 rsmseglock_release(seg); in rsm_bind()
2350 ASSERT(seg->s_state == RSM_STATE_NEW); in rsm_bind()
2352 ASSERT(seg->s_cookie == NULL); in rsm_bind()
2354 e = rsm_bind_pages(&seg->s_cookie, msg->vaddr, msg->len, curproc); in rsm_bind()
2356 seg->s_flags |= RSM_USER_MEMORY; in rsm_bind()
2358 seg->s_flags |= RSMKA_ALLOW_UNBIND_REBIND; in rsm_bind()
2361 seg->s_flags |= RSMKA_SET_RESOURCE_DONTWAIT; in rsm_bind()
2363 seg->s_region.r_vaddr = msg->vaddr; in rsm_bind()
2376 seg->s_pid = ddi_get_pid(); in rsm_bind()
2377 seg->s_len = msg->len; in rsm_bind()
2378 seg->s_state = RSM_STATE_BIND; in rsm_bind()
2379 seg->s_adapter = adapter; in rsm_bind()
2380 seg->s_proc = curproc; in rsm_bind()
2387 msg->rnum = seg->s_minor; in rsm_bind()
2389 rsmseglock_release(seg); in rsm_bind()
2439 rsmseg_t *seg = (rsmseg_t *)p; in rsm_remap_local_importers() local
2440 rsmseglock_acquire(seg); in rsm_remap_local_importers()
2449 if ((seg->s_segid == ex_segid) && (seg->s_node == src_nodeid) && in rsm_remap_local_importers()
2450 (seg->s_state == RSM_STATE_ACTIVE)) { in rsm_remap_local_importers()
2451 seg->s_cookie = cookie; in rsm_remap_local_importers()
2453 rsmseglock_release(seg); in rsm_remap_local_importers()
2462 rsm_rebind(rsmseg_t *seg, rsm_ioctlmsg_t *msg) in rsm_rebind() argument
2472 if (!(seg->s_flags & RSMKA_ALLOW_UNBIND_REBIND)) { in rsm_rebind()
2476 if (seg->s_pid != ddi_get_pid() && in rsm_rebind()
2491 if (msg->len != seg->s_len) { in rsm_rebind()
2498 rsmseglock_acquire(seg); in rsm_rebind()
2500 while ((seg->s_state == RSM_STATE_BIND_QUIESCED) || in rsm_rebind()
2501 (seg->s_state == RSM_STATE_EXPORT_QUIESCING) || in rsm_rebind()
2502 (seg->s_state == RSM_STATE_EXPORT_QUIESCED)) { in rsm_rebind()
2503 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsm_rebind()
2504 rsmseglock_release(seg); in rsm_rebind()
2512 if ((seg->s_state != RSM_STATE_BIND) && in rsm_rebind()
2513 (seg->s_state != RSM_STATE_EXPORT)) { in rsm_rebind()
2515 rsmseglock_release(seg); in rsm_rebind()
2521 ASSERT(seg->s_cookie != NULL); in rsm_rebind()
2523 if (msg->vaddr == seg->s_region.r_vaddr) { in rsm_rebind()
2524 rsmseglock_release(seg); in rsm_rebind()
2542 adapter = seg->s_adapter; in rsm_rebind()
2544 seg->s_handle.out, 0, &mem, in rsm_rebind()
2552 (void) rsm_unbind_pages(seg); in rsm_rebind()
2553 seg->s_cookie = cookie; in rsm_rebind()
2554 seg->s_region.r_vaddr = msg->vaddr; in rsm_rebind()
2555 rsm_remap_local_importers(my_nodeid, seg->s_segid, in rsm_rebind()
2578 rsmseglock_release(seg); in rsm_rebind()
2586 rsm_unbind(rsmseg_t *seg) in rsm_unbind() argument
2592 rsmseglock_acquire(seg); in rsm_unbind()
2595 if ((seg->s_state != RSM_STATE_BIND) && in rsm_unbind()
2596 (seg->s_state != RSM_STATE_BIND_QUIESCED)) { in rsm_unbind()
2597 rsmseglock_release(seg); in rsm_unbind()
2604 (void) rsm_unbind_pages(seg); in rsm_unbind()
2606 if (seg->s_state == RSM_STATE_BIND) { in rsm_unbind()
2607 seg->s_state = RSM_STATE_NEW; in rsm_unbind()
2608 } else if (seg->s_state == RSM_STATE_BIND_QUIESCED) { in rsm_unbind()
2609 seg->s_state = RSM_STATE_NEW_QUIESCED; in rsm_unbind()
2612 rsmseglock_release(seg); in rsm_unbind()
2769 rsmseg_t *seg; in rsmsegacl_validate() local
2782 seg = rsmexport_lookup(key); in rsmsegacl_validate()
2783 if (!seg) { in rsmsegacl_validate()
2789 ASSERT(rsmseglock_held(seg)); in rsmsegacl_validate()
2790 ASSERT(seg->s_state == RSM_STATE_EXPORT); in rsmsegacl_validate()
2799 if (seg->s_acl_len > 0) { in rsmsegacl_validate()
2803 ASSERT(seg->s_acl != NULL); in rsmsegacl_validate()
2804 for (i = 0; i < seg->s_acl_len; i++) { in rsmsegacl_validate()
2805 if (seg->s_acl[i].ae_node == rnode) { in rsmsegacl_validate()
2806 perm &= seg->s_acl[i].ae_permission; in rsmsegacl_validate()
2811 rsmseglock_release(seg); in rsmsegacl_validate()
2817 perm &= seg->s_mode; in rsmsegacl_validate()
2823 reply->rsmipc_uid = seg->s_uid; in rsmsegacl_validate()
2824 reply->rsmipc_gid = seg->s_gid; in rsmsegacl_validate()
2825 reply->rsmipc_segid = seg->s_segid; in rsmsegacl_validate()
2826 reply->rsmipc_seglen = seg->s_len; in rsmsegacl_validate()
2831 rsmseglock_release(seg); in rsmsegacl_validate()
2849 rsm_publish(rsmseg_t *seg, rsm_ioctlmsg_t *msg, intptr_t dataptr, int mode) in rsm_publish() argument
2867 if (seg->s_adapter == &loopback_adapter) in rsm_publish()
2870 if (seg->s_pid != ddi_get_pid() && in rsm_publish()
2928 e = rsmexport_add(seg, segment_id); in rsm_publish()
2936 seg->s_segid = segment_id; in rsm_publish()
2938 if ((seg->s_state != RSM_STATE_BIND) && in rsm_publish()
2939 (seg->s_state != RSM_STATE_BIND_QUIESCED)) { in rsm_publish()
2941 rsmseglock_release(seg); in rsm_publish()
2942 rsmexport_rm(seg); in rsm_publish()
2946 seg->s_state)); in rsm_publish()
2964 xbuf = ddi_umem_iosetup(seg->s_cookie, 0, seg->s_len, B_WRITE, in rsm_publish()
2973 adapter = seg->s_adapter; in rsm_publish()
2980 rsmseglock_release(seg); in rsm_publish()
2981 rsmexport_rm(seg); in rsm_publish()
2989 if (seg->s_state == RSM_STATE_BIND) { in rsm_publish()
2994 if (seg->s_flags & RSMKA_ALLOW_UNBIND_REBIND) { in rsm_publish()
2998 if (seg->s_flags & RSMKA_SET_RESOURCE_DONTWAIT) { in rsm_publish()
3006 &seg->s_handle.out, seg->s_len, in rsm_publish()
3017 rsmseglock_release(seg); in rsm_publish()
3018 rsmexport_rm(seg); in rsm_publish()
3037 seg->s_handle.out, in rsm_publish()
3039 seg->s_segid, in rsm_publish()
3043 adapter->rsmpi_ops->rsm_seg_destroy(seg->s_handle.out); in rsm_publish()
3044 rsmseglock_release(seg); in rsm_publish()
3045 rsmexport_rm(seg); in rsm_publish()
3055 seg->s_acl_in = rsmpi_acl; in rsm_publish()
3059 seg->s_acl_len = acl_len; in rsm_publish()
3060 seg->s_acl = acl; in rsm_publish()
3062 if (seg->s_state == RSM_STATE_BIND) { in rsm_publish()
3063 seg->s_state = RSM_STATE_EXPORT; in rsm_publish()
3064 } else if (seg->s_state == RSM_STATE_BIND_QUIESCED) { in rsm_publish()
3065 seg->s_state = RSM_STATE_EXPORT_QUIESCED; in rsm_publish()
3066 cv_broadcast(&seg->s_cv); in rsm_publish()
3069 rsmseglock_release(seg); in rsm_publish()
3104 rsm_republish(rsmseg_t *seg, rsm_ioctlmsg_t *msg, int mode) in rsm_republish() argument
3118 if ((seg->s_state != RSM_STATE_EXPORT) && in rsm_republish()
3119 (seg->s_state != RSM_STATE_EXPORT_QUIESCED) && in rsm_republish()
3120 (seg->s_state != RSM_STATE_EXPORT_QUIESCING)) in rsm_republish()
3123 if (seg->s_pid != ddi_get_pid() && in rsm_republish()
3130 if (seg->s_adapter == &loopback_adapter) in rsm_republish()
3144 rsmseglock_acquire(seg); in rsm_republish()
3150 while (((seg->s_state == RSM_STATE_EXPORT) && in rsm_republish()
3151 (seg->s_flags & RSM_REPUBLISH_WAIT)) || in rsm_republish()
3152 (seg->s_state == RSM_STATE_EXPORT_QUIESCED) || in rsm_republish()
3153 (seg->s_state == RSM_STATE_EXPORT_QUIESCING)) { in rsm_republish()
3154 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsm_republish()
3157 rsmseglock_release(seg); in rsm_republish()
3164 if (seg->s_state != RSM_STATE_EXPORT) { in rsm_republish()
3165 rsmseglock_release(seg); in rsm_republish()
3170 key = seg->s_key; in rsm_republish()
3171 old_acl = seg->s_acl; in rsm_republish()
3172 old_acl_len = seg->s_acl_len; in rsm_republish()
3174 seg->s_acl = new_acl; in rsm_republish()
3175 seg->s_acl_len = new_acl_len; in rsm_republish()
3181 adapter = seg->s_adapter; in rsm_republish()
3188 seg->s_acl = old_acl; in rsm_republish()
3189 seg->s_acl_len = old_acl_len; in rsm_republish()
3190 rsmseglock_release(seg); in rsm_republish()
3196 rsmpi_old_acl = seg->s_acl_in; in rsm_republish()
3197 seg->s_acl_in = rsmpi_new_acl; in rsm_republish()
3199 e = adapter->rsmpi_ops->rsm_republish(seg->s_handle.out, in rsm_republish()
3200 seg->s_acl_in, seg->s_acl_len, in rsm_republish()
3204 seg->s_acl = old_acl; in rsm_republish()
3205 seg->s_acl_in = rsmpi_old_acl; in rsm_republish()
3206 seg->s_acl_len = old_acl_len; in rsm_republish()
3207 rsmseglock_release(seg); in rsm_republish()
3235 permission = seg->s_mode; in rsm_republish()
3239 seg->s_flags |= RSM_REPUBLISH_WAIT; in rsm_republish()
3241 rsmseglock_release(seg); in rsm_republish()
3246 rsmseglock_acquire(seg); in rsm_republish()
3247 seg->s_flags &= ~RSM_REPUBLISH_WAIT; in rsm_republish()
3249 cv_broadcast(&seg->s_cv); in rsm_republish()
3250 rsmseglock_release(seg); in rsm_republish()
3261 rsm_unpublish(rsmseg_t *seg, int mode) in rsm_unpublish() argument
3272 if (seg->s_pid != ddi_get_pid() && in rsm_unpublish()
3279 rsmseglock_acquire(seg); in rsm_unpublish()
3286 while ((seg->s_state == RSM_STATE_EXPORT_QUIESCING) || in rsm_unpublish()
3287 ((seg->s_state == RSM_STATE_EXPORT) && (seg->s_rdmacnt > 0))) { in rsm_unpublish()
3288 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsm_unpublish()
3289 rsmseglock_release(seg); in rsm_unpublish()
3298 if ((seg->s_state != RSM_STATE_EXPORT) && in rsm_unpublish()
3299 (seg->s_state != RSM_STATE_EXPORT_QUIESCED)) { in rsm_unpublish()
3300 rsmseglock_release(seg); in rsm_unpublish()
3302 "rsm_unpublish done: bad state %x\n", seg->s_state)); in rsm_unpublish()
3306 rsmseglock_release(seg); in rsm_unpublish()
3308 rsmexport_rm(seg); in rsm_unpublish()
3310 rsm_send_importer_disconnects(seg->s_segid, my_nodeid); in rsm_unpublish()
3312 rsmseglock_acquire(seg); in rsm_unpublish()
3316 while ((seg->s_state == RSM_STATE_EXPORT) && in rsm_unpublish()
3317 (seg->s_flags & RSM_REPUBLISH_WAIT)) { in rsm_unpublish()
3318 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsm_unpublish()
3321 rsmseglock_release(seg); in rsm_unpublish()
3326 if ((seg->s_state != RSM_STATE_EXPORT) && in rsm_unpublish()
3327 (seg->s_state != RSM_STATE_EXPORT_QUIESCED)) { in rsm_unpublish()
3330 rsmseglock_release(seg); in rsm_unpublish()
3342 acl = seg->s_acl; in rsm_unpublish()
3349 if (seg->s_state == RSM_STATE_EXPORT_QUIESCED) in rsm_unpublish()
3352 adapter = seg->s_adapter; in rsm_unpublish()
3354 if (seg->s_state != RSM_STATE_EXPORT) { in rsm_unpublish()
3355 rsmseglock_release(seg); in rsm_unpublish()
3358 seg->s_state)); in rsm_unpublish()
3363 e = adapter->rsmpi_ops->rsm_unpublish(seg->s_handle.out); in rsm_unpublish()
3373 seg->s_flags |= RSM_EXPORT_WAIT; in rsm_unpublish()
3381 (void) cv_reltimedwait(&seg->s_cv, &seg->s_lock, in rsm_unpublish()
3387 seg->s_flags &= ~RSM_EXPORT_WAIT; in rsm_unpublish()
3392 seg->s_state = RSM_STATE_BIND; in rsm_unpublish()
3394 rsmseglock_release(seg); in rsm_unpublish()
3400 e = adapter->rsmpi_ops->rsm_seg_destroy(seg->s_handle.out); in rsm_unpublish()
3405 seg->s_key, e)); in rsm_unpublish()
3409 acl = seg->s_acl; in rsm_unpublish()
3410 rsmpi_acl = seg->s_acl_in; in rsm_unpublish()
3411 acl_len = seg->s_acl_len; in rsm_unpublish()
3413 seg->s_acl = NULL; in rsm_unpublish()
3414 seg->s_acl_in = NULL; in rsm_unpublish()
3415 seg->s_acl_len = 0; in rsm_unpublish()
3417 if (seg->s_state == RSM_STATE_EXPORT) { in rsm_unpublish()
3418 seg->s_state = RSM_STATE_BIND; in rsm_unpublish()
3419 } else if (seg->s_state == RSM_STATE_EXPORT_QUIESCED) { in rsm_unpublish()
3420 seg->s_state = RSM_STATE_BIND_QUIESCED; in rsm_unpublish()
3421 cv_broadcast(&seg->s_cv); in rsm_unpublish()
3424 rsmseglock_release(seg); in rsm_unpublish()
3666 rsmseg_t *seg = (rsmseg_t *)p; in rsm_force_unload() local
3667 if ((seg->s_segid == ex_segid) && (seg->s_node == src_nodeid)) { in rsm_force_unload()
3677 rsmseglock_acquire(seg); in rsm_force_unload()
3679 seg->s_flags |= RSM_FORCE_DISCONNECT; in rsm_force_unload()
3680 rsmseg_unload(seg); in rsm_force_unload()
4022 rsmseg_t *seg; in rsm_intr_event() local
4032 if ((seg = msg->rsmipc_segment_cookie) != NULL) { in rsm_intr_event()
4043 seg = (rsmseg_t *)p; in rsm_intr_event()
4044 rsmseglock_acquire(seg); in rsm_intr_event()
4046 atomic_inc_32(&seg->s_pollevent); in rsm_intr_event()
4048 if (seg->s_pollflag & RSM_SEGMENT_POLL) in rsm_intr_event()
4049 pollwakeup(&seg->s_poll, POLLRDNORM); in rsm_intr_event()
4051 rsmseglock_release(seg); in rsm_intr_event()
4058 seg = rsmexport_lookup(msg->rsmipc_key); in rsm_intr_event()
4059 if (!seg) { in rsm_intr_event()
4065 ASSERT(rsmseglock_held(seg)); in rsm_intr_event()
4067 atomic_inc_32(&seg->s_pollevent); in rsm_intr_event()
4075 if (seg->s_pollflag & RSM_SEGMENT_POLL) in rsm_intr_event()
4076 pollwakeup(&seg->s_poll, POLLRDNORM); in rsm_intr_event()
4078 rsmseglock_release(seg); in rsm_intr_event()
4094 rsmseg_t *seg; in importer_update() local
4111 seg = (rsmseg_t *)p; in importer_update()
4113 rsmseglock_acquire(seg); in importer_update()
4114 rsmsharelock_acquire(seg); in importer_update()
4115 seg->s_share->rsmsi_mode = perm; in importer_update()
4116 rsmsharelock_release(seg); in importer_update()
4117 rsmseglock_release(seg); in importer_update()
4184 rsmseg_t *seg; in exporter_quiesce() local
4201 seg = (rsmseg_t *)current; in exporter_quiesce()
4202 rsmseglock_acquire(seg); in exporter_quiesce()
4205 adapter = seg->s_adapter; in exporter_quiesce()
4210 if ((seg->s_acl == NULL) || in exporter_quiesce()
4211 (seg->s_acl[0].ae_node != my_nodeid) || in exporter_quiesce()
4212 (seg->s_acl[0].ae_permission != 0)) { in exporter_quiesce()
4215 seg->s_handle.out); in exporter_quiesce()
4220 seg->s_handle.out); in exporter_quiesce()
4227 (void) rsm_unbind_pages(seg); in exporter_quiesce()
4228 seg->s_state = RSM_STATE_EXPORT_QUIESCED; in exporter_quiesce()
4229 cv_broadcast(&seg->s_cv); in exporter_quiesce()
4231 rsmseglock_release(seg); in exporter_quiesce()
4263 rsmseg_t *seg; in importer_suspend() local
4293 seg = (rsmseg_t *)curp; in importer_suspend()
4295 rsmseglock_acquire(seg); in importer_suspend()
4297 if ((seg->s_node != first->s_node) || in importer_suspend()
4298 (seg->s_key != first->s_key) || in importer_suspend()
4299 (seg->s_state == RSM_STATE_DISCONNECT)) { in importer_suspend()
4304 rsmseglock_release(seg); in importer_suspend()
4308 rsmseg_suspend(seg, &susp_flg); in importer_suspend()
4311 rsmseglock_release(seg); in importer_suspend()
4316 rsmsharelock_acquire(seg); in importer_suspend()
4322 seg->s_share->rsmsi_refcnt) { in importer_suspend()
4323 rsmsharelock_release(seg); in importer_suspend()
4324 rsmseglock_release(seg); in importer_suspend()
4327 rsmsharelock_release(seg); in importer_suspend()
4328 rsmseglock_release(seg); in importer_suspend()
4338 rsmsegshare_suspend(seg); in importer_suspend()
4355 rsmseg_suspend(rsmseg_t *seg, int *susp_flg) in rsmseg_suspend() argument
4363 "rsmseg_suspend enter: key=%u\n", seg->s_key)); in rsmseg_suspend()
4367 ASSERT(rsmseglock_held(seg)); in rsmseg_suspend()
4369 while (seg->s_rdmacnt > 0) in rsmseg_suspend()
4370 cv_wait(&seg->s_cv, &seg->s_lock); in rsmseg_suspend()
4377 seg->s_key, seg->s_state)); in rsmseg_suspend()
4379 switch (seg->s_state) { in rsmseg_suspend()
4384 seg->s_state = RSM_STATE_ABORT_CONNECT; in rsmseg_suspend()
4389 seg->s_handle.in = NULL; in rsmseg_suspend()
4390 seg->s_state = RSM_STATE_CONN_QUIESCE; in rsmseg_suspend()
4394 while (seg->s_state == RSM_STATE_MAPPING) in rsmseg_suspend()
4395 cv_wait(&seg->s_cv, &seg->s_lock); in rsmseg_suspend()
4400 if (seg->s_ckl != NULL) { in rsmseg_suspend()
4401 hdl = seg->s_ckl; in rsmseg_suspend()
4407 seg->s_mapinfo = NULL; in rsmseg_suspend()
4408 seg->s_state = RSM_STATE_MAP_QUIESCE; in rsmseg_suspend()
4427 rsmsegshare_suspend(rsmseg_t *seg) in rsmsegshare_suspend() argument
4438 rsmseglock_acquire(seg); in rsmsegshare_suspend()
4439 rsmsharelock_acquire(seg); in rsmsegshare_suspend()
4441 sharedp = seg->s_share; in rsmsegshare_suspend()
4442 adapter = seg->s_adapter; in rsmsegshare_suspend()
4471 e = adapter->rsmpi_ops->rsm_unmap(seg->s_handle.in); in rsmsegshare_suspend()
4495 rsmsharelock_release(seg); in rsmsegshare_suspend()
4496 rsmseglock_release(seg); in rsmsegshare_suspend()
4524 rsmseg_t *seg = (rsmseg_t *)p; in importer_resume() local
4526 rsmseglock_acquire(seg); in importer_resume()
4529 if (seg->s_node != src_node) { in importer_resume()
4530 rsmseglock_release(seg); in importer_resume()
4534 if (rsmseg_resume(seg, &cookie) != RSM_SUCCESS) { in importer_resume()
4543 request.rsmipc_key = seg->s_segid; in importer_resume()
4545 rsmseglock_release(seg); in importer_resume()
4546 (void) rsmipc_send(seg->s_node, &request, in importer_resume()
4549 rsmseglock_release(seg); in importer_resume()
4560 rsmseg_resume(rsmseg_t *seg, void **cookie) in rsmseg_resume() argument
4574 "rsmseg_resume enter: key=%u\n", seg->s_key)); in rsmseg_resume()
4578 ASSERT(rsmseglock_held(seg)); in rsmseg_resume()
4580 if ((seg->s_state != RSM_STATE_CONN_QUIESCE) && in rsmseg_resume()
4581 (seg->s_state != RSM_STATE_MAP_QUIESCE)) { in rsmseg_resume()
4585 sharedp = seg->s_share; in rsmseg_resume()
4587 rsmsharelock_acquire(seg); in rsmseg_resume()
4590 retc = rsmsegshare_resume(seg); in rsmseg_resume()
4592 if (seg->s_state == RSM_STATE_CONN_QUIESCE) { in rsmseg_resume()
4597 seg->s_handle.in = sharedp->rsmsi_handle; in rsmseg_resume()
4598 rsmsharelock_release(seg); in rsmseg_resume()
4599 seg->s_state = RSM_STATE_CONNECT; in rsmseg_resume()
4602 seg->s_handle.in = NULL; in rsmseg_resume()
4603 seg->s_state = RSM_STATE_DISCONNECT; in rsmseg_resume()
4610 rsmsharelock_release(seg); in rsmseg_resume()
4619 rsmsharelock_release(seg); in rsmseg_resume()
4625 seg->s_share = NULL; in rsmseg_resume()
4629 cv_broadcast(&seg->s_cv); in rsmseg_resume()
4632 "rsmseg_resume done:state=%d\n", seg->s_state)); in rsmseg_resume()
4636 ASSERT(seg->s_state == RSM_STATE_MAP_QUIESCE); in rsmseg_resume()
4640 if (seg->s_mode & RSM_PERM_READ) { in rsmseg_resume()
4643 if (seg->s_mode & RSM_PERM_WRITE) { in rsmseg_resume()
4651 ASSERT(seg->s_ckl != NULL); in rsmseg_resume()
4653 for (hdl = seg->s_ckl; hdl != NULL; hdl = hdl->c_next) { in rsmseg_resume()
4662 seg->s_handle.in = NULL; in rsmseg_resume()
4663 seg->s_state = RSM_STATE_DISCONNECT; in rsmseg_resume()
4668 seg->s_mapinfo = NULL; in rsmseg_resume()
4672 rsmsharelock_release(seg); in rsmseg_resume()
4681 rsmsharelock_release(seg); in rsmseg_resume()
4687 seg->s_share = NULL; in rsmseg_resume()
4690 cv_broadcast(&seg->s_cv); in rsmseg_resume()
4694 seg->s_key, retc)); in rsmseg_resume()
4699 seg->s_handle.in = sharedp->rsmsi_handle; in rsmseg_resume()
4701 if (seg->s_node == my_nodeid) { /* loopback */ in rsmseg_resume()
4702 ASSERT(seg->s_mapinfo == NULL); in rsmseg_resume()
4704 for (hdl = seg->s_ckl; hdl != NULL; hdl = hdl->c_next) { in rsmseg_resume()
4706 rsm_dip, seg->s_cookie, in rsmseg_resume()
4715 seg->s_mapinfo = sharedp->rsmsi_mapinfo; in rsmseg_resume()
4717 for (hdl = seg->s_ckl; hdl != NULL; hdl = hdl->c_next) { in rsmseg_resume()
4718 p = rsm_get_mapinfo(seg, hdl->c_off, hdl->c_len, in rsmseg_resume()
4729 rsmsharelock_release(seg); in rsmseg_resume()
4731 seg->s_state = RSM_STATE_ACTIVE; in rsmseg_resume()
4732 cv_broadcast(&seg->s_cv); in rsmseg_resume()
4740 rsmsegshare_resume(rsmseg_t *seg) in rsmsegshare_resume() argument
4750 ASSERT(rsmseglock_held(seg)); in rsmsegshare_resume()
4751 ASSERT(rsmsharelock_held(seg)); in rsmsegshare_resume()
4753 sharedp = seg->s_share; in rsmsegshare_resume()
4765 adapter = seg->s_adapter; in rsmsegshare_resume()
4847 (void) seg->s_adapter->rsmpi_ops-> in rsmsegshare_resume()
6086 rsm_connect(rsmseg_t *seg, rsm_ioctlmsg_t *msg, cred_t *cred, in rsm_connect() argument
6117 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsm_connect()
6118 ASSERT(seg->s_state == RSM_STATE_NEW); in rsm_connect()
6135 seg->s_node = msg->nodeid; in rsm_connect()
6141 e = rsmimport_add(seg, msg->key); in rsm_connect()
6148 seg->s_state = RSM_STATE_CONNECTING; in rsm_connect()
6155 seg->s_adapter = adapter; in rsm_connect()
6157 rsmseglock_release(seg); in rsm_connect()
6163 sharedp = rsmshare_get(msg->key, msg->nodeid, adapter, seg); in rsm_connect()
6165 ASSERT(rsmsharelock_held(seg)); in rsm_connect()
6191 rsmsharelock_release(seg); in rsm_connect()
6192 rsmimport_rm(seg); in rsm_connect()
6193 seg->s_adapter = NULL; in rsm_connect()
6195 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6226 rsmsharelock_release(seg); in rsm_connect()
6232 rsmsharelock_acquire(seg); in rsm_connect()
6233 rsmsharecv_signal(seg, RSMSI_STATE_CONNECTING, in rsm_connect()
6235 rsmsharelock_release(seg); in rsm_connect()
6236 rsmimport_rm(seg); in rsm_connect()
6237 seg->s_adapter = NULL; in rsm_connect()
6239 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6264 rsmsharelock_acquire(seg); in rsm_connect()
6265 rsmsharecv_signal(seg, RSMSI_STATE_CONNECTING, in rsm_connect()
6267 rsmsharelock_release(seg); in rsm_connect()
6268 rsmimport_rm(seg); in rsm_connect()
6269 seg->s_adapter = NULL; in rsm_connect()
6271 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6278 rsmsharelock_acquire(seg); in rsm_connect()
6279 rsmsharecv_signal(seg, RSMSI_STATE_CONNECTING, in rsm_connect()
6281 rsmsharelock_release(seg); in rsm_connect()
6282 rsmimport_rm(seg); in rsm_connect()
6283 seg->s_adapter = NULL; in rsm_connect()
6285 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6292 rsmsharelock_acquire(seg); in rsm_connect()
6301 rsmsharelock_release(seg); in rsm_connect()
6310 rsmseglock_acquire(seg); in rsm_connect()
6311 rsmsharelock_acquire(seg); in rsm_connect()
6312 ASSERT(seg->s_state == RSM_STATE_CONNECTING || in rsm_connect()
6313 seg->s_state == RSM_STATE_ABORT_CONNECT); in rsm_connect()
6317 if ((seg->s_state == RSM_STATE_ABORT_CONNECT) || in rsm_connect()
6319 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6320 seg->s_adapter = NULL; in rsm_connect()
6321 rsmsharelock_release(seg); in rsm_connect()
6322 rsmseglock_release(seg); in rsm_connect()
6323 rsmimport_rm(seg); in rsm_connect()
6326 rsmsharelock_acquire(seg); in rsm_connect()
6333 rsmsharelock_release(seg); in rsm_connect()
6337 rsmsharelock_acquire(seg); in rsm_connect()
6344 rsmsharelock_release(seg); in rsm_connect()
6359 rsmsharelock_release(seg); in rsm_connect()
6360 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6361 seg->s_adapter = NULL; in rsm_connect()
6362 rsmseglock_release(seg); in rsm_connect()
6363 rsmimport_rm(seg); in rsm_connect()
6369 rsmsharelock_acquire(seg); in rsm_connect()
6371 rsmsharelock_release(seg); in rsm_connect()
6376 rsmsharelock_acquire(seg); in rsm_connect()
6380 rsmsharelock_release(seg); in rsm_connect()
6388 seg->s_segid = sharedp->rsmsi_segid; in rsm_connect()
6389 seg->s_len = sharedp->rsmsi_seglen; in rsm_connect()
6390 seg->s_mode = access & sharedp->rsmsi_mode; in rsm_connect()
6391 seg->s_pid = ddi_get_pid(); in rsm_connect()
6392 seg->s_mapinfo = NULL; in rsm_connect()
6394 if (seg->s_node != my_nodeid) { in rsm_connect()
6398 addr, seg->s_segid, &sharedp->rsmsi_handle); in rsm_connect()
6401 seg->s_state = RSM_STATE_NEW; in rsm_connect()
6402 seg->s_adapter = NULL; in rsm_connect()
6403 rsmsharelock_release(seg); in rsm_connect()
6404 rsmseglock_release(seg); in rsm_connect()
6405 rsmimport_rm(seg); in rsm_connect()
6424 rsmsharelock_acquire(seg); in rsm_connect()
6427 rsmsharelock_release(seg); in rsm_connect()
6442 seg->s_handle.in = sharedp->rsmsi_handle; in rsm_connect()
6446 seg->s_state = RSM_STATE_CONNECT; in rsm_connect()
6449 seg->s_flags &= ~RSM_IMPORT_DUMMY; /* clear dummy flag */ in rsm_connect()
6452 atomic_inc_16(bar_va + seg->s_hdr.rsmrc_num); in rsm_connect()
6454 msg->off = (int)seg->s_hdr.rsmrc_num; in rsm_connect()
6462 msg->rnum = seg->s_minor; in rsm_connect()
6463 rsmsharecv_signal(seg, RSMSI_STATE_CONNECTING, RSMSI_STATE_CONNECTED); in rsm_connect()
6464 rsmsharelock_release(seg); in rsm_connect()
6465 rsmseglock_release(seg); in rsm_connect()
6502 rsm_unmap(rsmseg_t *seg) in rsm_unmap() argument
6510 "rsm_unmap enter %u\n", seg->s_segid)); in rsm_unmap()
6512 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsm_unmap()
6515 ASSERT(rsmseglock_held(seg)); in rsm_unmap()
6516 ASSERT(seg->s_state != RSM_STATE_MAPPING); in rsm_unmap()
6518 if ((seg->s_state != RSM_STATE_ACTIVE) && in rsm_unmap()
6519 (seg->s_state != RSM_STATE_MAP_QUIESCE)) { in rsm_unmap()
6525 sharedp = seg->s_share; in rsm_unmap()
6527 rsmsharelock_acquire(seg); in rsm_unmap()
6550 adapter = seg->s_adapter; in rsm_unmap()
6551 if (seg->s_node != my_nodeid) { in rsm_unmap()
6566 rsmsharelock_release(seg); in rsm_unmap()
6581 seg->s_cookie = NULL; in rsm_unmap()
6583 seg->s_mapinfo = NULL; in rsm_unmap()
6585 if (seg->s_state == RSM_STATE_ACTIVE) in rsm_unmap()
6586 seg->s_state = RSM_STATE_CONNECT; in rsm_unmap()
6588 seg->s_state = RSM_STATE_CONN_QUIESCE; in rsm_unmap()
6601 rsm_closeconnection(rsmseg_t *seg, void **cookie) in rsm_closeconnection() argument
6613 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsm_closeconnection()
6616 ASSERT(rsmseglock_held(seg)); in rsm_closeconnection()
6618 if (seg->s_state == RSM_STATE_DISCONNECT) { in rsm_closeconnection()
6625 while (seg->s_rdmacnt > 0) { in rsm_closeconnection()
6626 cv_wait(&seg->s_cv, &seg->s_lock); in rsm_closeconnection()
6629 (void) rsm_unmap(seg); in rsm_closeconnection()
6631 ASSERT(seg->s_state == RSM_STATE_CONNECT || in rsm_closeconnection()
6632 seg->s_state == RSM_STATE_CONN_QUIESCE); in rsm_closeconnection()
6634 adapter = seg->s_adapter; in rsm_closeconnection()
6635 sharedp = seg->s_share; in rsm_closeconnection()
6639 rsmsharelock_acquire(seg); in rsm_closeconnection()
6662 seg->s_key, e)); in rsm_closeconnection()
6667 seg->s_handle.in = NULL; in rsm_closeconnection()
6675 rsmsharelock_release(seg); in rsm_closeconnection()
6683 rsmsharelock_release(seg); in rsm_closeconnection()
6688 atomic_inc_16(bar_va + seg->s_hdr.rsmrc_num); in rsm_closeconnection()
6695 seg->s_share = NULL; in rsm_closeconnection()
6697 seg->s_state = RSM_STATE_DISCONNECT; in rsm_closeconnection()
6699 cv_broadcast(&seg->s_cv); in rsm_closeconnection()
6708 rsm_disconnect(rsmseg_t *seg) in rsm_disconnect() argument
6716 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsm_disconnect()
6719 ASSERT(!rsmseglock_held(seg)); in rsm_disconnect()
6723 rsmimport_rm(seg); in rsm_disconnect()
6726 rsmseglock_acquire(seg); in rsm_disconnect()
6729 while (seg->s_state == RSM_STATE_MAPPING) in rsm_disconnect()
6730 cv_wait(&seg->s_cv, &seg->s_lock); in rsm_disconnect()
6732 if (seg->s_state == RSM_STATE_DISCONNECT) { in rsm_disconnect()
6733 seg->s_state = RSM_STATE_NEW; in rsm_disconnect()
6734 rsmseglock_release(seg); in rsm_disconnect()
6740 (void) rsm_closeconnection(seg, &shared_cookie); in rsm_disconnect()
6743 seg->s_state = RSM_STATE_NEW; in rsm_disconnect()
6751 request.rsmipc_key = seg->s_segid; in rsm_disconnect()
6753 rsmseglock_release(seg); in rsm_disconnect()
6754 (void) rsmipc_send(seg->s_node, &request, RSM_NO_REPLY); in rsm_disconnect()
6756 rsmseglock_release(seg); in rsm_disconnect()
6771 rsmseg_t *seg; in rsm_chpoll() local
6792 seg = (rsmseg_t *)res; in rsm_chpoll()
6794 if (seg->s_pollevent) { in rsm_chpoll()
6798 *phpp = &seg->s_poll; in rsm_chpoll()
6799 seg->s_pollflag |= RSM_SEGMENT_POLL; in rsm_chpoll()
6814 rsmseg_t *seg; in rsmresource_seg() local
6821 seg = (rsmseg_t *)res; in rsmresource_seg()
6824 seg = rsmseg_alloc(rnum, credp); in rsmresource_seg()
6838 seg->s_state = RSM_STATE_NEW_QUIESCED; in rsmresource_seg()
6843 rsmresource_insert(rnum, (rsmresource_t *)seg, type); in rsmresource_seg()
6848 return (seg); in rsmresource_seg()
6852 rsmexport_ioctl(rsmseg_t *seg, rsm_ioctlmsg_t *msg, int cmd, intptr_t arg, in rsmexport_ioctl() argument
6863 ASSERT(seg != NULL); in rsmexport_ioctl()
6867 error = rsm_bind(seg, msg, arg, mode); in rsmexport_ioctl()
6870 error = rsm_rebind(seg, msg); in rsmexport_ioctl()
6876 error = rsm_publish(seg, msg, arg, mode); in rsmexport_ioctl()
6879 error = rsm_republish(seg, msg, mode); in rsmexport_ioctl()
6882 error = rsm_unpublish(seg, 1); in rsmexport_ioctl()
6895 rsmimport_ioctl(rsmseg_t *seg, rsm_ioctlmsg_t *msg, int cmd, intptr_t arg, in rsmimport_ioctl() argument
6903 ASSERT(seg); in rsmimport_ioctl()
6907 error = rsm_connect(seg, msg, credp, arg, mode); in rsmimport_ioctl()
6920 rsmbar_ioctl(rsmseg_t *seg, rsm_ioctlmsg_t *msg, int cmd, intptr_t arg, in rsmbar_ioctl() argument
6930 if ((seg->s_flags & RSM_IMPORT_DUMMY) != 0) { in rsmbar_ioctl()
6934 } else if (seg->s_node == my_nodeid) { in rsmbar_ioctl()
6940 adapter = seg->s_adapter; in rsmbar_ioctl()
7001 exportbell_ioctl(rsmseg_t *seg, int cmd /*ARGSUSED*/) in exportbell_ioctl() argument
7010 request.rsmipc_key = seg->s_segid; in exportbell_ioctl()
7013 e = rsmipc_send(seg->s_node, &request, RSM_NO_REPLY); in exportbell_ioctl()
7025 importbell_ioctl(rsmseg_t *seg, int cmd /*ARGSUSED*/) in importbell_ioctl() argument
7035 ASSERT(seg->s_state != RSM_STATE_NEW && in importbell_ioctl()
7036 seg->s_state != RSM_STATE_NEW_QUIESCED); in importbell_ioctl()
7038 request.rsmipc_key = seg->s_segid; in importbell_ioctl()
7041 index = rsmhash(seg->s_segid); in importbell_ioctl()
7046 if (seg->s_key == token->key) { in importbell_ioctl()
7264 rsmseg_t *seg; in rsm_consumeevent_ioctl() local
7280 seg = (rsmseg_t *)rsmresource_lookup(rnum, RSM_LOCK); in rsm_consumeevent_ioctl()
7281 if (seg) { in rsm_consumeevent_ioctl()
7284 seg)); in rsm_consumeevent_ioctl()
7285 if (seg->s_pollevent) { in rsm_consumeevent_ioctl()
7287 atomic_dec_32(&seg->s_pollevent); in rsm_consumeevent_ioctl()
7290 rsmseglock_release(seg); in rsm_consumeevent_ioctl()
7962 rsmseg_t *seg; in rsm_ioctl() local
8096 seg = rsmresource_seg(res, rnum, credp, in rsm_ioctl()
8098 if (seg->s_type == RSM_RESOURCE_EXPORT_SEGMENT) { in rsm_ioctl()
8099 error = rsmexport_ioctl(seg, &msg, cmd, arg, mode, in rsm_ioctl()
8107 seg = rsmresource_seg(res, rnum, credp, in rsm_ioctl()
8109 if (seg->s_type == RSM_RESOURCE_IMPORT_SEGMENT) { in rsm_ioctl()
8110 error = rsmimport_ioctl(seg, &msg, cmd, arg, mode, in rsm_ioctl()
8149 rsm_get_mapinfo(rsmseg_t *seg, off_t off, size_t len, off_t *dev_offset, in rsm_get_mapinfo() argument
8167 p = seg->s_mapinfo; in rsm_get_mapinfo()
8199 rsmseg_t *seg; in rsmmap_map() local
8214 seg = (rsmseg_t *)res; in rsmmap_map()
8216 rsmseglock_acquire(seg); in rsmmap_map()
8218 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsmmap_map()
8228 p->c_next = seg->s_ckl; in rsmmap_map()
8229 seg->s_ckl = p; in rsmmap_map()
8231 *pvtp = (void *)seg; in rsmmap_map()
8233 rsmseglock_release(seg); in rsmmap_map()
8249 rsmseg_t *seg = (rsmseg_t *)pvt; in rsmmap_access() local
8254 rsmseglock_acquire(seg); in rsmmap_access()
8256 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsmmap_access()
8258 while (seg->s_state == RSM_STATE_MAP_QUIESCE) { in rsmmap_access()
8259 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsmmap_access()
8262 rsmseglock_release(seg); in rsmmap_access()
8267 ASSERT(seg->s_state == RSM_STATE_DISCONNECT || in rsmmap_access()
8268 seg->s_state == RSM_STATE_ACTIVE); in rsmmap_access()
8270 if (seg->s_state == RSM_STATE_DISCONNECT) in rsmmap_access()
8271 seg->s_flags |= RSM_IMPORT_DUMMY; in rsmmap_access()
8276 rsmseglock_release(seg); in rsmmap_access()
8292 rsmseg_t *seg = (rsmseg_t *)oldpvt; in rsmmap_dup() local
8303 rsmseglock_acquire(seg); in rsmmap_dup()
8305 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsmmap_dup()
8310 for (old = seg->s_ckl; old != NULL; old = old->c_next) { in rsmmap_dup()
8318 rsmseglock_release(seg); in rsmmap_dup()
8327 p->c_next = seg->s_ckl; in rsmmap_dup()
8328 seg->s_ckl = p; in rsmmap_dup()
8330 *newpvt = (void *)seg; in rsmmap_dup()
8332 rsmseglock_release(seg); in rsmmap_dup()
8347 rsmseg_t *seg = (rsmseg_t *)pvtp; in rsmmap_unmap() local
8357 rsmseglock_acquire(seg); in rsmmap_unmap()
8359 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsmmap_unmap()
8371 rsmcookie_t *tmp, **back = &seg->s_ckl; in rsmmap_unmap()
8394 if ((seg->s_ckl == NULL) && (seg->s_state != RSM_STATE_MAPPING)) in rsmmap_unmap()
8395 (void) rsm_unmap(seg); in rsmmap_unmap()
8397 if (seg->s_state == RSM_STATE_END && seg->s_ckl == NULL) { in rsmmap_unmap()
8403 rsmseglock_release(seg); in rsmmap_unmap()
8407 rsmseg_free(seg); in rsmmap_unmap()
8429 rsmseg_t *seg; in rsm_devmap() local
8439 seg = (rsmseg_t *)rsmresource_lookup(rnum, RSM_NOLOCK); in rsm_devmap()
8440 ASSERT(seg != NULL); in rsm_devmap()
8442 if (seg->s_hdr.rsmrc_type == RSM_RESOURCE_BAR) { in rsm_devmap()
8475 ASSERT(seg->s_hdr.rsmrc_type == RSM_RESOURCE_IMPORT_SEGMENT); in rsm_devmap()
8476 ASSERT(seg->s_state == RSM_STATE_MAPPING); in rsm_devmap()
8482 if (seg->s_mode & RSM_PERM_READ) { in rsm_devmap()
8486 if (seg->s_mode & RSM_PERM_WRITE) { in rsm_devmap()
8501 if (seg->s_node != my_nodeid) { in rsm_devmap()
8504 p = rsm_get_mapinfo(seg, off, len, &dev_offset, &cur_len); in rsm_devmap()
8533 seg->s_cookie, off, len, maxprot, in rsm_devmap()
8563 rsmseg_t *seg, *eseg; in rsm_segmap() local
8574 seg = (rsmseg_t *)rsmresource_lookup(rnum, RSM_LOCK); in rsm_segmap()
8576 if (seg == NULL) { in rsm_segmap()
8587 if (seg->s_hdr.rsmrc_type == RSM_RESOURCE_BAR) { in rsm_segmap()
8588 rsmseglock_release(seg); in rsm_segmap()
8617 if (seg->s_hdr.rsmrc_type != RSM_RESOURCE_IMPORT_SEGMENT) { in rsm_segmap()
8618 rsmseglock_release(seg); in rsm_segmap()
8624 ASSERT(seg->s_hdr.rsmrc_num == rnum); in rsm_segmap()
8627 while (seg->s_state == RSM_STATE_CONN_QUIESCE) { in rsm_segmap()
8628 if (cv_wait_sig(&seg->s_cv, &seg->s_lock) == 0) { in rsm_segmap()
8629 rsmseglock_release(seg); in rsm_segmap()
8637 while (seg->s_state == RSM_STATE_MAPPING) in rsm_segmap()
8638 cv_wait(&seg->s_cv, &seg->s_lock); in rsm_segmap()
8646 if ((seg->s_state != RSM_STATE_CONNECT) && in rsm_segmap()
8647 (seg->s_state != RSM_STATE_ACTIVE)) { in rsm_segmap()
8648 rsmseglock_release(seg); in rsm_segmap()
8658 if ((size_t)off + ptob(btopr(len)) > seg->s_len) { in rsm_segmap()
8659 rsmseglock_release(seg); in rsm_segmap()
8669 if (seg->s_mode & RSM_PERM_READ) { in rsm_segmap()
8673 if (seg->s_mode & RSM_PERM_WRITE) { in rsm_segmap()
8679 rsmseglock_release(seg); in rsm_segmap()
8685 old_state = seg->s_state; in rsm_segmap()
8687 ASSERT(seg->s_share != NULL); in rsm_segmap()
8689 rsmsharelock_acquire(seg); in rsm_segmap()
8691 sharedp = seg->s_share; in rsm_segmap()
8698 rsmsharelock_release(seg); in rsm_segmap()
8699 rsmseglock_release(seg); in rsm_segmap()
8710 if (seg->s_node != my_nodeid) { in rsm_segmap()
8716 size_t length_to_map = seg->s_len; in rsm_segmap()
8726 adapter = seg->s_adapter; in rsm_segmap()
8733 while (total_length_mapped < seg->s_len) { in rsm_segmap()
8737 seg->s_handle.in, tmp_off, in rsm_segmap()
8761 seg->s_mapinfo = sharedp->rsmsi_mapinfo; in rsm_segmap()
8770 (void) seg->s_adapter->rsmpi_ops-> in rsm_segmap()
8777 rsmsharelock_release(seg); in rsm_segmap()
8778 rsmseglock_release(seg); in rsm_segmap()
8797 seg->s_mapinfo = sharedp->rsmsi_mapinfo; in rsm_segmap()
8802 rsmsharelock_release(seg); in rsm_segmap()
8805 seg->s_state = RSM_STATE_MAPPING; in rsm_segmap()
8806 rsmseglock_release(seg); in rsm_segmap()
8811 rsmseglock_acquire(seg); in rsm_segmap()
8812 ASSERT(seg->s_state == RSM_STATE_MAPPING); in rsm_segmap()
8815 seg->s_state = RSM_STATE_ACTIVE; in rsm_segmap()
8817 rsmsharelock_acquire(seg); in rsm_segmap()
8832 rsmsharelock_release(seg); in rsm_segmap()
8833 seg->s_state = old_state; in rsm_segmap()
8837 cv_broadcast(&seg->s_cv); in rsm_segmap()
8838 rsmseglock_release(seg); in rsm_segmap()
8860 rsmsharelock_release(seg); in rsm_segmap()
8881 seg->s_state = RSM_STATE_MAPPING; in rsm_segmap()
8882 rsmseglock_release(seg); in rsm_segmap()
8884 eseg = rsmexport_lookup(seg->s_key); in rsm_segmap()
8887 rsmseglock_acquire(seg); in rsm_segmap()
8893 seg->s_state = old_state; in rsm_segmap()
8894 cv_broadcast(&seg->s_cv); in rsm_segmap()
8895 rsmseglock_release(seg); in rsm_segmap()
8897 "rsm_segmap done: key %d not found\n", seg->s_key)); in rsm_segmap()
8901 rsmsharelock_acquire(seg); in rsm_segmap()
8907 rsmsharelock_release(seg); in rsm_segmap()
8917 seg->s_cookie = eseg->s_cookie; in rsm_segmap()
8924 rsmseglock_acquire(seg); in rsm_segmap()
8925 ASSERT(seg->s_state == RSM_STATE_MAPPING); in rsm_segmap()
8927 seg->s_state = RSM_STATE_ACTIVE; in rsm_segmap()
8929 rsmsharelock_acquire(seg); in rsm_segmap()
8938 rsmsharelock_release(seg); in rsm_segmap()
8939 seg->s_state = old_state; in rsm_segmap()
8940 seg->s_cookie = NULL; in rsm_segmap()
8942 cv_broadcast(&seg->s_cv); in rsm_segmap()
8943 rsmseglock_release(seg); in rsm_segmap()