Commit 16073a19 authored by Yipeng Zou's avatar Yipeng Zou Committed by Yongqiang Liu
Browse files

genirq: introduce CONFIG_GENERIC_PENDING_IRQ_FIX_KABI

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I6BO2R


CVE: NA

-------------------------------

Since CONFIG_GENERIC_PENDING_IRQ has been introduced for gic-v3-its,
there has some kabi changed(irq_desc->pending_mask).

Introduce CONFIG_GENERIC_PENDING_IRQ_FIX_KABI to fix it.

The main way is to use an static array(irq_pending_mask) to replace
pending_mask in irq_desc.

Signed-off-by: default avatarYipeng Zou <zouyipeng@huawei.com>
Reviewed-by: default avatarLiao Chang <liaochang1@huawei.com>
Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Signed-off-by: default avatarYongqiang Liu <liuyongqiang13@huawei.com>
parent 6ea55196
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -77,7 +77,8 @@ struct irq_desc {
#ifdef CONFIG_SMP
	const struct cpumask	*affinity_hint;
	struct irq_affinity_notify *affinity_notify;
#ifdef CONFIG_GENERIC_PENDING_IRQ
#if defined(CONFIG_GENERIC_PENDING_IRQ) && \
	!defined(CONFIG_GENERIC_PENDING_IRQ_FIX_KABI)
	cpumask_var_t		pending_mask;
#endif
#endif
+6 −0
Original line number Diff line number Diff line
@@ -138,6 +138,12 @@ config GENERIC_IRQ_DEBUGFS

	  If you don't know what to do here, say N.

# Support for delayed migration from interrupt context without kabi modification
config GENERIC_PENDING_IRQ_FIX_KABI
	bool "Support for delayed migration from interrupt context without kabi modification "
	depends on GENERIC_PENDING_IRQ
	default n

endmenu

config GENERIC_IRQ_MULTI_HANDLER
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ static void irq_debug_show_masks(struct seq_file *m, struct irq_desc *desc)
	seq_printf(m, "effectiv: %*pbl\n", cpumask_pr_args(msk));
#endif
#ifdef CONFIG_GENERIC_PENDING_IRQ
	msk = desc->pending_mask;
	msk = irq_desc_get_pending_mask(desc);
	seq_printf(m, "pending:  %*pbl\n", cpumask_pr_args(msk));
#endif
}
+19 −0
Original line number Diff line number Diff line
@@ -410,6 +410,7 @@ static inline bool irq_move_pending(struct irq_data *data)
{
	return irqd_is_setaffinity_pending(data);
}
#ifndef CONFIG_GENERIC_PENDING_IRQ_FIX_KABI
static inline void
irq_copy_pending(struct irq_desc *desc, const struct cpumask *mask)
{
@@ -424,6 +425,24 @@ static inline struct cpumask *irq_desc_get_pending_mask(struct irq_desc *desc)
{
	return desc->pending_mask;
}
#else
extern struct cpumask irq_pending_mask[IRQ_BITMAP_BITS];

static inline void
irq_copy_pending(struct irq_desc *desc, const struct cpumask *mask)
{
	cpumask_copy(&irq_pending_mask[irq_desc_get_irq(desc)], mask);
}
static inline void
irq_get_pending(struct cpumask *mask, struct irq_desc *desc)
{
	cpumask_copy(mask, &irq_pending_mask[irq_desc_get_irq(desc)]);
}
static inline struct cpumask *irq_desc_get_pending_mask(struct irq_desc *desc)
{
	return &irq_pending_mask[irq_desc_get_irq(desc)];
}
#endif
static inline bool handle_enforce_irqctx(struct irq_data *data)
{
	return irqd_is_handle_enforce_irqctx(data);
+5 −3
Original line number Diff line number Diff line
@@ -66,7 +66,8 @@ static int alloc_masks(struct irq_desc *desc, int node)
	}
#endif

#ifdef CONFIG_GENERIC_PENDING_IRQ
#if defined(CONFIG_GENERIC_PENDING_IRQ) && \
	!defined(CONFIG_GENERIC_PENDING_IRQ_FIX_KABI)
	if (!zalloc_cpumask_var_node(&desc->pending_mask, GFP_KERNEL, node)) {
#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
		free_cpumask_var(desc->irq_common_data.effective_affinity);
@@ -86,7 +87,7 @@ static void desc_smp_init(struct irq_desc *desc, int node,
	cpumask_copy(desc->irq_common_data.affinity, affinity);

#ifdef CONFIG_GENERIC_PENDING_IRQ
	cpumask_clear(desc->pending_mask);
	cpumask_clear(irq_desc_get_pending_mask(desc));
#endif
#ifdef CONFIG_NUMA
	desc->irq_common_data.node = node;
@@ -361,7 +362,8 @@ static void delete_irq_desc(unsigned int irq)
#ifdef CONFIG_SMP
static void free_masks(struct irq_desc *desc)
{
#ifdef CONFIG_GENERIC_PENDING_IRQ
#if defined(CONFIG_GENERIC_PENDING_IRQ) && \
	!defined(CONFIG_GENERIC_PENDING_IRQ_FIX_KABI)
	free_cpumask_var(desc->pending_mask);
#endif
	free_cpumask_var(desc->irq_common_data.affinity);
Loading