Print this page
XXXX adding PID information to netstat output
*** 473,482 ****
--- 473,484 ----
list_create(&so->so_acceptq_list, sizeof (struct sonode),
offsetof(struct sonode, so_acceptq_node));
list_create(&so->so_acceptq_defer, sizeof (struct sonode),
offsetof(struct sonode, so_acceptq_node));
+ list_create(&so->so_pid_list, sizeof (pid_node_t),
+ offsetof(pid_node_t, pn_ref_link));
list_link_init(&so->so_acceptq_node);
so->so_acceptq_len = 0;
so->so_backlog = 0;
so->so_listener = NULL;
*** 488,497 ****
--- 490,500 ----
so->so_filter_top = NULL;
so->so_filter_bottom = NULL;
mutex_init(&so->so_lock, NULL, MUTEX_DEFAULT, NULL);
mutex_init(&so->so_acceptq_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&so->so_pid_list_lock, NULL, MUTEX_DEFAULT, NULL);
rw_init(&so->so_fallback_rwlock, NULL, RW_DEFAULT, NULL);
cv_init(&so->so_state_cv, NULL, CV_DEFAULT, NULL);
cv_init(&so->so_single_cv, NULL, CV_DEFAULT, NULL);
cv_init(&so->so_read_cv, NULL, CV_DEFAULT, NULL);
*** 518,527 ****
--- 521,531 ----
ASSERT(so->so_rcv_q_head == NULL);
list_destroy(&so->so_acceptq_list);
list_destroy(&so->so_acceptq_defer);
+ list_destroy(&so->so_pid_list);
ASSERT(!list_link_active(&so->so_acceptq_node));
ASSERT(so->so_listener == NULL);
ASSERT(so->so_filter_active == 0);
ASSERT(so->so_filter_tx == 0);
*** 533,542 ****
--- 537,547 ----
vn_free(vp);
mutex_destroy(&so->so_lock);
mutex_destroy(&so->so_acceptq_lock);
+ mutex_destroy(&so->so_pid_list_lock);
rw_destroy(&so->so_fallback_rwlock);
cv_destroy(&so->so_state_cv);
cv_destroy(&so->so_single_cv);
cv_destroy(&so->so_read_cv);
*** 624,633 ****
--- 629,639 ----
void
sonode_fini(struct sonode *so)
{
vnode_t *vp;
+ pid_node_t *pn;
ASSERT(so->so_count == 0);
if (so->so_rcv_timer_tid) {
ASSERT(MUTEX_NOT_HELD(&so->so_lock));
*** 652,666 ****
--- 658,724 ----
}
/* Detach and destroy filters */
if (so->so_filter_top != NULL)
sof_sonode_cleanup(so);
+ mutex_enter(&so->so_pid_list_lock);
+ while ((pn = list_head(&so->so_pid_list)) != NULL) {
+ list_remove(&so->so_pid_list, pn);
+ kmem_free(pn, sizeof (*pn));
+ }
+ mutex_exit(&so->so_pid_list_lock);
+
ASSERT(list_is_empty(&so->so_acceptq_list));
ASSERT(list_is_empty(&so->so_acceptq_defer));
ASSERT(!list_link_active(&so->so_acceptq_node));
ASSERT(so->so_rcv_queued == 0);
ASSERT(so->so_rcv_q_head == NULL);
ASSERT(so->so_rcv_q_last_head == NULL);
ASSERT(so->so_rcv_head == NULL);
ASSERT(so->so_rcv_last_head == NULL);
}
+
+ void
+ sonode_insert_pid(struct sonode *so, pid_t pid)
+ {
+ pid_node_t *pn;
+
+ mutex_enter(&so->so_pid_list_lock);
+ for (pn = list_head(&so->so_pid_list);
+ pn != NULL && pn->pn_pid != pid;
+ pn = list_next(&so->so_pid_list, pn))
+ ;
+
+ if (pn != NULL) {
+ pn->pn_count++;
+ } else {
+ pn = kmem_zalloc(sizeof (*pn), KM_SLEEP);
+ list_link_init(&pn->pn_ref_link);
+ pn->pn_pid = pid;
+ pn->pn_count = 1;
+ list_insert_tail(&so->so_pid_list, pn);
+ }
+ mutex_exit(&so->so_pid_list_lock);
+ }
+
+ void
+ sonode_remove_pid(struct sonode *so, pid_t pid)
+ {
+ pid_node_t *pn;
+
+ mutex_enter(&so->so_pid_list_lock);
+ for (pn = list_head(&so->so_pid_list);
+ pn != NULL && pn->pn_pid != pid;
+ pn = list_next(&so->so_pid_list, pn))
+ ;
+
+ if (pn != NULL) {
+ if (pn->pn_count > 1) {
+ pn->pn_count--;
+ } else {
+ list_remove(&so->so_pid_list, pn);
+ kmem_free(pn, sizeof (*pn));
+ }
+ }
+ mutex_exit(&so->so_pid_list_lock);
+ }