Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*


 661         }
 662 
 663         rw_enter(&hdlp->ih_rwlock, RW_READER);
 664 
 665         /* Do some input argument checking */
 666         if ((hdlp->ih_state == DDI_IHDL_STATE_ALLOC) ||      /* intr handle alloc? */
 667             (hdlp->ih_type != DDI_INTR_TYPE_MSIX) || /* only MSI-X allowed */
 668             (hdlp->ih_flags & DDI_INTR_MSIX_DUP)) {      /* only dup original */
 669                 rw_exit(&hdlp->ih_rwlock);
 670                 return (DDI_EINVAL);
 671         }
 672 
 673         hdlp->ih_scratch1 = dup_inum;
 674         ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
 675             DDI_INTROP_DUPVEC, hdlp, NULL);
 676 
 677         if (ret == DDI_SUCCESS) {
 678                 dup_hdlp = (ddi_intr_handle_impl_t *)
 679                     kmem_alloc(sizeof (ddi_intr_handle_impl_t), KM_SLEEP);
 680 
 681                 atomic_add_32(&hdlp->ih_dup_cnt, 1);
 682 
 683                 *dup = (ddi_intr_handle_t)dup_hdlp;
 684                 bcopy(hdlp, dup_hdlp, sizeof (ddi_intr_handle_impl_t));
 685 
 686                 /* These fields are unique to each dupped msi-x vector */
 687                 rw_init(&dup_hdlp->ih_rwlock, NULL, RW_DRIVER, NULL);
 688                 dup_hdlp->ih_state = DDI_IHDL_STATE_ADDED;
 689                 dup_hdlp->ih_inum = dup_inum;
 690                 dup_hdlp->ih_flags |= DDI_INTR_MSIX_DUP;
 691                 dup_hdlp->ih_dup_cnt = 0;
 692 
 693                 /* Point back to original vector */
 694                 dup_hdlp->ih_main = hdlp;
 695         }
 696 
 697         rw_exit(&hdlp->ih_rwlock);
 698         return (ret);
 699 }
 700 
 701 int




 661         }
 662 
 663         rw_enter(&hdlp->ih_rwlock, RW_READER);
 664 
 665         /* Do some input argument checking */
 666         if ((hdlp->ih_state == DDI_IHDL_STATE_ALLOC) ||      /* intr handle alloc? */
 667             (hdlp->ih_type != DDI_INTR_TYPE_MSIX) || /* only MSI-X allowed */
 668             (hdlp->ih_flags & DDI_INTR_MSIX_DUP)) {      /* only dup original */
 669                 rw_exit(&hdlp->ih_rwlock);
 670                 return (DDI_EINVAL);
 671         }
 672 
 673         hdlp->ih_scratch1 = dup_inum;
 674         ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
 675             DDI_INTROP_DUPVEC, hdlp, NULL);
 676 
 677         if (ret == DDI_SUCCESS) {
 678                 dup_hdlp = (ddi_intr_handle_impl_t *)
 679                     kmem_alloc(sizeof (ddi_intr_handle_impl_t), KM_SLEEP);
 680 
 681                 atomic_inc_32(&hdlp->ih_dup_cnt);
 682 
 683                 *dup = (ddi_intr_handle_t)dup_hdlp;
 684                 bcopy(hdlp, dup_hdlp, sizeof (ddi_intr_handle_impl_t));
 685 
 686                 /* These fields are unique to each dupped msi-x vector */
 687                 rw_init(&dup_hdlp->ih_rwlock, NULL, RW_DRIVER, NULL);
 688                 dup_hdlp->ih_state = DDI_IHDL_STATE_ADDED;
 689                 dup_hdlp->ih_inum = dup_inum;
 690                 dup_hdlp->ih_flags |= DDI_INTR_MSIX_DUP;
 691                 dup_hdlp->ih_dup_cnt = 0;
 692 
 693                 /* Point back to original vector */
 694                 dup_hdlp->ih_main = hdlp;
 695         }
 696 
 697         rw_exit(&hdlp->ih_rwlock);
 698         return (ret);
 699 }
 700 
 701 int