1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License, Version 1.0 only 6eda14cbcSMatt Macy * (the "License"). You may not use this file except in compliance 7eda14cbcSMatt Macy * with the License. 8eda14cbcSMatt Macy * 9eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 11eda14cbcSMatt Macy * See the License for the specific language governing permissions 12eda14cbcSMatt Macy * and limitations under the License. 13eda14cbcSMatt Macy * 14eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 15eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 17eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 18eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 19eda14cbcSMatt Macy * 20eda14cbcSMatt Macy * CDDL HEADER END 21eda14cbcSMatt Macy */ 22eda14cbcSMatt Macy /* 23eda14cbcSMatt Macy * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24eda14cbcSMatt Macy * Use is subject to license terms. 25eda14cbcSMatt Macy */ 26eda14cbcSMatt Macy 27eda14cbcSMatt Macy #ifndef _LIBSPL_SYS_CMN_ERR_H 28eda14cbcSMatt Macy #define _LIBSPL_SYS_CMN_ERR_H 29eda14cbcSMatt Macy 30*2a58b312SMartin Matuska #include <atomic.h> 31*2a58b312SMartin Matuska 32*2a58b312SMartin Matuska #define cmn_err_once(ce, ...) \ 33*2a58b312SMartin Matuska do { \ 34*2a58b312SMartin Matuska static volatile uint32_t printed = 0; \ 35*2a58b312SMartin Matuska if (atomic_cas_32(&printed, 0, 1) == 0) { \ 36*2a58b312SMartin Matuska cmn_err(ce, __VA_ARGS__); \ 37*2a58b312SMartin Matuska } \ 38*2a58b312SMartin Matuska } while (0) 39*2a58b312SMartin Matuska 40*2a58b312SMartin Matuska #define vcmn_err_once(ce, fmt, ap) \ 41*2a58b312SMartin Matuska do { \ 42*2a58b312SMartin Matuska static volatile uint32_t printed = 0; \ 43*2a58b312SMartin Matuska if (atomic_cas_32(&printed, 0, 1) == 0) { \ 44*2a58b312SMartin Matuska vcmn_err(ce, fmt, ap); \ 45*2a58b312SMartin Matuska } \ 46*2a58b312SMartin Matuska } while (0) 47*2a58b312SMartin Matuska 48*2a58b312SMartin Matuska #define zcmn_err_once(zone, ce, ...) \ 49*2a58b312SMartin Matuska do { \ 50*2a58b312SMartin Matuska static volatile uint32_t printed = 0; \ 51*2a58b312SMartin Matuska if (atomic_cas_32(&printed, 0, 1) == 0) { \ 52*2a58b312SMartin Matuska zcmn_err(zone, ce, __VA_ARGS__); \ 53*2a58b312SMartin Matuska } \ 54*2a58b312SMartin Matuska } while (0) 55*2a58b312SMartin Matuska 56*2a58b312SMartin Matuska #define vzcmn_err_once(zone, ce, fmt, ap) \ 57*2a58b312SMartin Matuska do { \ 58*2a58b312SMartin Matuska static volatile uint32_t printed = 0; \ 59*2a58b312SMartin Matuska if (atomic_cas_32(&printed, 0, 1) == 0) { \ 60*2a58b312SMartin Matuska vzcmn_err(zone, ce, fmt, ap); \ 61*2a58b312SMartin Matuska } \ 62*2a58b312SMartin Matuska } while (0) 63*2a58b312SMartin Matuska 64eda14cbcSMatt Macy #endif 65