Print this page
XXXX adding PID information to netstat output

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/os/strsubr.c
          +++ new/usr/src/uts/common/os/strsubr.c
↓ open down ↓ 643 lines elided ↑ open up ↑
 644  644   */
 645  645  /* ARGSUSED */
 646  646  static int
 647  647  stream_head_constructor(void *buf, void *cdrarg, int kmflags)
 648  648  {
 649  649          stdata_t *stp = buf;
 650  650  
 651  651          mutex_init(&stp->sd_lock, NULL, MUTEX_DEFAULT, NULL);
 652  652          mutex_init(&stp->sd_reflock, NULL, MUTEX_DEFAULT, NULL);
 653  653          mutex_init(&stp->sd_qlock, NULL, MUTEX_DEFAULT, NULL);
      654 +        mutex_init(&stp->sd_pid_list_lock, NULL, MUTEX_DEFAULT, NULL);
 654  655          cv_init(&stp->sd_monitor, NULL, CV_DEFAULT, NULL);
 655  656          cv_init(&stp->sd_iocmonitor, NULL, CV_DEFAULT, NULL);
 656  657          cv_init(&stp->sd_refmonitor, NULL, CV_DEFAULT, NULL);
 657  658          cv_init(&stp->sd_qcv, NULL, CV_DEFAULT, NULL);
 658  659          cv_init(&stp->sd_zcopy_wait, NULL, CV_DEFAULT, NULL);
      660 +        list_create(&stp->sd_pid_list, sizeof (pid_node_t),
      661 +                offsetof(pid_node_t, pn_ref_link));
 659  662          stp->sd_wrq = NULL;
 660  663  
 661  664          return (0);
 662  665  }
 663  666  
 664  667  /* ARGSUSED */
 665  668  static void
 666  669  stream_head_destructor(void *buf, void *cdrarg)
 667  670  {
 668  671          stdata_t *stp = buf;
 669  672  
 670  673          mutex_destroy(&stp->sd_lock);
 671  674          mutex_destroy(&stp->sd_reflock);
 672  675          mutex_destroy(&stp->sd_qlock);
      676 +        mutex_destroy(&stp->sd_pid_list_lock);
 673  677          cv_destroy(&stp->sd_monitor);
 674  678          cv_destroy(&stp->sd_iocmonitor);
 675  679          cv_destroy(&stp->sd_refmonitor);
 676  680          cv_destroy(&stp->sd_qcv);
 677  681          cv_destroy(&stp->sd_zcopy_wait);
      682 +        list_destroy(&stp->sd_pid_list);
 678  683  }
 679  684  
 680  685  /*
 681  686   * Constructor/destructor routines for the queue cache
 682  687   */
 683  688  /* ARGSUSED */
 684  689  static int
 685  690  queue_constructor(void *buf, void *cdrarg, int kmflags)
 686  691  {
 687  692          queinfo_t *qip = buf;
↓ open down ↓ 2611 lines elided ↑ open up ↑
3299 3304          stp->sd_rderrfunc = stp->sd_wrerrfunc = NULL;
3300 3305          stp->sd_rputdatafunc = stp->sd_wputdatafunc = NULL;
3301 3306          stp->sd_ciputctrl = NULL;
3302 3307          stp->sd_nciputctrl = 0;
3303 3308          stp->sd_qhead = NULL;
3304 3309          stp->sd_qtail = NULL;
3305 3310          stp->sd_servid = NULL;
3306 3311          stp->sd_nqueues = 0;
3307 3312          stp->sd_svcflags = 0;
3308 3313          stp->sd_copyflag = 0;
     3314 +        sh_insert_pid(stp, curproc);
3309 3315  
3310 3316          return (stp);
3311 3317  }
3312 3318  
3313 3319  /*
3314 3320   * Free a stream head.
3315 3321   */
3316 3322  void
3317 3323  shfree(stdata_t *stp)
3318 3324  {
     3325 +        pid_node_t *pn;
     3326 +
3319 3327          ASSERT(MUTEX_NOT_HELD(&stp->sd_lock));
3320 3328  
3321 3329          stp->sd_wrq = NULL;
3322 3330  
3323 3331          mutex_enter(&stp->sd_qlock);
3324 3332          while (stp->sd_svcflags & STRS_SCHEDULED) {
3325 3333                  STRSTAT(strwaits);
3326 3334                  cv_wait(&stp->sd_qcv, &stp->sd_qlock);
3327 3335          }
3328 3336          mutex_exit(&stp->sd_qlock);
↓ open down ↓ 3 lines elided ↑ open up ↑
3332 3340                  SUMCHECK_CIPUTCTRL_COUNTS(stp->sd_ciputctrl,
3333 3341                      stp->sd_nciputctrl, 0);
3334 3342                  ASSERT(ciputctrl_cache != NULL);
3335 3343                  kmem_cache_free(ciputctrl_cache, stp->sd_ciputctrl);
3336 3344                  stp->sd_ciputctrl = NULL;
3337 3345                  stp->sd_nciputctrl = 0;
3338 3346          }
3339 3347          ASSERT(stp->sd_qhead == NULL);
3340 3348          ASSERT(stp->sd_qtail == NULL);
3341 3349          ASSERT(stp->sd_nqueues == 0);
     3350 +
     3351 +        mutex_enter(&stp->sd_pid_list_lock);
     3352 +        while ((pn = list_head(&stp->sd_pid_list)) != NULL) {
     3353 +                list_remove(&stp->sd_pid_list, pn);
     3354 +                kmem_free(pn, sizeof (*pn));
     3355 +        }
     3356 +        mutex_exit(&stp->sd_pid_list_lock);
     3357 +
3342 3358          kmem_cache_free(stream_head_cache, stp);
     3359 +}
     3360 +
     3361 +void
     3362 +sh_insert_pid(struct stdata *stp, proc_t *p)
     3363 +{
     3364 +        pid_node_t      *pn;
     3365 +
     3366 +        mutex_enter(&stp->sd_pid_list_lock);
     3367 +        pn = list_head(&stp->sd_pid_list);
     3368 +        while (pn != NULL && pn->pn_pid != p->p_pidp->pid_id) {
     3369 +                pn = list_next(&stp->sd_pid_list, pn);
     3370 +        }
     3371 +
     3372 +        if (pn != NULL) {
     3373 +                pn->pn_count++;
     3374 +        } else {
     3375 +                pn = kmem_zalloc(sizeof (*pn), KM_SLEEP);
     3376 +                list_link_init(&pn->pn_ref_link);
     3377 +                pn->pn_pid = p->p_pidp->pid_id;
     3378 +                pn->pn_count = 1;
     3379 +                list_insert_tail(&stp->sd_pid_list, pn);
     3380 +        }
     3381 +        mutex_exit(&stp->sd_pid_list_lock);
     3382 +}
     3383 +void
     3384 +sh_remove_pid(struct stdata *stp, proc_t *p)
     3385 +{
     3386 +        pid_node_t *pn;
     3387 +
     3388 +        mutex_enter(&stp->sd_pid_list_lock);
     3389 +        pn = list_head(&stp->sd_pid_list);
     3390 +        while (pn != NULL && pn->pn_pid != p->p_pidp->pid_id) {
     3391 +                pn = list_next(&stp->sd_pid_list, pn);
     3392 +        }
     3393 +
     3394 +        if (pn != NULL) {
     3395 +                if (pn->pn_count > 1)
     3396 +                        pn->pn_count--;
     3397 +                else {
     3398 +                        list_remove(&stp->sd_pid_list, pn);
     3399 +                        kmem_free(pn, sizeof (*pn));
     3400 +                }
     3401 +        }
     3402 +        mutex_exit(&stp->sd_pid_list_lock);
     3403 +}
     3404 +
     3405 +conn_pid_node_list_hdr_t *
     3406 +sh_get_pid_list(struct stdata *stp)
     3407 +{
     3408 +        int sz, n = 0;
     3409 +        pid_node_t                      *pn;
     3410 +        conn_pid_node_t                 *cpn;
     3411 +        conn_pid_node_list_hdr_t        *cph;
     3412 +
     3413 +        mutex_enter(&stp->sd_pid_list_lock);
     3414 +
     3415 +        n = list_size(&stp->sd_pid_list);
     3416 +        sz = sizeof (conn_pid_node_list_hdr_t);
     3417 +        sz += (n > 1)?((n - 1) * sizeof (conn_pid_node_t)):0;
     3418 +
     3419 +        cph = kmem_zalloc(sz, KM_SLEEP);
     3420 +        cph->cph_magic = CONN_PID_NODE_LIST_HDR_MAGIC;
     3421 +        cph->cph_contents = CONN_PID_NODE_LIST_HDR_XTI;
     3422 +        cph->cph_pn_cnt = n;
     3423 +        cph->cph_tot_size = sz;
     3424 +        cph->cph_flags = 0;
     3425 +        cph->cph_optional1 = 0;
     3426 +        cph->cph_optional2 = 0;
     3427 +
     3428 +        if (cph->cph_pn_cnt > 0) {
     3429 +                cpn = cph->cph_cpns;
     3430 +                pn = list_head(&stp->sd_pid_list);
     3431 +                while (pn != NULL) {
     3432 +                        PIDNODE2CONNPIDNODE(pn, cpn);
     3433 +                        pn = list_next(&stp->sd_pid_list, pn);
     3434 +                        cpn++;
     3435 +                }
     3436 +        }
     3437 +
     3438 +        mutex_exit(&stp->sd_pid_list_lock);
     3439 +        return (cph);
3343 3440  }
3344 3441  
3345 3442  /*
3346 3443   * Allocate a pair of queues and a syncq for the pair
3347 3444   */
3348 3445  queue_t *
3349 3446  allocq(void)
3350 3447  {
3351 3448          queinfo_t *qip;
3352 3449          queue_t *qp, *wqp;
↓ open down ↓ 5444 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX