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


 438         /* Pull parts of ereport together into ereport. */
 439         fm_ereport_set(ereport, version, class, ena, detector, NULL);
 440 
 441         /* Merge any preconstructed payload into the event. */
 442         if (pl)
 443                 (void) nvlist_merge(ereport, pl, 0);
 444 
 445         /* Add any remaining (after version) varargs payload to ereport. */
 446         name = va_arg(ap, char *);
 447         (void) i_fm_payload_set(ereport, name, ap);
 448 
 449         /* Post the ereport. */
 450         if (nva)
 451                 errorq_commit(fmhdl->fh_errorq, eqep, ERRORQ_ASYNC);
 452         else
 453                 fm_ereport_post(ereport, EVCH_SLEEP);
 454         goto out;
 455 
 456         /* Count errors as drops. */
 457 err:    if (fmhdl)
 458                 atomic_add_64(&fmhdl->fh_kstat.fek_erpt_dropped.value.ui64, 1);
 459 
 460         /* Free up nvlists if normal interfaces were used to allocate memory */
 461 out:    if (ereport && (nva == NULL))
 462                 fm_nvlist_destroy(ereport, FM_NVA_FREE);
 463         if (detector && (nva == NULL))
 464                 fm_nvlist_destroy(detector, FM_NVA_FREE);
 465 }
 466 
 467 /*
 468  * Generate an error report for consumption by the Solaris Fault Manager,
 469  * fmd(1M).  Valid ereport classes are defined in /usr/include/sys/fm/io.
 470  *
 471  * The ENA should be set if this error is a result of an error status
 472  * returned from ddi_dma_err_check() or ddi_acc_err_check().  Otherwise,
 473  * an ENA value of 0 is appropriate.
 474  *
 475  * If sflag == DDI_NOSLEEP, ddi_fm_ereport_post () may be called
 476  * from user, kernel, interrupt or high-interrupt context.  Otherwise,
 477  * ddi_fm_ereport_post() must be called from user or kernel context.
 478  *


1002         }
1003 
1004         errp = &((ddi_dma_impl_t *)handle)->dmai_error;
1005 
1006         errp->err_status = DDI_FM_OK;
1007         errp->err_ena = 0;
1008         errp->err_expected = DDI_FM_ERR_UNEXPECTED;
1009 }
1010 
1011 void
1012 i_ddi_fm_acc_err_set(ddi_acc_handle_t handle, uint64_t ena, int status,
1013     int flag)
1014 {
1015         ddi_acc_hdl_t *hdlp = impl_acc_hdl_get(handle);
1016         ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1017         struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->ah_dip)->devi_fmhdl;
1018 
1019         i_hdlp->ahi_err->err_ena = ena;
1020         i_hdlp->ahi_err->err_status = status;
1021         i_hdlp->ahi_err->err_expected = flag;
1022         atomic_add_64(&fmhdl->fh_kstat.fek_acc_err.value.ui64, 1);
1023 }
1024 
1025 void
1026 i_ddi_fm_dma_err_set(ddi_dma_handle_t handle, uint64_t ena, int status,
1027     int flag)
1028 {
1029         ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1030         struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->dmai_rdip)->devi_fmhdl;
1031 
1032         hdlp->dmai_error.err_ena = ena;
1033         hdlp->dmai_error.err_status = status;
1034         hdlp->dmai_error.err_expected = flag;
1035         atomic_add_64(&fmhdl->fh_kstat.fek_dma_err.value.ui64, 1);
1036 }
1037 
1038 ddi_fmcompare_t
1039 i_ddi_fm_acc_err_cf_get(ddi_acc_handle_t handle)
1040 {
1041         ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1042 
1043         return (i_hdlp->ahi_err->err_cf);
1044 }
1045 
1046 ddi_fmcompare_t
1047 i_ddi_fm_dma_err_cf_get(ddi_dma_handle_t handle)
1048 {
1049         ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1050 
1051         return (hdlp->dmai_error.err_cf);
1052 }


 438         /* Pull parts of ereport together into ereport. */
 439         fm_ereport_set(ereport, version, class, ena, detector, NULL);
 440 
 441         /* Merge any preconstructed payload into the event. */
 442         if (pl)
 443                 (void) nvlist_merge(ereport, pl, 0);
 444 
 445         /* Add any remaining (after version) varargs payload to ereport. */
 446         name = va_arg(ap, char *);
 447         (void) i_fm_payload_set(ereport, name, ap);
 448 
 449         /* Post the ereport. */
 450         if (nva)
 451                 errorq_commit(fmhdl->fh_errorq, eqep, ERRORQ_ASYNC);
 452         else
 453                 fm_ereport_post(ereport, EVCH_SLEEP);
 454         goto out;
 455 
 456         /* Count errors as drops. */
 457 err:    if (fmhdl)
 458                 atomic_inc_64(&fmhdl->fh_kstat.fek_erpt_dropped.value.ui64);
 459 
 460         /* Free up nvlists if normal interfaces were used to allocate memory */
 461 out:    if (ereport && (nva == NULL))
 462                 fm_nvlist_destroy(ereport, FM_NVA_FREE);
 463         if (detector && (nva == NULL))
 464                 fm_nvlist_destroy(detector, FM_NVA_FREE);
 465 }
 466 
 467 /*
 468  * Generate an error report for consumption by the Solaris Fault Manager,
 469  * fmd(1M).  Valid ereport classes are defined in /usr/include/sys/fm/io.
 470  *
 471  * The ENA should be set if this error is a result of an error status
 472  * returned from ddi_dma_err_check() or ddi_acc_err_check().  Otherwise,
 473  * an ENA value of 0 is appropriate.
 474  *
 475  * If sflag == DDI_NOSLEEP, ddi_fm_ereport_post () may be called
 476  * from user, kernel, interrupt or high-interrupt context.  Otherwise,
 477  * ddi_fm_ereport_post() must be called from user or kernel context.
 478  *


1002         }
1003 
1004         errp = &((ddi_dma_impl_t *)handle)->dmai_error;
1005 
1006         errp->err_status = DDI_FM_OK;
1007         errp->err_ena = 0;
1008         errp->err_expected = DDI_FM_ERR_UNEXPECTED;
1009 }
1010 
1011 void
1012 i_ddi_fm_acc_err_set(ddi_acc_handle_t handle, uint64_t ena, int status,
1013     int flag)
1014 {
1015         ddi_acc_hdl_t *hdlp = impl_acc_hdl_get(handle);
1016         ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1017         struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->ah_dip)->devi_fmhdl;
1018 
1019         i_hdlp->ahi_err->err_ena = ena;
1020         i_hdlp->ahi_err->err_status = status;
1021         i_hdlp->ahi_err->err_expected = flag;
1022         atomic_inc_64(&fmhdl->fh_kstat.fek_acc_err.value.ui64);
1023 }
1024 
1025 void
1026 i_ddi_fm_dma_err_set(ddi_dma_handle_t handle, uint64_t ena, int status,
1027     int flag)
1028 {
1029         ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1030         struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->dmai_rdip)->devi_fmhdl;
1031 
1032         hdlp->dmai_error.err_ena = ena;
1033         hdlp->dmai_error.err_status = status;
1034         hdlp->dmai_error.err_expected = flag;
1035         atomic_inc_64(&fmhdl->fh_kstat.fek_dma_err.value.ui64);
1036 }
1037 
1038 ddi_fmcompare_t
1039 i_ddi_fm_acc_err_cf_get(ddi_acc_handle_t handle)
1040 {
1041         ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1042 
1043         return (i_hdlp->ahi_err->err_cf);
1044 }
1045 
1046 ddi_fmcompare_t
1047 i_ddi_fm_dma_err_cf_get(ddi_dma_handle_t handle)
1048 {
1049         ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1050 
1051         return (hdlp->dmai_error.err_cf);
1052 }