iwlwifi: allow rate-limited error messages
Sometimes we might want to have an error message for something related to TX/RX, but if that somehow happens frequently it'll overwhelm the logs. Add IWL_ERR_LIMIT() to alleviate that by rate-limiting those messages. To do this, rework __iwl_err() a bit to have a mode argument instead of passing yet another (bool) argument to it. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Link: https://lore.kernel.org/r/iwlwifi.20211017162352.2cb1e6b75672.Iec5b1c1bcc6ebc87c586921a6c5c2a937f49e83c@changeid Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
		
							parent
							
								
									6b1259d104
								
							
						
					
					
						commit
						e5f1cc98cc
					
				| @ -1,6 +1,6 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ | ||||
| /*
 | ||||
|  * Copyright (C) 2005-2014 Intel Corporation | ||||
|  * Copyright (C) 2005-2014, 2021 Intel Corporation | ||||
|  */ | ||||
| #ifndef __iwl_agn_h__ | ||||
| #define __iwl_agn_h__ | ||||
| @ -398,8 +398,10 @@ do {									\ | ||||
| 	if (!iwl_is_rfkill((m)))					\ | ||||
| 		IWL_ERR(m, fmt, ##args);				\ | ||||
| 	else								\ | ||||
| 		__iwl_err((m)->dev, true,				\ | ||||
| 			  !iwl_have_debug_level(IWL_DL_RADIO),		\ | ||||
| 		__iwl_err((m)->dev,					\ | ||||
| 			  iwl_have_debug_level(IWL_DL_RADIO) ?		\ | ||||
| 				IWL_ERR_MODE_RFKILL :			\ | ||||
| 				IWL_ERR_MODE_TRACE_ONLY,		\ | ||||
| 			  fmt, ##args);					\ | ||||
| } while (0) | ||||
| #else | ||||
| @ -408,7 +410,8 @@ do {									\ | ||||
| 	if (!iwl_is_rfkill((m)))					\ | ||||
| 		IWL_ERR(m, fmt, ##args);				\ | ||||
| 	else								\ | ||||
| 		__iwl_err((m)->dev, true, true, fmt, ##args);	\ | ||||
| 		__iwl_err((m)->dev, IWL_ERR_MODE_TRACE_ONLY,		\ | ||||
| 			  fmt, ##args);					\ | ||||
| } while (0) | ||||
| #endif				/* CONFIG_IWLWIFI_DEBUG */ | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 | ||||
| /*
 | ||||
|  * Copyright (C) 2005-2011 Intel Corporation | ||||
|  * Copyright (C) 2005-2011, 2021 Intel Corporation | ||||
|  */ | ||||
| #include <linux/device.h> | ||||
| #include <linux/interrupt.h> | ||||
| @ -31,21 +31,31 @@ IWL_EXPORT_SYMBOL(__iwl_info); | ||||
| __iwl_fn(crit) | ||||
| IWL_EXPORT_SYMBOL(__iwl_crit); | ||||
| 
 | ||||
| void __iwl_err(struct device *dev, bool rfkill_prefix, bool trace_only, | ||||
| 		const char *fmt, ...) | ||||
| void __iwl_err(struct device *dev, enum iwl_err_mode mode, const char *fmt, ...) | ||||
| { | ||||
| 	struct va_format vaf = { | ||||
| 		.fmt = fmt, | ||||
| 	}; | ||||
| 	va_list args; | ||||
| 	va_list args, args2; | ||||
| 
 | ||||
| 	va_start(args, fmt); | ||||
| 	vaf.va = &args; | ||||
| 	if (!trace_only) { | ||||
| 		if (rfkill_prefix) | ||||
| 	switch (mode) { | ||||
| 	case IWL_ERR_MODE_RATELIMIT: | ||||
| 		if (net_ratelimit()) | ||||
| 			break; | ||||
| 		fallthrough; | ||||
| 	case IWL_ERR_MODE_REGULAR: | ||||
| 	case IWL_ERR_MODE_RFKILL: | ||||
| 		va_copy(args2, args); | ||||
| 		vaf.va = &args2; | ||||
| 		if (mode == IWL_ERR_MODE_RFKILL) | ||||
| 			dev_err(dev, "(RFKILL) %pV", &vaf); | ||||
| 		else | ||||
| 			dev_err(dev, "%pV", &vaf); | ||||
| 		va_end(args2); | ||||
| 		break; | ||||
| 	default: | ||||
| 		break; | ||||
| 	} | ||||
| 	trace_iwlwifi_err(&vaf); | ||||
| 	va_end(args); | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| /******************************************************************************
 | ||||
|  * | ||||
|  * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. | ||||
|  * Copyright(c) 2018 - 2020 Intel Corporation | ||||
|  * Copyright(c) 2018 - 2021 Intel Corporation | ||||
|  * | ||||
|  * Portions of this file are derived from the ipw3945 project. | ||||
|  *****************************************************************************/ | ||||
| @ -22,9 +22,16 @@ static inline bool iwl_have_debug_level(u32 level) | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| enum iwl_err_mode { | ||||
| 	IWL_ERR_MODE_REGULAR, | ||||
| 	IWL_ERR_MODE_RFKILL, | ||||
| 	IWL_ERR_MODE_TRACE_ONLY, | ||||
| 	IWL_ERR_MODE_RATELIMIT, | ||||
| }; | ||||
| 
 | ||||
| struct device; | ||||
| void __iwl_err(struct device *dev, bool rfkill_prefix, bool only_trace, | ||||
| 		const char *fmt, ...) __printf(4, 5); | ||||
| void __iwl_err(struct device *dev, enum iwl_err_mode mode, const char *fmt, ...) | ||||
| 	__printf(3, 4); | ||||
| void __iwl_warn(struct device *dev, const char *fmt, ...) __printf(2, 3); | ||||
| void __iwl_info(struct device *dev, const char *fmt, ...) __printf(2, 3); | ||||
| void __iwl_crit(struct device *dev, const char *fmt, ...) __printf(2, 3); | ||||
| @ -33,13 +40,17 @@ void __iwl_crit(struct device *dev, const char *fmt, ...) __printf(2, 3); | ||||
| #define CHECK_FOR_NEWLINE(f) BUILD_BUG_ON(f[sizeof(f) - 2] != '\n') | ||||
| 
 | ||||
| /* No matter what is m (priv, bus, trans), this will work */ | ||||
| #define IWL_ERR_DEV(d, f, a...)						\ | ||||
| #define __IWL_ERR_DEV(d, mode, f, a...)					\ | ||||
| 	do {								\ | ||||
| 		CHECK_FOR_NEWLINE(f);					\ | ||||
| 		__iwl_err((d), false, false, f, ## a);			\ | ||||
| 		__iwl_err((d), mode, f, ## a);				\ | ||||
| 	} while (0) | ||||
| #define IWL_ERR_DEV(d, f, a...)						\ | ||||
| 	__IWL_ERR_DEV(d, IWL_ERR_MODE_REGULAR, f, ## a) | ||||
| #define IWL_ERR(m, f, a...)						\ | ||||
| 	IWL_ERR_DEV((m)->dev, f, ## a) | ||||
| #define IWL_ERR_LIMIT(m, f, a...)					\ | ||||
| 	__IWL_ERR_DEV((m)->dev, IWL_ERR_MODE_RATELIMIT, f, ## a) | ||||
| #define IWL_WARN(m, f, a...)						\ | ||||
| 	do {								\ | ||||
| 		CHECK_FOR_NEWLINE(f);					\ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user