Unverified Commit 9995aad5 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!765 LoongArch: fix some stability issues

Merge Pull Request from: @Hongchen_Zhang 
 
LoongArch: fix the following issues:
- Modify loongson3_defconfig to support the cachefilesd service
- Loongson: i2c fixes the issue of interrupt not freed after remove the module
- Fix page table property operation issues
- Fix kernel crash triggered by ltp io_uring02 testcase
- Fix nvme timeout issue triggered by LTP cpuhotplug testcase
- Fix double bridge machine boot failed 
 
Link:https://gitee.com/openeuler/kernel/pulls/765

 

Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Reviewed-by: default avatarGuo Dongtai <guodongtai@kylinos.cn>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 22ff6706 850defab
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -395,7 +395,6 @@ config SMP
config HOTPLUG_CPU
	bool "Support for hot-pluggable CPUs"
	depends on SMP
	select GENERIC_IRQ_MIGRATION
	help
	Say Y here to allow turning CPUs off and on. CPUs can be
	controlled through /sys/devices/system/cpu.
+1 −0
Original line number Diff line number Diff line
@@ -983,6 +983,7 @@ CONFIG_OVERLAY_FS_INDEX=y
CONFIG_OVERLAY_FS_XINO_AUTO=y
CONFIG_OVERLAY_FS_METACOPY=y
CONFIG_FSCACHE=y
CONFIG_CACHEFILES=m
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
+1 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ extern struct fwnode_handle *pch_lpc_handle;
extern struct fwnode_handle *pch_pic_handle[MAX_IO_PICS];

extern irqreturn_t loongson3_ipi_interrupt(int irq, void *dev);
extern void fixup_irqs(void);

#include <asm-generic/irq.h>

+12 −4
Original line number Diff line number Diff line
@@ -361,13 +361,17 @@ static inline pte_t pte_mkclean(pte_t pte)

static inline pte_t pte_mkdirty(pte_t pte)
{
	pte_val(pte) |= (_PAGE_DIRTY | _PAGE_MODIFIED);
	pte_val(pte) |= _PAGE_MODIFIED;
	if (pte_val(pte) & _PAGE_WRITE)
		pte_val(pte) |= _PAGE_DIRTY;
	return pte;
}

static inline pte_t pte_mkwrite(pte_t pte)
{
	pte_val(pte) |= (_PAGE_WRITE | _PAGE_DIRTY);
	pte_val(pte) |= _PAGE_WRITE;
	if (pte_val(pte) & _PAGE_MODIFIED)
		pte_val(pte) |= _PAGE_DIRTY;
	return pte;
}

@@ -464,7 +468,9 @@ static inline int pmd_write(pmd_t pmd)

static inline pmd_t pmd_mkwrite(pmd_t pmd)
{
	pmd_val(pmd) |= (_PAGE_WRITE | _PAGE_DIRTY);
	pmd_val(pmd) |= _PAGE_WRITE;
	if (pmd_val(pmd) & _PAGE_MODIFIED)
		pmd_val(pmd) |= _PAGE_DIRTY;
	return pmd;
}

@@ -487,7 +493,9 @@ static inline pmd_t pmd_mkclean(pmd_t pmd)

static inline pmd_t pmd_mkdirty(pmd_t pmd)
{
	pmd_val(pmd) |= (_PAGE_DIRTY | _PAGE_MODIFIED);
	pmd_val(pmd) |= _PAGE_MODIFIED;
	if (pmd_val(pmd) & _PAGE_WRITE)
		pmd_val(pmd) |= _PAGE_DIRTY;
	return pmd;
}

+36 −0
Original line number Diff line number Diff line
@@ -96,6 +96,42 @@ static int __init get_ipi_irq(void)
	return -EINVAL;
}

#ifdef CONFIG_HOTPLUG_CPU
static void handle_irq_affinity(void)
{
	struct irq_desc *desc;
	struct irq_chip *chip;
	unsigned int irq;
	unsigned long flags;
	struct cpumask *affinity;

	for_each_active_irq(irq) {
		desc = irq_to_desc(irq);
		if (!desc)
			continue;

		raw_spin_lock_irqsave(&desc->lock, flags);

		affinity = desc->irq_data.common->affinity;
		if (!cpumask_intersects(affinity, cpu_online_mask))
			cpumask_copy(affinity, cpu_online_mask);

		chip = irq_data_get_irq_chip(&desc->irq_data);
		if (chip && chip->irq_set_affinity)
			chip->irq_set_affinity(&desc->irq_data,
					desc->irq_data.common->affinity, true);
		raw_spin_unlock_irqrestore(&desc->lock, flags);
	}
}

void fixup_irqs(void)
{
	handle_irq_affinity();
	irq_cpu_offline();
	clear_csr_ecfg(ECFG0_IM);
}
#endif

void __init init_IRQ(void)
{
	int i, ret;
Loading