Lines Matching refs:dpsp

116 static void vlds_recvq_init(vlds_svc_info_t *dpsp);
117 static void vlds_recvq_destroy(vlds_svc_info_t *dpsp);
118 static int vlds_recvq_get_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen,
120 static void vlds_recvq_drain(vlds_svc_info_t *dpsp);
121 static int vlds_recvq_put_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen);
1352 vlds_svc_info_t *dpsp; in vlds_user_reg_cb() local
1363 dpsp = DS_MALLOC(sizeof (vlds_svc_info_t)); in vlds_user_reg_cb()
1364 vlds_recvq_init(dpsp); in vlds_user_reg_cb()
1365 ds_cbarg_set_drv_per_svc_ptr(arg, dpsp); in vlds_user_reg_cb()
1404 void *dpsp; in vlds_user_unreg_cb() local
1411 ds_cbarg_get_drv_per_svc_ptr(arg, &dpsp); in vlds_user_unreg_cb()
1412 if (dpsp) { in vlds_user_unreg_cb()
1415 vlds_recvq_drain(dpsp); in vlds_user_unreg_cb()
1416 vlds_recvq_destroy(dpsp); in vlds_user_unreg_cb()
1446 void *dpsp; in vlds_user_data_cb() local
1454 ds_cbarg_get_drv_per_svc_ptr(arg, &dpsp); in vlds_user_data_cb()
1455 ASSERT(dpsp != NULL); in vlds_user_data_cb()
1458 (void) vlds_recvq_put_data(dpsp, buf, buflen); in vlds_user_data_cb()
1483 vlds_recvq_init(vlds_svc_info_t *dpsp) in vlds_recvq_init() argument
1485 dpsp->state = VLDS_RECV_OK; in vlds_recvq_init()
1486 mutex_init(&dpsp->recv_lock, NULL, MUTEX_DRIVER, NULL); in vlds_recvq_init()
1487 cv_init(&dpsp->recv_cv, NULL, CV_DRIVER, NULL); in vlds_recvq_init()
1488 dpsp->recv_headp = NULL; in vlds_recvq_init()
1489 dpsp->recv_tailp = NULL; in vlds_recvq_init()
1490 dpsp->recv_size = 0; in vlds_recvq_init()
1491 dpsp->recv_cnt = 0; in vlds_recvq_init()
1495 vlds_recvq_destroy(vlds_svc_info_t *dpsp) in vlds_recvq_destroy() argument
1497 ASSERT(dpsp->state == VLDS_RECV_UNREG_PENDING); in vlds_recvq_destroy()
1498 ASSERT(dpsp->recv_size == 0); in vlds_recvq_destroy()
1499 ASSERT(dpsp->recv_cnt == 0); in vlds_recvq_destroy()
1500 ASSERT(dpsp->recv_headp == NULL); in vlds_recvq_destroy()
1501 ASSERT(dpsp->recv_tailp == NULL); in vlds_recvq_destroy()
1503 mutex_destroy(&dpsp->recv_lock); in vlds_recvq_destroy()
1504 cv_destroy(&dpsp->recv_cv); in vlds_recvq_destroy()
1505 DS_FREE(dpsp, sizeof (vlds_svc_info_t)); in vlds_recvq_destroy()
1509 vlds_recvq_get_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen, in vlds_recvq_get_data() argument
1516 mutex_enter(&dpsp->recv_lock); in vlds_recvq_get_data()
1517 while (dpsp->recv_size == 0) { in vlds_recvq_get_data()
1518 ASSERT(dpsp->recv_cnt == 0); in vlds_recvq_get_data()
1519 if (dpsp->state == VLDS_RECV_UNREG_PENDING) in vlds_recvq_get_data()
1522 if (dpsp->state == VLDS_RECV_OVERFLOW) { in vlds_recvq_get_data()
1525 dpsp->state = VLDS_RECV_OK; in vlds_recvq_get_data()
1526 mutex_exit(&dpsp->recv_lock); in vlds_recvq_get_data()
1533 mutex_exit(&dpsp->recv_lock); in vlds_recvq_get_data()
1537 dpsp->recv_nreaders += 1; in vlds_recvq_get_data()
1538 rv = cv_wait_sig(&dpsp->recv_cv, &dpsp->recv_lock); in vlds_recvq_get_data()
1539 dpsp->recv_nreaders -= 1; in vlds_recvq_get_data()
1542 mutex_exit(&dpsp->recv_lock); in vlds_recvq_get_data()
1546 if (dpsp->state == VLDS_RECV_UNREG_PENDING) { in vlds_recvq_get_data()
1548 cv_broadcast(&dpsp->recv_cv); in vlds_recvq_get_data()
1549 mutex_exit(&dpsp->recv_lock); in vlds_recvq_get_data()
1552 ASSERT(dpsp->recv_headp != NULL); in vlds_recvq_get_data()
1553 rhp = dpsp->recv_headp; in vlds_recvq_get_data()
1561 mutex_exit(&dpsp->recv_lock); in vlds_recvq_get_data()
1564 if (rhp == dpsp->recv_tailp) { in vlds_recvq_get_data()
1565 dpsp->recv_headp = NULL; in vlds_recvq_get_data()
1566 dpsp->recv_tailp = NULL; in vlds_recvq_get_data()
1568 dpsp->recv_headp = rhp->next; in vlds_recvq_get_data()
1569 ASSERT(dpsp->recv_headp != NULL); in vlds_recvq_get_data()
1571 ASSERT(dpsp->recv_cnt > 0); in vlds_recvq_get_data()
1572 dpsp->recv_size -= rhp->datasz; in vlds_recvq_get_data()
1573 dpsp->recv_cnt -= 1; in vlds_recvq_get_data()
1574 mutex_exit(&dpsp->recv_lock); in vlds_recvq_get_data()
1600 vlds_recvq_drain(vlds_svc_info_t *dpsp) in vlds_recvq_drain() argument
1604 mutex_enter(&dpsp->recv_lock); in vlds_recvq_drain()
1605 dpsp->state = VLDS_RECV_UNREG_PENDING; in vlds_recvq_drain()
1606 for (rhp = dpsp->recv_tailp; rhp != NULL; rhp = nextp) { in vlds_recvq_drain()
1611 dpsp->recv_headp = NULL; in vlds_recvq_drain()
1612 dpsp->recv_tailp = NULL; in vlds_recvq_drain()
1613 dpsp->recv_size = 0; in vlds_recvq_drain()
1614 dpsp->recv_cnt = 0; in vlds_recvq_drain()
1619 while (dpsp->recv_nreaders > 0) { in vlds_recvq_drain()
1620 cv_broadcast(&dpsp->recv_cv); in vlds_recvq_drain()
1621 mutex_exit(&dpsp->recv_lock); in vlds_recvq_drain()
1623 mutex_enter(&dpsp->recv_lock); in vlds_recvq_drain()
1626 mutex_exit(&dpsp->recv_lock); in vlds_recvq_drain()
1630 vlds_recvq_put_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen) in vlds_recvq_put_data() argument
1634 mutex_enter(&dpsp->recv_lock); in vlds_recvq_put_data()
1635 if (dpsp->state != VLDS_RECV_UNREG_PENDING) { in vlds_recvq_put_data()
1644 if ((dpsp->state == VLDS_RECV_OVERFLOW) || in vlds_recvq_put_data()
1645 ((dpsp->recv_cnt != 0) && in vlds_recvq_put_data()
1646 ((dpsp->recv_size + buflen) > vlds_recvq_maxsize) || in vlds_recvq_put_data()
1647 ((dpsp->recv_cnt + 1) > vlds_recvq_maxmsg))) { in vlds_recvq_put_data()
1650 dpsp->state = VLDS_RECV_OVERFLOW; in vlds_recvq_put_data()
1651 cv_broadcast(&dpsp->recv_cv); in vlds_recvq_put_data()
1652 mutex_exit(&dpsp->recv_lock); in vlds_recvq_put_data()
1664 if (dpsp->recv_headp == NULL) { in vlds_recvq_put_data()
1665 dpsp->recv_headp = rhp; in vlds_recvq_put_data()
1666 dpsp->recv_tailp = rhp; in vlds_recvq_put_data()
1668 dpsp->recv_tailp->next = rhp; in vlds_recvq_put_data()
1669 dpsp->recv_tailp = rhp; in vlds_recvq_put_data()
1671 dpsp->recv_size += rhp->datasz; in vlds_recvq_put_data()
1672 dpsp->recv_cnt += 1; in vlds_recvq_put_data()
1673 cv_broadcast(&dpsp->recv_cv); in vlds_recvq_put_data()
1675 mutex_exit(&dpsp->recv_lock); in vlds_recvq_put_data()
1683 void *dpsp; in vlds_recv_msg() local
1698 ds_cbarg_get_drv_per_svc_ptr(cbarg, &dpsp); in vlds_recv_msg()
1699 if (dpsp == NULL) { in vlds_recv_msg()
1704 rv = vlds_recvq_get_data(dpsp, buf, buflen, msglenp, mode); in vlds_recv_msg()