From: Guo Xuenan guoxuenan@huawei.com
hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8PGC4
--------------------------------
When "inline" is expanded to "always_inline", there may be some function conflicts. Functions with variable parameters cannot be inlined, so the "Inline" declaration is removed. The functions from the header file are referenced but not used, so "inline" is added to prevent compilation errors (it needs to be explicitly declared as "inline __gnu_inline __inline_maybe_unused notrace").
for performance reasons, hulk 5.10 do not use OPTIMIZE_INLINING. it using gnu_inline attribute causing inline functions not really inline, which introducing performance issues,so we disable it and adapt some link conflicting functions.
Signed-off-by: Guo Xuenan guoxuenan@huawei.com Reviewed-by: Jason Yan yanaijie@huawei.com
Signed-off-by: Chen Jun chenjun102@huawei.com Signed-off-by: Zheng Zengkai zhengzengkai@huawei.com Signed-off-by: Yuntao Liu liuyuntao12@huawei.com --- arch/arm64/kvm/sys_regs.h | 5 ++++ .../net/ethernet/mellanox/mlx5/core/health.c | 24 +++++++++++++++++++ .../ethernet/mellanox/mlx5/core/mlx5_core.h | 24 ------------------- .../pci/hive_isp_css_include/print_support.h | 4 ++++ include/trace/trace_events.h | 2 +- lib/Kconfig.debug | 3 ++- 6 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h index c65c129b3500..b4e78145116c 100644 --- a/arch/arm64/kvm/sys_regs.h +++ b/arch/arm64/kvm/sys_regs.h @@ -100,8 +100,13 @@ struct sys_reg_desc { #define REG_USER_WI (1 << 3) /* WI from userspace only */
static __printf(2, 3) +#if defined(CONFIG_OPTIMIZE_INLINING) inline void print_sys_reg_msg(const struct sys_reg_params *p, char *fmt, ...) +#else +void print_sys_reg_msg(const struct sys_reg_params *p, + char *fmt, ...) +#endif { va_list va;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c index 2fb2598b775e..28729f87d2ec 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c @@ -45,6 +45,30 @@ #include "diag/fw_tracer.h" #include "diag/reporter_vnic.h"
+static void mlx5_printk(struct mlx5_core_dev *dev, int level, const char *format, ...) +{ + struct device *device = dev->device; + struct va_format vaf; + va_list args; + + if (WARN_ONCE(level < LOGLEVEL_EMERG || level > LOGLEVEL_DEBUG, + "Level %d is out of range, set to default level\n", level)) + level = LOGLEVEL_DEFAULT; + + va_start(args, format); + vaf.fmt = format; + vaf.va = &args; + + dev_printk_emit(level, device, "%s %s: %pV", dev_driver_string(device), dev_name(device), + &vaf); + va_end(args); +} + +#define mlx5_log(__dev, level, format, ...) \ + mlx5_printk(__dev, level, "%s:%d:(pid %d): " format, \ + __func__, __LINE__, current->pid, \ + ##__VA_ARGS__) + enum { MAX_MISSES = 3, }; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h index 124352459c23..ca6736987fb6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h @@ -97,30 +97,6 @@ do { \ __func__, __LINE__, current->pid, \ ##__VA_ARGS__)
-static inline void mlx5_printk(struct mlx5_core_dev *dev, int level, const char *format, ...) -{ - struct device *device = dev->device; - struct va_format vaf; - va_list args; - - if (WARN_ONCE(level < LOGLEVEL_EMERG || level > LOGLEVEL_DEBUG, - "Level %d is out of range, set to default level\n", level)) - level = LOGLEVEL_DEFAULT; - - va_start(args, format); - vaf.fmt = format; - vaf.va = &args; - - dev_printk_emit(level, device, "%s %s: %pV", dev_driver_string(device), dev_name(device), - &vaf); - va_end(args); -} - -#define mlx5_log(__dev, level, format, ...) \ - mlx5_printk(__dev, level, "%s:%d:(pid %d): " format, \ - __func__, __LINE__, current->pid, \ - ##__VA_ARGS__) - static inline struct device *mlx5_core_dma_dev(struct mlx5_core_dev *dev) { return &dev->pdev->dev; diff --git a/drivers/staging/media/atomisp/pci/hive_isp_css_include/print_support.h b/drivers/staging/media/atomisp/pci/hive_isp_css_include/print_support.h index a3c7f3de6d17..916529e10bd1 100644 --- a/drivers/staging/media/atomisp/pci/hive_isp_css_include/print_support.h +++ b/drivers/staging/media/atomisp/pci/hive_isp_css_include/print_support.h @@ -20,7 +20,11 @@
extern int (*sh_css_printf)(const char *fmt, va_list args); /* depends on host supplied print function in ia_css_init() */ +#if defined(CONFIG_OPTIMIZE_INLINING) static inline __printf(1, 2) void ia_css_print(const char *fmt, ...) +#else +static __printf(1, 2) void ia_css_print(const char *fmt, ...) +#endif { va_list ap;
diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h index c2f9cabf154d..630dbac8cb2c 100644 --- a/include/trace/trace_events.h +++ b/include/trace/trace_events.h @@ -253,7 +253,7 @@ static struct trace_event_fields trace_event_fields_##call[] = { \
#undef DECLARE_EVENT_CLASS #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ -static inline notrace int trace_event_get_offsets_##call( \ +static notrace int trace_event_get_offsets_##call( \ struct trace_event_data_offsets_##call *__data_offsets, proto) \ { \ int __data_size = 0; \ diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 5a8d18f3be3b..0ec578b89961 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -475,7 +475,8 @@ config HEADERS_INSTALL as uapi header sanity checks.
config OPTIMIZE_INLINING - def_bool y + bool "Optimize inlining" + def_bool n help This option determines if the kernel forces gcc to inline the functions developers have marked 'inline'. Doing so takes away freedom from gcc to