public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: unify current 3 similar ways of saving IRQ info
@ 2010-12-03  4:11 Feng Tang
  2010-12-06 15:01 ` [tip:x86/platform] x86: Unify " tip-bot for Feng Tang
  0 siblings, 1 reply; 15+ messages in thread
From: Feng Tang @ 2010-12-03  4:11 UTC (permalink / raw)
  To: linux-kernel, tglx; +Cc: mingo, hpa, alan, Feng Tang, Ingo Molnar, Len Brown

There are 3 places defining the similar function of saving IRQ
vector info into mp_irqs[] array: mmparse/acpi/mrst. This patch
will reduce the redundant code, and make it only one API:
	void mp_save_irq(struct mpc_intsrc *m);

Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Len Brown <len.brown@intel.com>
---
 arch/x86/include/asm/mpspec.h |    6 ++++++
 arch/x86/kernel/acpi/boot.c   |   32 +++-----------------------------
 arch/x86/kernel/mpparse.c     |   14 +++++++-------
 arch/x86/platform/mrst/mrst.c |   30 ++----------------------------
 4 files changed, 18 insertions(+), 64 deletions(-)

diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h
index c82868e..17f4314 100644
--- a/arch/x86/include/asm/mpspec.h
+++ b/arch/x86/include/asm/mpspec.h
@@ -42,6 +42,12 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
 
 #endif /* CONFIG_X86_64 */
 
+#ifdef CONFIG_X86_IO_APIC
+void mp_save_irq(struct mpc_intsrc *m);
+#else
+static inline void mp_save_irq(struct mpc_intsrc *m) {}
+#endif
+
 #if defined(CONFIG_MCA) || defined(CONFIG_EISA)
 extern int mp_bus_id_to_type[MAX_MP_BUSSES];
 #endif
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 71232b9..006f896 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -949,32 +949,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
 extern int es7000_plat;
 #endif
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 {
 	int ioapic;
@@ -1005,7 +979,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
 	mp_irq.dstirq = pin;	/* INTIN# */
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 
 	isa_irq_to_gsi[bus_irq] = gsi;
 }
@@ -1080,7 +1054,7 @@ void __init mp_config_acpi_legacy_irqs(void)
 		mp_irq.srcbusirq = i; /* Identity mapped */
 		mp_irq.dstirq = pin;
 
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 }
 
@@ -1117,7 +1091,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid;
 	mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 #endif
 	return 0;
 }
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 9af64d9..ecaa897 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -144,7 +144,7 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mp_irq(struct mpc_intsrc *m,
+static void assign_to_mp_irq(struct mpc_intsrc *m,
 				    struct mpc_intsrc *mp_irq)
 {
 	mp_irq->dstapic = m->dstapic;
@@ -168,7 +168,7 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
 	m->dstirq = mp_irq->dstirq;
 }
 
-static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
+static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
 					struct mpc_intsrc *m)
 {
 	if (mp_irq->dstapic != m->dstapic)
@@ -189,7 +189,8 @@ static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
 	return 0;
 }
 
-static void __init MP_intsrc_info(struct mpc_intsrc *m)
+/* Will also be called in acpi/sfi related code */
+void mp_save_irq(struct mpc_intsrc *m)
 {
 	int i;
 
@@ -207,7 +208,6 @@ static void __init MP_intsrc_info(struct mpc_intsrc *m)
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
-static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
 
@@ -337,7 +337,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
 			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
 			break;
 		case MP_INTSRC:
-			MP_intsrc_info((struct mpc_intsrc *)mpt);
+			mp_save_irq((struct mpc_intsrc *)mpt);
 			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
 			break;
 		case MP_LINTSRC:
@@ -429,13 +429,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
 
 		intsrc.srcbusirq = i;
 		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */
-		MP_intsrc_info(&intsrc);
+		mp_save_irq(&intsrc);
 	}
 
 	intsrc.irqtype = mp_ExtINT;
 	intsrc.srcbusirq = 0;
 	intsrc.dstirq = 0;	/* 8259A to INTIN0 */
-	MP_intsrc_info(&intsrc);
+	mp_save_irq(&intsrc);
 }
 
 
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index fee0b49..ea6529e 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
 EXPORT_SYMBOL_GPL(sfi_mrtc_array);
 int sfi_mrtc_num;
 
-static inline void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 /* parse all the mtimer info to a static mtimer array */
 static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 {
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 			mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 			mp_irq.dstapic = MP_APIC_ALL;
 			mp_irq.dstirq = pentry->irq;
-			save_mp_irq(&mp_irq);
+			mp_save_irq(&mp_irq);
 	}
 
 	return 0;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
 		mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 		mp_irq.dstapic = MP_APIC_ALL;
 		mp_irq.dstirq = pentry->irq;
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 	return 0;
 }
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-03  4:11 [PATCH] x86: unify current 3 similar ways of saving IRQ info Feng Tang
@ 2010-12-06 15:01 ` tip-bot for Feng Tang
  2010-12-06 17:50   ` Yinghai Lu
  0 siblings, 1 reply; 15+ messages in thread
From: tip-bot for Feng Tang @ 2010-12-06 15:01 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, alan, hpa, mingo, tglx, feng.tang, len.brown

Commit-ID:  a6427a341985e0379060c86b50fcdb59883e4102
Gitweb:     http://git.kernel.org/tip/a6427a341985e0379060c86b50fcdb59883e4102
Author:     Feng Tang <feng.tang@intel.com>
AuthorDate: Fri, 3 Dec 2010 12:11:58 +0800
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Mon, 6 Dec 2010 15:58:26 +0100

x86: Unify current 3 similar ways of saving IRQ info

There are 3 places defining the similar function of saving IRQ
vector info into mp_irqs[] array: mmparse/acpi/mrst. This patch
will reduce the redundant code, and make it only one API:
	void mp_save_irq(struct mpc_intsrc *m);

Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Len Brown <len.brown@intel.com>
LKML-Reference: <1291349518-3502-1-git-send-email-feng.tang@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 arch/x86/include/asm/mpspec.h |    6 ++++++
 arch/x86/kernel/acpi/boot.c   |   32 +++-----------------------------
 arch/x86/kernel/mpparse.c     |   14 +++++++-------
 arch/x86/platform/mrst/mrst.c |   30 ++----------------------------
 4 files changed, 18 insertions(+), 64 deletions(-)

diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h
index c82868e..17f4314 100644
--- a/arch/x86/include/asm/mpspec.h
+++ b/arch/x86/include/asm/mpspec.h
@@ -42,6 +42,12 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
 
 #endif /* CONFIG_X86_64 */
 
+#ifdef CONFIG_X86_IO_APIC
+void mp_save_irq(struct mpc_intsrc *m);
+#else
+static inline void mp_save_irq(struct mpc_intsrc *m) {}
+#endif
+
 #if defined(CONFIG_MCA) || defined(CONFIG_EISA)
 extern int mp_bus_id_to_type[MAX_MP_BUSSES];
 #endif
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 71232b9..006f896 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -949,32 +949,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
 extern int es7000_plat;
 #endif
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 {
 	int ioapic;
@@ -1005,7 +979,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
 	mp_irq.dstirq = pin;	/* INTIN# */
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 
 	isa_irq_to_gsi[bus_irq] = gsi;
 }
@@ -1080,7 +1054,7 @@ void __init mp_config_acpi_legacy_irqs(void)
 		mp_irq.srcbusirq = i; /* Identity mapped */
 		mp_irq.dstirq = pin;
 
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 }
 
@@ -1117,7 +1091,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid;
 	mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 #endif
 	return 0;
 }
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 9af64d9..ecaa897 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -144,7 +144,7 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mp_irq(struct mpc_intsrc *m,
+static void assign_to_mp_irq(struct mpc_intsrc *m,
 				    struct mpc_intsrc *mp_irq)
 {
 	mp_irq->dstapic = m->dstapic;
@@ -168,7 +168,7 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
 	m->dstirq = mp_irq->dstirq;
 }
 
-static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
+static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
 					struct mpc_intsrc *m)
 {
 	if (mp_irq->dstapic != m->dstapic)
@@ -189,7 +189,8 @@ static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
 	return 0;
 }
 
-static void __init MP_intsrc_info(struct mpc_intsrc *m)
+/* Will also be called in acpi/sfi related code */
+void mp_save_irq(struct mpc_intsrc *m)
 {
 	int i;
 
@@ -207,7 +208,6 @@ static void __init MP_intsrc_info(struct mpc_intsrc *m)
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
-static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
 
@@ -337,7 +337,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
 			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
 			break;
 		case MP_INTSRC:
-			MP_intsrc_info((struct mpc_intsrc *)mpt);
+			mp_save_irq((struct mpc_intsrc *)mpt);
 			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
 			break;
 		case MP_LINTSRC:
@@ -429,13 +429,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
 
 		intsrc.srcbusirq = i;
 		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */
-		MP_intsrc_info(&intsrc);
+		mp_save_irq(&intsrc);
 	}
 
 	intsrc.irqtype = mp_ExtINT;
 	intsrc.srcbusirq = 0;
 	intsrc.dstirq = 0;	/* 8259A to INTIN0 */
-	MP_intsrc_info(&intsrc);
+	mp_save_irq(&intsrc);
 }
 
 
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index fee0b49..ea6529e 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
 EXPORT_SYMBOL_GPL(sfi_mrtc_array);
 int sfi_mrtc_num;
 
-static inline void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 /* parse all the mtimer info to a static mtimer array */
 static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 {
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 			mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 			mp_irq.dstapic = MP_APIC_ALL;
 			mp_irq.dstirq = pentry->irq;
-			save_mp_irq(&mp_irq);
+			mp_save_irq(&mp_irq);
 	}
 
 	return 0;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
 		mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 		mp_irq.dstapic = MP_APIC_ALL;
 		mp_irq.dstirq = pentry->irq;
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 	return 0;
 }

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-06 15:01 ` [tip:x86/platform] x86: Unify " tip-bot for Feng Tang
@ 2010-12-06 17:50   ` Yinghai Lu
  2010-12-06 19:51     ` Thomas Gleixner
  2010-12-07  5:32     ` Feng Tang
  0 siblings, 2 replies; 15+ messages in thread
From: Yinghai Lu @ 2010-12-06 17:50 UTC (permalink / raw)
  To: mingo, hpa, alan, linux-kernel, tglx, feng.tang, len.brown
  Cc: linux-tip-commits

On 12/06/2010 07:01 AM, tip-bot for Feng Tang wrote:
> Commit-ID:  a6427a341985e0379060c86b50fcdb59883e4102
> Gitweb:     http://git.kernel.org/tip/a6427a341985e0379060c86b50fcdb59883e4102
> Author:     Feng Tang <feng.tang@intel.com>
> AuthorDate: Fri, 3 Dec 2010 12:11:58 +0800
> Committer:  Thomas Gleixner <tglx@linutronix.de>
> CommitDate: Mon, 6 Dec 2010 15:58:26 +0100
> 
> x86: Unify current 3 similar ways of saving IRQ info
> 
> There are 3 places defining the similar function of saving IRQ
> vector info into mp_irqs[] array: mmparse/acpi/mrst. This patch
> will reduce the redundant code, and make it only one API:
> 	void mp_save_irq(struct mpc_intsrc *m);
> 
> Signed-off-by: Feng Tang <feng.tang@intel.com>
> Cc: Alan Cox <alan@linux.intel.com>
> Cc: Len Brown <len.brown@intel.com>
> LKML-Reference: <1291349518-3502-1-git-send-email-feng.tang@intel.com>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
>  arch/x86/include/asm/mpspec.h |    6 ++++++
>  arch/x86/kernel/acpi/boot.c   |   32 +++-----------------------------
>  arch/x86/kernel/mpparse.c     |   14 +++++++-------
>  arch/x86/platform/mrst/mrst.c |   30 ++----------------------------
>  4 files changed, 18 insertions(+), 64 deletions(-)
> 
> diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h
> index c82868e..17f4314 100644
> --- a/arch/x86/include/asm/mpspec.h
> +++ b/arch/x86/include/asm/mpspec.h
> @@ -42,6 +42,12 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
>  
>  #endif /* CONFIG_X86_64 */
>  
> +#ifdef CONFIG_X86_IO_APIC
> +void mp_save_irq(struct mpc_intsrc *m);
> +#else
> +static inline void mp_save_irq(struct mpc_intsrc *m) {}
> +#endif
> +
>  #if defined(CONFIG_MCA) || defined(CONFIG_EISA)
>  extern int mp_bus_id_to_type[MAX_MP_BUSSES];
>  #endif
> diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
> index 71232b9..006f896 100644
> --- a/arch/x86/kernel/acpi/boot.c
> +++ b/arch/x86/kernel/acpi/boot.c
> @@ -949,32 +949,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
>  extern int es7000_plat;
>  #endif
>  
> -static void assign_to_mp_irq(struct mpc_intsrc *m,
> -				    struct mpc_intsrc *mp_irq)
> -{
> -	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
> -}
> -
> -static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
> -				struct mpc_intsrc *m)
> -{
> -	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
> -}
> -
> -static void save_mp_irq(struct mpc_intsrc *m)
> -{
> -	int i;
> -
> -	for (i = 0; i < mp_irq_entries; i++) {
> -		if (!mp_irq_cmp(&mp_irqs[i], m))
> -			return;
> -	}
> -
> -	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
> -	if (++mp_irq_entries == MAX_IRQ_SOURCES)
> -		panic("Max # of irq sources exceeded!!\n");
> -}
> -
>  void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
>  {
>  	int ioapic;
> @@ -1005,7 +979,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
>  	mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
>  	mp_irq.dstirq = pin;	/* INTIN# */
>  
> -	save_mp_irq(&mp_irq);
> +	mp_save_irq(&mp_irq);
>  
>  	isa_irq_to_gsi[bus_irq] = gsi;
>  }
> @@ -1080,7 +1054,7 @@ void __init mp_config_acpi_legacy_irqs(void)
>  		mp_irq.srcbusirq = i; /* Identity mapped */
>  		mp_irq.dstirq = pin;
>  
> -		save_mp_irq(&mp_irq);
> +		mp_save_irq(&mp_irq);
>  	}
>  }
>  
> @@ -1117,7 +1091,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
>  	mp_irq.dstapic = mp_ioapics[ioapic].apicid;
>  	mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
>  
> -	save_mp_irq(&mp_irq);
> +	mp_save_irq(&mp_irq);
>  #endif
>  	return 0;
>  }
> diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
> index 9af64d9..ecaa897 100644
> --- a/arch/x86/kernel/mpparse.c
> +++ b/arch/x86/kernel/mpparse.c
> @@ -144,7 +144,7 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
>  		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
>  }
>  
> -static void __init assign_to_mp_irq(struct mpc_intsrc *m,
> +static void assign_to_mp_irq(struct mpc_intsrc *m,
>  				    struct mpc_intsrc *mp_irq)
>  {
>  	mp_irq->dstapic = m->dstapic;
> @@ -168,7 +168,7 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
>  	m->dstirq = mp_irq->dstirq;
>  }
>  
> -static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
> +static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
>  					struct mpc_intsrc *m)
>  {
>  	if (mp_irq->dstapic != m->dstapic)
> @@ -189,7 +189,8 @@ static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
>  	return 0;
>  }
>  
> -static void __init MP_intsrc_info(struct mpc_intsrc *m)
> +/* Will also be called in acpi/sfi related code */
> +void mp_save_irq(struct mpc_intsrc *m)
>  {
>  	int i;
>  
> @@ -207,7 +208,6 @@ static void __init MP_intsrc_info(struct mpc_intsrc *m)
>  #else /* CONFIG_X86_IO_APIC */
>  static inline void __init MP_bus_info(struct mpc_bus *m) {}
>  static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
> -static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
>  #endif /* CONFIG_X86_IO_APIC */
>  
>  
> @@ -337,7 +337,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
>  			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
>  			break;
>  		case MP_INTSRC:
> -			MP_intsrc_info((struct mpc_intsrc *)mpt);
> +			mp_save_irq((struct mpc_intsrc *)mpt);
>  			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
>  			break;
>  		case MP_LINTSRC:
> @@ -429,13 +429,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
>  
>  		intsrc.srcbusirq = i;
>  		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */
> -		MP_intsrc_info(&intsrc);
> +		mp_save_irq(&intsrc);
>  	}
>  
>  	intsrc.irqtype = mp_ExtINT;
>  	intsrc.srcbusirq = 0;
>  	intsrc.dstirq = 0;	/* 8259A to INTIN0 */
> -	MP_intsrc_info(&intsrc);
> +	mp_save_irq(&intsrc);
>  }

it breaks compiling when CONFIG_X86_MPPARSE is not defined.

obj-$(CONFIG_X86_MPPARSE)       += mpparse.o


config X86_MPPARSE              
        bool "Enable MPS table" if ACPI
        default y
        depends on X86_LOCAL_APIC
        ---help---              
          For old smp systems that do not have proper acpi support. Newer systems
          (esp with 64bit cpus) with acpi support, MADT and DSDT will override it



Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-06 17:50   ` Yinghai Lu
@ 2010-12-06 19:51     ` Thomas Gleixner
  2010-12-07  5:32     ` Feng Tang
  1 sibling, 0 replies; 15+ messages in thread
From: Thomas Gleixner @ 2010-12-06 19:51 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: mingo, hpa, alan, linux-kernel, feng.tang, len.brown,
	linux-tip-commits

On Mon, 6 Dec 2010, Yinghai Lu wrote:

> 
> it breaks compiling when CONFIG_X86_MPPARSE is not defined.
> 
> obj-$(CONFIG_X86_MPPARSE)       += mpparse.o

Crap. Missed that.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-06 17:50   ` Yinghai Lu
  2010-12-06 19:51     ` Thomas Gleixner
@ 2010-12-07  5:32     ` Feng Tang
  2010-12-07 15:56       ` Thomas Gleixner
  2010-12-09 20:56       ` [tip:x86/apic-cleanups] x86: Unify 3 similar ways of saving mp_irqs info tip-bot for Feng Tang
  1 sibling, 2 replies; 15+ messages in thread
From: Feng Tang @ 2010-12-07  5:32 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, tglx@linutronix.de, Brown, Len,
	linux-tip-commits@vger.kernel.org

On Tue, 7 Dec 2010 01:50:36 +0800
Yinghai Lu <yinghai@kernel.org> wrote:

> On 12/06/2010 07:01 AM, tip-bot for Feng Tang wrote:
> > Commit-ID:  a6427a341985e0379060c86b50fcdb59883e4102
> > Gitweb:
> > http://git.kernel.org/tip/a6427a341985e0379060c86b50fcdb59883e4102
> > Author:     Feng Tang <feng.tang@intel.com> AuthorDate: Fri, 3 Dec
> > 2010 12:11:58 +0800 Committer:  Thomas Gleixner <tglx@linutronix.de>
> > CommitDate: Mon, 6 Dec 2010 15:58:26 +0100
> > 
> > x86: Unify current 3 similar ways of saving IRQ info
> > 
> > There are 3 places defining the similar function of saving IRQ
> > vector info into mp_irqs[] array: mmparse/acpi/mrst. This patch
> > will reduce the redundant code, and make it only one API:
> > 	void mp_save_irq(struct mpc_intsrc *m);
> > 
> > Signed-off-by: Feng Tang <feng.tang@intel.com>
> > Cc: Alan Cox <alan@linux.intel.com>
> > Cc: Len Brown <len.brown@intel.com>
> > LKML-Reference:
> > <1291349518-3502-1-git-send-email-feng.tang@intel.com>
> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> ---
> >  arch/x86/include/asm/mpspec.h |    6 ++++++
> >  arch/x86/kernel/acpi/boot.c   |   32
> > +++----------------------------- arch/x86/kernel/mpparse.c     |
> > 14 +++++++------- arch/x86/platform/mrst/mrst.c |   30
> > ++---------------------------- 4 files changed, 18 insertions(+),
> > 64 deletions(-)
> > 
> 
> it breaks compiling when CONFIG_X86_MPPARSE is not defined.
> 
> obj-$(CONFIG_X86_MPPARSE)       += mpparse.o
> 
> 
> config X86_MPPARSE              
>         bool "Enable MPS table" if ACPI
>         default y
>         depends on X86_LOCAL_APIC
>         ---help---              
>           For old smp systems that do not have proper acpi support.
> Newer systems (esp with 64bit cpus) with acpi support, MADT and DSDT
> will override it
> 
> 
> 
> Yinghai

Thanks for the good catch! I only tried allyes/allno/allmod/def configs.

How about move the code into io_apic.c as mp_save_irq() only will get
called when CONFIG_X86_IO_APIC=y, pls review the following patch which
is against x86/platform branch of tip tree

Thanks,
Feng

>From c84518b4243e30de1470c9e3dfa38b2ee4fd34ee Mon Sep 17 00:00:00 2001
From: Feng Tang <feng.tang@intel.com>
Date: Fri, 19 Nov 2010 11:33:35 +0800
Subject: [PATCH] x86: unify current 3 similar ways of saving IRQ info

There are 3 places defining the similar function of saving IRQ
vector info into mp_irqs[] array: mmparse/acpi/mrst. This patch
will reduce the redundant code, and make it only one API in
io_apic.c:
	void mp_save_irq(struct mpc_intsrc *m);
as that func will only get called when CONFIG_X86_IO_APIC=y

Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Len Brown <len.brown@intel.com>
---
 arch/x86/include/asm/io_apic.h |    2 +
 arch/x86/kernel/acpi/boot.c    |   32 ++--------------------
 arch/x86/kernel/apic/io_apic.c |   54 ++++++++++++++++++++++++++++++++++++++
 arch/x86/kernel/mpparse.c      |   56 ++-------------------------------------
 arch/x86/platform/mrst/mrst.c  |   30 +--------------------
 5 files changed, 64 insertions(+), 110 deletions(-)

diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index a6b28d0..df49dd6 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -184,6 +184,8 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi);
 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
 extern void __init pre_init_apic_IRQ0(void);
 
+extern void mp_save_irq(struct mpc_intsrc *m);
+
 #else  /* !CONFIG_X86_IO_APIC */
 
 #define io_apic_assign_pci_irqs 0
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 71232b9..006f896 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -949,32 +949,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
 extern int es7000_plat;
 #endif
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 {
 	int ioapic;
@@ -1005,7 +979,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
 	mp_irq.dstirq = pin;	/* INTIN# */
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 
 	isa_irq_to_gsi[bus_irq] = gsi;
 }
@@ -1080,7 +1054,7 @@ void __init mp_config_acpi_legacy_irqs(void)
 		mp_irq.srcbusirq = i; /* Identity mapped */
 		mp_irq.dstirq = pin;
 
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 }
 
@@ -1117,7 +1091,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid;
 	mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 #endif
 	return 0;
 }
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 7cc0a72..4aa4dbc 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -126,6 +126,59 @@ static int __init parse_noapic(char *str)
 }
 early_param("noapic", parse_noapic);
 
+static void assign_to_mp_irq(struct mpc_intsrc *m,
+				    struct mpc_intsrc *mp_irq)
+{
+	mp_irq->dstapic = m->dstapic;
+	mp_irq->type = m->type;
+	mp_irq->irqtype = m->irqtype;
+	mp_irq->irqflag = m->irqflag;
+	mp_irq->srcbus = m->srcbus;
+	mp_irq->srcbusirq = m->srcbusirq;
+	mp_irq->dstirq = m->dstirq;
+}
+
+static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
+					struct mpc_intsrc *m)
+{
+	if (mp_irq->dstapic != m->dstapic)
+		return 1;
+	if (mp_irq->type != m->type)
+		return 2;
+	if (mp_irq->irqtype != m->irqtype)
+		return 3;
+	if (mp_irq->irqflag != m->irqflag)
+		return 4;
+	if (mp_irq->srcbus != m->srcbus)
+		return 5;
+	if (mp_irq->srcbusirq != m->srcbusirq)
+		return 6;
+	if (mp_irq->dstirq != m->dstirq)
+		return 7;
+
+	return 0;
+}
+
+/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
+void mp_save_irq(struct mpc_intsrc *m)
+{
+	int i;
+
+	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
+		" IRQ %02x, APIC ID %x, APIC INT %02x\n",
+		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
+		m->srcbusirq, m->dstapic, m->dstirq);
+
+	for (i = 0; i < mp_irq_entries; i++) {
+		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
+			return;
+	}
+
+	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
+	if (++mp_irq_entries == MAX_IRQ_SOURCES)
+		panic("Max # of irq sources exceeded!!\n");
+}
+
 struct irq_pin_list {
 	int apic, pin;
 	struct irq_pin_list *next;
@@ -136,6 +189,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node)
 	return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node);
 }
 
+
 /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
 #ifdef CONFIG_SPARSE_IRQ
 static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 9af64d9..1fe4e79 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -144,18 +144,6 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	mp_irq->dstapic = m->dstapic;
-	mp_irq->type = m->type;
-	mp_irq->irqtype = m->irqtype;
-	mp_irq->irqflag = m->irqflag;
-	mp_irq->srcbus = m->srcbus;
-	mp_irq->srcbusirq = m->srcbusirq;
-	mp_irq->dstirq = m->dstirq;
-}
-
 static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
 					struct mpc_intsrc *m)
 {
@@ -167,47 +155,9 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
 	m->srcbusirq = mp_irq->srcbusirq;
 	m->dstirq = mp_irq->dstirq;
 }
-
-static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	if (mp_irq->dstapic != m->dstapic)
-		return 1;
-	if (mp_irq->type != m->type)
-		return 2;
-	if (mp_irq->irqtype != m->irqtype)
-		return 3;
-	if (mp_irq->irqflag != m->irqflag)
-		return 4;
-	if (mp_irq->srcbus != m->srcbus)
-		return 5;
-	if (mp_irq->srcbusirq != m->srcbusirq)
-		return 6;
-	if (mp_irq->dstirq != m->dstirq)
-		return 7;
-
-	return 0;
-}
-
-static void __init MP_intsrc_info(struct mpc_intsrc *m)
-{
-	int i;
-
-	print_MP_intsrc_info(m);
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
-static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
 
@@ -337,7 +287,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
 			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
 			break;
 		case MP_INTSRC:
-			MP_intsrc_info((struct mpc_intsrc *)mpt);
+			mp_save_irq((struct mpc_intsrc *)mpt);
 			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
 			break;
 		case MP_LINTSRC:
@@ -429,13 +379,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
 
 		intsrc.srcbusirq = i;
 		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */
-		MP_intsrc_info(&intsrc);
+		mp_save_irq(&intsrc);
 	}
 
 	intsrc.irqtype = mp_ExtINT;
 	intsrc.srcbusirq = 0;
 	intsrc.dstirq = 0;	/* 8259A to INTIN0 */
-	MP_intsrc_info(&intsrc);
+	mp_save_irq(&intsrc);
 }
 
 
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index fee0b49..ea6529e 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
 EXPORT_SYMBOL_GPL(sfi_mrtc_array);
 int sfi_mrtc_num;
 
-static inline void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 /* parse all the mtimer info to a static mtimer array */
 static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 {
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 			mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 			mp_irq.dstapic = MP_APIC_ALL;
 			mp_irq.dstirq = pentry->irq;
-			save_mp_irq(&mp_irq);
+			mp_save_irq(&mp_irq);
 	}
 
 	return 0;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
 		mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 		mp_irq.dstapic = MP_APIC_ALL;
 		mp_irq.dstirq = pentry->irq;
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 	return 0;
 }
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-07  5:32     ` Feng Tang
@ 2010-12-07 15:56       ` Thomas Gleixner
  2010-12-07 18:43         ` Yinghai Lu
  2010-12-09 20:56       ` [tip:x86/apic-cleanups] x86: Unify 3 similar ways of saving mp_irqs info tip-bot for Feng Tang
  1 sibling, 1 reply; 15+ messages in thread
From: Thomas Gleixner @ 2010-12-07 15:56 UTC (permalink / raw)
  To: Feng Tang
  Cc: Yinghai Lu, mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On Tue, 7 Dec 2010, Feng Tang wrote:
> On Tue, 7 Dec 2010 01:50:36 +0800
> Yinghai Lu <yinghai@kernel.org> wrote:
>  
> +static void assign_to_mp_irq(struct mpc_intsrc *m,
> +				    struct mpc_intsrc *mp_irq)
> +{
> +	mp_irq->dstapic = m->dstapic;
> +	mp_irq->type = m->type;
> +	mp_irq->irqtype = m->irqtype;
> +	mp_irq->irqflag = m->irqflag;
> +	mp_irq->srcbus = m->srcbus;
> +	mp_irq->srcbusirq = m->srcbusirq;
> +	mp_irq->dstirq = m->dstirq;

  Can we please use the mrst version with memcpy ?

> +}
> +
> +static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
> +					struct mpc_intsrc *m)
> +{
> +	if (mp_irq->dstapic != m->dstapic)
> +		return 1;
> +	if (mp_irq->type != m->type)
> +		return 2;
> +	if (mp_irq->irqtype != m->irqtype)
> +		return 3;
> +	if (mp_irq->irqflag != m->irqflag)
> +		return 4;
> +	if (mp_irq->srcbus != m->srcbus)
> +		return 5;
> +	if (mp_irq->srcbusirq != m->srcbusirq)
> +		return 6;
> +	if (mp_irq->dstirq != m->dstirq)
> +		return 7;
> +
> +	return 0;

  Same here. No caller is interested in the detailed return value.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-07 15:56       ` Thomas Gleixner
@ 2010-12-07 18:43         ` Yinghai Lu
  2010-12-07 22:32           ` Thomas Gleixner
  0 siblings, 1 reply; 15+ messages in thread
From: Yinghai Lu @ 2010-12-07 18:43 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Feng Tang, mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On 12/07/2010 07:56 AM, Thomas Gleixner wrote:
> On Tue, 7 Dec 2010, Feng Tang wrote:
>> On Tue, 7 Dec 2010 01:50:36 +0800
>> Yinghai Lu <yinghai@kernel.org> wrote:
>>  
>> +static void assign_to_mp_irq(struct mpc_intsrc *m,
>> +				    struct mpc_intsrc *mp_irq)
>> +{
>> +	mp_irq->dstapic = m->dstapic;
>> +	mp_irq->type = m->type;
>> +	mp_irq->irqtype = m->irqtype;
>> +	mp_irq->irqflag = m->irqflag;
>> +	mp_irq->srcbus = m->srcbus;
>> +	mp_irq->srcbusirq = m->srcbusirq;
>> +	mp_irq->dstirq = m->dstirq;
> 
>   Can we please use the mrst version with memcpy ?
> 
>> +}
>> +
>> +static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
>> +					struct mpc_intsrc *m)
>> +{
>> +	if (mp_irq->dstapic != m->dstapic)
>> +		return 1;
>> +	if (mp_irq->type != m->type)
>> +		return 2;
>> +	if (mp_irq->irqtype != m->irqtype)
>> +		return 3;
>> +	if (mp_irq->irqflag != m->irqflag)
>> +		return 4;
>> +	if (mp_irq->srcbus != m->srcbus)
>> +		return 5;
>> +	if (mp_irq->srcbusirq != m->srcbusirq)
>> +		return 6;
>> +	if (mp_irq->dstirq != m->dstirq)
>> +		return 7;
>> +
>> +	return 0;
> 
>   Same here. No caller is interested in the detailed return value.
> 

ok, after look at code and git log,  i knew the reasons for those strange duplicated functions.

Alexy changed

 /* MP IRQ source entries */
-struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
+struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];

to make it decouple that with mpstable definition. so mptable will have mpc_intsrc, and acpi etc will use mp_config_intsrc

and he planed to add more member to mp_config_intsrc .... never happened.

then I added those functions with different parameters.

one year later JSR changed all back to mpc_instr...

so now have some duplicated functions....

even in mpparse.c we now have

static void print_MP_intsrc_info(struct mpc_intsrc *m)
{
        apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
                " IRQ %02x, APIC ID %x, APIC INT %02x\n",
                m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
                m->srcbusirq, m->dstapic, m->dstirq);
}

static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
{
        apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
                " IRQ %02x, APIC ID %x, APIC INT %02x\n",
                mp_irq->irqtype, mp_irq->irqflag & 3,
                (mp_irq->irqflag >> 2) & 3, mp_irq->srcbus,
                mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
}

...

So yes, we should use simple versions in arch/x86/kernel/acpi/boot.c. ( assume functions mrst.c are copied from there)

and should kill print_mp_irq_info or print_MP_intsrc_info...

Thanks

	Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-07 18:43         ` Yinghai Lu
@ 2010-12-07 22:32           ` Thomas Gleixner
  2010-12-08  1:43             ` Yinghai Lu
  2010-12-08  7:18             ` Feng Tang
  0 siblings, 2 replies; 15+ messages in thread
From: Thomas Gleixner @ 2010-12-07 22:32 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Feng Tang, mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On Tue, 7 Dec 2010, Yinghai Lu wrote:
> On 12/07/2010 07:56 AM, Thomas Gleixner wrote:
> > 
> >   Same here. No caller is interested in the detailed return value.
> > 
> 

> ok, after look at code and git log, i knew the reasons for those
> strange duplicated functions.
>
> Alexy changed
> 
>  /* MP IRQ source entries */
> -struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
> +struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
> 
> to make it decouple that with mpstable definition. so mptable will
> have mpc_intsrc, and acpi etc will use mp_config_intsrc
>
> and he planed to add more member to mp_config_intsrc .... never happened.
> 
> then I added those functions with different parameters.
> 
> one year later JSR changed all back to mpc_instr...
> 
> so now have some duplicated functions....

> So yes, we should use simple versions in
> arch/x86/kernel/acpi/boot.c. ( assume functions mrst.c are copied
> from there)
>
> and should kill print_mp_irq_info or print_MP_intsrc_info...

Nice archaelogical detective work ! :)

So now I have Fengs patch plus Yinghais series which seem to go nicely
together, but I have the feeling that there is some stuff unresolved.

Yinghai, Feng: could you please work out the missing bits an pieces
(if any) and provide me a delta patch on top of the existing patches?

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-07 22:32           ` Thomas Gleixner
@ 2010-12-08  1:43             ` Yinghai Lu
  2010-12-08  1:47               ` Yinghai Lu
  2010-12-08  1:52               ` Feng Tang
  2010-12-08  7:18             ` Feng Tang
  1 sibling, 2 replies; 15+ messages in thread
From: Yinghai Lu @ 2010-12-08  1:43 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Feng Tang, mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On 12/07/2010 02:32 PM, Thomas Gleixner wrote:
> On Tue, 7 Dec 2010, Yinghai Lu wrote:
>> On 12/07/2010 07:56 AM, Thomas Gleixner wrote:
>>>
>>>   Same here. No caller is interested in the detailed return value.
>>>
>>
> 
>> ok, after look at code and git log, i knew the reasons for those
>> strange duplicated functions.
>>
>> Alexy changed
>>
>>  /* MP IRQ source entries */
>> -struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
>> +struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
>>
>> to make it decouple that with mpstable definition. so mptable will
>> have mpc_intsrc, and acpi etc will use mp_config_intsrc
>>
>> and he planed to add more member to mp_config_intsrc .... never happened.
>>
>> then I added those functions with different parameters.
>>
>> one year later JSR changed all back to mpc_instr...
>>
>> so now have some duplicated functions....
> 
>> So yes, we should use simple versions in
>> arch/x86/kernel/acpi/boot.c. ( assume functions mrst.c are copied
>> from there)
>>
>> and should kill print_mp_irq_info or print_MP_intsrc_info...
> 
> Nice archaelogical detective work ! :)
> 
> So now I have Fengs patch plus Yinghais series which seem to go nicely
> together, but I have the feeling that there is some stuff unresolved.
> 
> Yinghai, Feng: could you please work out the missing bits an pieces
> (if any) and provide me a delta patch on top of the existing patches?
> 

Maybe Feng could send you updated version with simpler function?

Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-08  1:43             ` Yinghai Lu
@ 2010-12-08  1:47               ` Yinghai Lu
  2010-12-08  2:08                 ` Feng Tang
  2010-12-08  1:52               ` Feng Tang
  1 sibling, 1 reply; 15+ messages in thread
From: Yinghai Lu @ 2010-12-08  1:47 UTC (permalink / raw)
  To: Thomas Gleixner, Feng Tang
  Cc: mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On 12/07/2010 05:43 PM, Yinghai Lu wrote:
> On 12/07/2010 02:32 PM, Thomas Gleixner wrote:
>> On Tue, 7 Dec 2010, Yinghai Lu wrote:
>>> On 12/07/2010 07:56 AM, Thomas Gleixner wrote:
>>>>
>>>>   Same here. No caller is interested in the detailed return value.
>>>>
>>>
>>
>>> ok, after look at code and git log, i knew the reasons for those
>>> strange duplicated functions.
>>>
>>> Alexy changed
>>>
>>>  /* MP IRQ source entries */
>>> -struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
>>> +struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
>>>
>>> to make it decouple that with mpstable definition. so mptable will
>>> have mpc_intsrc, and acpi etc will use mp_config_intsrc
>>>
>>> and he planed to add more member to mp_config_intsrc .... never happened.
>>>
>>> then I added those functions with different parameters.
>>>
>>> one year later JSR changed all back to mpc_instr...
>>>
>>> so now have some duplicated functions....
>>
>>> So yes, we should use simple versions in
>>> arch/x86/kernel/acpi/boot.c. ( assume functions mrst.c are copied
>>> from there)
>>>
>>> and should kill print_mp_irq_info or print_MP_intsrc_info...
>>
>> Nice archaelogical detective work ! :)
>>
>> So now I have Fengs patch plus Yinghais series which seem to go nicely
>> together, but I have the feeling that there is some stuff unresolved.
>>
>> Yinghai, Feng: could you please work out the missing bits an pieces
>> (if any) and provide me a delta patch on top of the existing patches?
>>
> 
> Maybe Feng could send you updated version with simpler function?
> 

also I prefer to keep save_mp_irq() instead of changing it to mp_save_irq().

Thanks

	Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-08  1:43             ` Yinghai Lu
  2010-12-08  1:47               ` Yinghai Lu
@ 2010-12-08  1:52               ` Feng Tang
  1 sibling, 0 replies; 15+ messages in thread
From: Feng Tang @ 2010-12-08  1:52 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Thomas Gleixner, mingo@redhat.com, hpa@zytor.com,
	alan@linux.intel.com, linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On Wed, 8 Dec 2010 09:43:47 +0800
Yinghai Lu <yinghai@kernel.org> wrote:

> On 12/07/2010 02:32 PM, Thomas Gleixner wrote:
> > On Tue, 7 Dec 2010, Yinghai Lu wrote:
> >> On 12/07/2010 07:56 AM, Thomas Gleixner wrote:
> >>>
> >>>   Same here. No caller is interested in the detailed return value.
> >>>
> >>
> > 
> >> ok, after look at code and git log, i knew the reasons for those
> >> strange duplicated functions.
> >>
> >> Alexy changed
> >>
> >>  /* MP IRQ source entries */
> >> -struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
> >> +struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
> >>
> >> to make it decouple that with mpstable definition. so mptable will
> >> have mpc_intsrc, and acpi etc will use mp_config_intsrc
> >>
> >> and he planed to add more member to mp_config_intsrc .... never
> >> happened.
> >>
> >> then I added those functions with different parameters.
> >>
> >> one year later JSR changed all back to mpc_instr...
> >>
> >> so now have some duplicated functions....
> > 
> >> So yes, we should use simple versions in
> >> arch/x86/kernel/acpi/boot.c. ( assume functions mrst.c are copied
> >> from there)
> >>
> >> and should kill print_mp_irq_info or print_MP_intsrc_info...
> > 
> > Nice archaelogical detective work ! :)
> > 
> > So now I have Fengs patch plus Yinghais series which seem to go
> > nicely together, but I have the feeling that there is some stuff
> > unresolved.
> > 
> > Yinghai, Feng: could you please work out the missing bits an pieces
> > (if any) and provide me a delta patch on top of the existing
> > patches?
> > 
> 
> Maybe Feng could send you updated version with simpler function?

Sure, will do.

But I guess Thomas wants more cleanup :) The MP table parsing/ACPI/MRST
have many things in common, like lapic/ioapic setup and IRQ info setting,
so generally there may be some other places where we could simplify codes
by using one copy to cover all three, like what you just did for lapic
registering.

Anyway I will send one updated one for this patch.

Thanks,
Feng


> 
> Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-08  1:47               ` Yinghai Lu
@ 2010-12-08  2:08                 ` Feng Tang
  0 siblings, 0 replies; 15+ messages in thread
From: Feng Tang @ 2010-12-08  2:08 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Thomas Gleixner, mingo@redhat.com, hpa@zytor.com,
	alan@linux.intel.com, linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

On Wed, 8 Dec 2010 09:47:14 +0800
Yinghai Lu <yinghai@kernel.org> wrote:

> >>
> > 
> > Maybe Feng could send you updated version with simpler function?
> > 
> 
> also I prefer to keep save_mp_irq() instead of changing it to
> mp_save_irq().

The reason I changed the name is many similar functions and global
variables' name in io_apic.c start with "mp_", also using "mp_save_irq()"
may indicate that this piece of code originates from MP parsing code :)

Thanks,
Feng

> 
> Thanks
> 
> 	Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [tip:x86/platform] x86: Unify current 3 similar ways of saving IRQ info
  2010-12-07 22:32           ` Thomas Gleixner
  2010-12-08  1:43             ` Yinghai Lu
@ 2010-12-08  7:18             ` Feng Tang
  2010-12-09 20:57               ` [tip:x86/apic-cleanups] x86: Further simplify mp_irq info handling tip-bot for Feng Tang
  1 sibling, 1 reply; 15+ messages in thread
From: Feng Tang @ 2010-12-08  7:18 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Yinghai Lu, mingo@redhat.com, hpa@zytor.com, alan@linux.intel.com,
	linux-kernel@vger.kernel.org, Brown, Len,
	linux-tip-commits@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 5292 bytes --]

On Wed, 8 Dec 2010 06:32:46 +0800
Thomas Gleixner <tglx@linutronix.de> wrote:


> Nice archaelogical detective work ! :)
> 
> So now I have Fengs patch plus Yinghais series which seem to go nicely
> together, but I have the feeling that there is some stuff unresolved.
> 
> Yinghai, Feng: could you please work out the missing bits an pieces
> (if any) and provide me a delta patch on top of the existing patches?
> 
> Thanks,
> 
> 	tglx

Here is the incremental patch against my last one (I also put the full
patch in attachment)

Thanks,
Feng
----------------


x86: more simplification for saving irq info code

Signed-off-by: Feng Tang <feng.tang@linux.intel.com>

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 4aa4dbc..43eade5 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -126,39 +126,6 @@ static int __init parse_noapic(char *str)
 }
 early_param("noapic", parse_noapic);
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	mp_irq->dstapic = m->dstapic;
-	mp_irq->type = m->type;
-	mp_irq->irqtype = m->irqtype;
-	mp_irq->irqflag = m->irqflag;
-	mp_irq->srcbus = m->srcbus;
-	mp_irq->srcbusirq = m->srcbusirq;
-	mp_irq->dstirq = m->dstirq;
-}
-
-static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	if (mp_irq->dstapic != m->dstapic)
-		return 1;
-	if (mp_irq->type != m->type)
-		return 2;
-	if (mp_irq->irqtype != m->irqtype)
-		return 3;
-	if (mp_irq->irqflag != m->irqflag)
-		return 4;
-	if (mp_irq->srcbus != m->srcbus)
-		return 5;
-	if (mp_irq->srcbusirq != m->srcbusirq)
-		return 6;
-	if (mp_irq->dstirq != m->dstirq)
-		return 7;
-
-	return 0;
-}
-
 /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
 void mp_save_irq(struct mpc_intsrc *m)
 {
@@ -170,11 +137,11 @@ void mp_save_irq(struct mpc_intsrc *m)
 		m->srcbusirq, m->dstapic, m->dstirq);
 
 	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
+		if (!memcmp(&mp_irqs[i], m, sizeof(*m)))
 			return;
 	}
 
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
+	memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m));
 	if (++mp_irq_entries == MAX_IRQ_SOURCES)
 		panic("Max # of irq sources exceeded!!\n");
 }
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 1fe4e79..c2c2e56 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -118,21 +118,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
 
 static void __init MP_ioapic_info(struct mpc_ioapic *m)
 {
-	if (!(m->flags & MPC_APIC_USABLE))
-		return;
-
-	printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",
-	       m->apicid, m->apicver, m->apicaddr);
-
-	mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
-}
-
-static void print_MP_intsrc_info(struct mpc_intsrc *m)
-{
-	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
-		" IRQ %02x, APIC ID %x, APIC INT %02x\n",
-		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
-		m->srcbusirq, m->dstapic, m->dstirq);
+	if (m->flags & MPC_APIC_USABLE)
+		mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
 }
 
 static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
@@ -144,23 +131,11 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	m->dstapic = mp_irq->dstapic;
-	m->type = mp_irq->type;
-	m->irqtype = mp_irq->irqtype;
-	m->irqflag = mp_irq->irqflag;
-	m->srcbus = mp_irq->srcbus;
-	m->srcbusirq = mp_irq->srcbusirq;
-	m->dstirq = mp_irq->dstirq;
-}
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
-
 static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
 {
 	apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x,"
@@ -172,7 +147,6 @@ static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
 /*
  * Read/parse the MPC
  */
-
 static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str)
 {
 
@@ -734,11 +708,11 @@ static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
 	int i;
 
 	apic_printk(APIC_VERBOSE, "OLD ");
-	print_MP_intsrc_info(m);
+	print_mp_irq_info(m);
 
 	i = get_MP_intsrc_index(m);
 	if (i > 0) {
-		assign_to_mpc_intsrc(&mp_irqs[i], m);
+		memcpy(m, &mp_irqs[i], sizeof(*m));
 		apic_printk(APIC_VERBOSE, "NEW ");
 		print_mp_irq_info(&mp_irqs[i]);
 		return;
@@ -825,14 +799,14 @@ static int  __init replace_intsrc_all(struct mpc_table *mpc,
 		if (nr_m_spare > 0) {
 			apic_printk(APIC_VERBOSE, "*NEW* found\n");
 			nr_m_spare--;
-			assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]);
+			memcpy(m_spare[nr_m_spare], &mp_irqs[i], sizeof(mp_irqs[i]));
 			m_spare[nr_m_spare] = NULL;
 		} else {
 			struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;
 			count += sizeof(struct mpc_intsrc);
 			if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)
 				goto out;
-			assign_to_mpc_intsrc(&mp_irqs[i], m);
+			memcpy(m, &mp_irqs[i], sizeof(*m));
 			mpc->length = count;
 			mpt += sizeof(struct mpc_intsrc);
 		}

[-- Attachment #2: 0001-x86-unify-current-3-similar-ways-of-saving-IRQ-info.patch --]
[-- Type: text/x-patch, Size: 11102 bytes --]

>From 115d8b756a14b685a12a60e89ab60e25b05c18c4 Mon Sep 17 00:00:00 2001
From: Feng Tang <feng.tang@intel.com>
Date: Fri, 19 Nov 2010 11:33:35 +0800
Subject: [PATCH] x86: unify current 3 similar ways of saving IRQ info

There are 3 places defining the similar function of saving IRQ
vector info into mp_irqs[] array: mmparse/acpi/mrst. This patch
will reduce the redundant code, and make it only one API in
io_apic.c:
	void mp_save_irq(struct mpc_intsrc *m);
as that func will only get called when CONFIG_X86_IO_APIC=y.

Also this patch does some minor clearup for mmparse.c.

Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Len Brown <len.brown@intel.com>
Cc: Yinghai Lu <yinghai@kernel.org>
---
 arch/x86/include/asm/io_apic.h |    2 +
 arch/x86/kernel/acpi/boot.c    |   32 +------------
 arch/x86/kernel/apic/io_apic.c |   21 +++++++++
 arch/x86/kernel/mpparse.c      |   94 ++++------------------------------------
 arch/x86/platform/mrst/mrst.c  |   30 +------------
 5 files changed, 37 insertions(+), 142 deletions(-)

diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index a6b28d0..df49dd6 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -184,6 +184,8 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi);
 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
 extern void __init pre_init_apic_IRQ0(void);
 
+extern void mp_save_irq(struct mpc_intsrc *m);
+
 #else  /* !CONFIG_X86_IO_APIC */
 
 #define io_apic_assign_pci_irqs 0
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 71232b9..006f896 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -949,32 +949,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
 extern int es7000_plat;
 #endif
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 {
 	int ioapic;
@@ -1005,7 +979,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
 	mp_irq.dstirq = pin;	/* INTIN# */
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 
 	isa_irq_to_gsi[bus_irq] = gsi;
 }
@@ -1080,7 +1054,7 @@ void __init mp_config_acpi_legacy_irqs(void)
 		mp_irq.srcbusirq = i; /* Identity mapped */
 		mp_irq.dstirq = pin;
 
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 }
 
@@ -1117,7 +1091,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid;
 	mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 #endif
 	return 0;
 }
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 7cc0a72..43eade5 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -126,6 +126,26 @@ static int __init parse_noapic(char *str)
 }
 early_param("noapic", parse_noapic);
 
+/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
+void mp_save_irq(struct mpc_intsrc *m)
+{
+	int i;
+
+	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
+		" IRQ %02x, APIC ID %x, APIC INT %02x\n",
+		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
+		m->srcbusirq, m->dstapic, m->dstirq);
+
+	for (i = 0; i < mp_irq_entries; i++) {
+		if (!memcmp(&mp_irqs[i], m, sizeof(*m)))
+			return;
+	}
+
+	memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m));
+	if (++mp_irq_entries == MAX_IRQ_SOURCES)
+		panic("Max # of irq sources exceeded!!\n");
+}
+
 struct irq_pin_list {
 	int apic, pin;
 	struct irq_pin_list *next;
@@ -136,6 +156,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node)
 	return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node);
 }
 
+
 /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
 #ifdef CONFIG_SPARSE_IRQ
 static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 9af64d9..c2c2e56 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -118,21 +118,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
 
 static void __init MP_ioapic_info(struct mpc_ioapic *m)
 {
-	if (!(m->flags & MPC_APIC_USABLE))
-		return;
-
-	printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",
-	       m->apicid, m->apicver, m->apicaddr);
-
-	mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
-}
-
-static void print_MP_intsrc_info(struct mpc_intsrc *m)
-{
-	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
-		" IRQ %02x, APIC ID %x, APIC INT %02x\n",
-		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
-		m->srcbusirq, m->dstapic, m->dstirq);
+	if (m->flags & MPC_APIC_USABLE)
+		mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
 }
 
 static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
@@ -144,73 +131,11 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	mp_irq->dstapic = m->dstapic;
-	mp_irq->type = m->type;
-	mp_irq->irqtype = m->irqtype;
-	mp_irq->irqflag = m->irqflag;
-	mp_irq->srcbus = m->srcbus;
-	mp_irq->srcbusirq = m->srcbusirq;
-	mp_irq->dstirq = m->dstirq;
-}
-
-static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	m->dstapic = mp_irq->dstapic;
-	m->type = mp_irq->type;
-	m->irqtype = mp_irq->irqtype;
-	m->irqflag = mp_irq->irqflag;
-	m->srcbus = mp_irq->srcbus;
-	m->srcbusirq = mp_irq->srcbusirq;
-	m->dstirq = mp_irq->dstirq;
-}
-
-static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	if (mp_irq->dstapic != m->dstapic)
-		return 1;
-	if (mp_irq->type != m->type)
-		return 2;
-	if (mp_irq->irqtype != m->irqtype)
-		return 3;
-	if (mp_irq->irqflag != m->irqflag)
-		return 4;
-	if (mp_irq->srcbus != m->srcbus)
-		return 5;
-	if (mp_irq->srcbusirq != m->srcbusirq)
-		return 6;
-	if (mp_irq->dstirq != m->dstirq)
-		return 7;
-
-	return 0;
-}
-
-static void __init MP_intsrc_info(struct mpc_intsrc *m)
-{
-	int i;
-
-	print_MP_intsrc_info(m);
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
-static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
-
 static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
 {
 	apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x,"
@@ -222,7 +147,6 @@ static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
 /*
  * Read/parse the MPC
  */
-
 static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str)
 {
 
@@ -337,7 +261,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
 			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
 			break;
 		case MP_INTSRC:
-			MP_intsrc_info((struct mpc_intsrc *)mpt);
+			mp_save_irq((struct mpc_intsrc *)mpt);
 			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
 			break;
 		case MP_LINTSRC:
@@ -429,13 +353,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
 
 		intsrc.srcbusirq = i;
 		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */
-		MP_intsrc_info(&intsrc);
+		mp_save_irq(&intsrc);
 	}
 
 	intsrc.irqtype = mp_ExtINT;
 	intsrc.srcbusirq = 0;
 	intsrc.dstirq = 0;	/* 8259A to INTIN0 */
-	MP_intsrc_info(&intsrc);
+	mp_save_irq(&intsrc);
 }
 
 
@@ -784,11 +708,11 @@ static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
 	int i;
 
 	apic_printk(APIC_VERBOSE, "OLD ");
-	print_MP_intsrc_info(m);
+	print_mp_irq_info(m);
 
 	i = get_MP_intsrc_index(m);
 	if (i > 0) {
-		assign_to_mpc_intsrc(&mp_irqs[i], m);
+		memcpy(m, &mp_irqs[i], sizeof(*m));
 		apic_printk(APIC_VERBOSE, "NEW ");
 		print_mp_irq_info(&mp_irqs[i]);
 		return;
@@ -875,14 +799,14 @@ static int  __init replace_intsrc_all(struct mpc_table *mpc,
 		if (nr_m_spare > 0) {
 			apic_printk(APIC_VERBOSE, "*NEW* found\n");
 			nr_m_spare--;
-			assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]);
+			memcpy(m_spare[nr_m_spare], &mp_irqs[i], sizeof(mp_irqs[i]));
 			m_spare[nr_m_spare] = NULL;
 		} else {
 			struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;
 			count += sizeof(struct mpc_intsrc);
 			if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)
 				goto out;
-			assign_to_mpc_intsrc(&mp_irqs[i], m);
+			memcpy(m, &mp_irqs[i], sizeof(*m));
 			mpc->length = count;
 			mpt += sizeof(struct mpc_intsrc);
 		}
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index fee0b49..ea6529e 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
 EXPORT_SYMBOL_GPL(sfi_mrtc_array);
 int sfi_mrtc_num;
 
-static inline void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 /* parse all the mtimer info to a static mtimer array */
 static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 {
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 			mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 			mp_irq.dstapic = MP_APIC_ALL;
 			mp_irq.dstirq = pentry->irq;
-			save_mp_irq(&mp_irq);
+			mp_save_irq(&mp_irq);
 	}
 
 	return 0;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
 		mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 		mp_irq.dstapic = MP_APIC_ALL;
 		mp_irq.dstirq = pentry->irq;
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 	return 0;
 }
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:x86/apic-cleanups] x86: Unify 3 similar ways of saving mp_irqs info
  2010-12-07  5:32     ` Feng Tang
  2010-12-07 15:56       ` Thomas Gleixner
@ 2010-12-09 20:56       ` tip-bot for Feng Tang
  1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Feng Tang @ 2010-12-09 20:56 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, alan, hpa, mingo, yinghai, tglx, feng.tang,
	len.brown

Commit-ID:  2d8009ba67f9503ceadf9d5a3b5637cee291ea8d
Gitweb:     http://git.kernel.org/tip/2d8009ba67f9503ceadf9d5a3b5637cee291ea8d
Author:     Feng Tang <feng.tang@intel.com>
AuthorDate: Fri, 19 Nov 2010 11:33:35 +0800
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Thu, 9 Dec 2010 21:52:06 +0100

x86: Unify 3 similar ways of saving mp_irqs info

There are 3 places defining similar functions of saving IRQ vector
info into mp_irqs[] array: mmparse/acpi/mrst.

Replace the redundant code by a common function in io_apic.c as it's
only called when CONFIG_X86_IO_APIC=y

Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Len Brown <len.brown@intel.com>
Cc: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <20101207133204.4d913c5a@feng-i7>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 arch/x86/include/asm/io_apic.h |    2 +
 arch/x86/kernel/acpi/boot.c    |   32 ++--------------------
 arch/x86/kernel/apic/io_apic.c |   54 ++++++++++++++++++++++++++++++++++++++
 arch/x86/kernel/mpparse.c      |   56 ++-------------------------------------
 arch/x86/platform/mrst/mrst.c  |   30 +--------------------
 5 files changed, 64 insertions(+), 110 deletions(-)

diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index 107f2d8..f327d38 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -184,6 +184,8 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi);
 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
 extern void __init pre_init_apic_IRQ0(void);
 
+extern void mp_save_irq(struct mpc_intsrc *m);
+
 #else  /* !CONFIG_X86_IO_APIC */
 
 #define io_apic_assign_pci_irqs 0
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index b3cf01a..1a5b9a8 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -937,32 +937,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
 extern int es7000_plat;
 #endif
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 {
 	int ioapic;
@@ -993,7 +967,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
 	mp_irq.dstirq = pin;	/* INTIN# */
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 
 	isa_irq_to_gsi[bus_irq] = gsi;
 }
@@ -1068,7 +1042,7 @@ void __init mp_config_acpi_legacy_irqs(void)
 		mp_irq.srcbusirq = i; /* Identity mapped */
 		mp_irq.dstirq = pin;
 
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 }
 
@@ -1105,7 +1079,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
 	mp_irq.dstapic = mp_ioapics[ioapic].apicid;
 	mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
 
-	save_mp_irq(&mp_irq);
+	mp_save_irq(&mp_irq);
 #endif
 	return 0;
 }
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 8a02150..c6b44f7 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -126,6 +126,59 @@ static int __init parse_noapic(char *str)
 }
 early_param("noapic", parse_noapic);
 
+static void assign_to_mp_irq(struct mpc_intsrc *m,
+				    struct mpc_intsrc *mp_irq)
+{
+	mp_irq->dstapic = m->dstapic;
+	mp_irq->type = m->type;
+	mp_irq->irqtype = m->irqtype;
+	mp_irq->irqflag = m->irqflag;
+	mp_irq->srcbus = m->srcbus;
+	mp_irq->srcbusirq = m->srcbusirq;
+	mp_irq->dstirq = m->dstirq;
+}
+
+static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
+					struct mpc_intsrc *m)
+{
+	if (mp_irq->dstapic != m->dstapic)
+		return 1;
+	if (mp_irq->type != m->type)
+		return 2;
+	if (mp_irq->irqtype != m->irqtype)
+		return 3;
+	if (mp_irq->irqflag != m->irqflag)
+		return 4;
+	if (mp_irq->srcbus != m->srcbus)
+		return 5;
+	if (mp_irq->srcbusirq != m->srcbusirq)
+		return 6;
+	if (mp_irq->dstirq != m->dstirq)
+		return 7;
+
+	return 0;
+}
+
+/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
+void mp_save_irq(struct mpc_intsrc *m)
+{
+	int i;
+
+	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
+		" IRQ %02x, APIC ID %x, APIC INT %02x\n",
+		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
+		m->srcbusirq, m->dstapic, m->dstirq);
+
+	for (i = 0; i < mp_irq_entries; i++) {
+		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
+			return;
+	}
+
+	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
+	if (++mp_irq_entries == MAX_IRQ_SOURCES)
+		panic("Max # of irq sources exceeded!!\n");
+}
+
 struct irq_pin_list {
 	int apic, pin;
 	struct irq_pin_list *next;
@@ -136,6 +189,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node)
 	return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node);
 }
 
+
 /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
 #ifdef CONFIG_SPARSE_IRQ
 static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 27ccb70..4318687 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -144,18 +144,6 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	mp_irq->dstapic = m->dstapic;
-	mp_irq->type = m->type;
-	mp_irq->irqtype = m->irqtype;
-	mp_irq->irqflag = m->irqflag;
-	mp_irq->srcbus = m->srcbus;
-	mp_irq->srcbusirq = m->srcbusirq;
-	mp_irq->dstirq = m->dstirq;
-}
-
 static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
 					struct mpc_intsrc *m)
 {
@@ -167,47 +155,9 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
 	m->srcbusirq = mp_irq->srcbusirq;
 	m->dstirq = mp_irq->dstirq;
 }
-
-static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	if (mp_irq->dstapic != m->dstapic)
-		return 1;
-	if (mp_irq->type != m->type)
-		return 2;
-	if (mp_irq->irqtype != m->irqtype)
-		return 3;
-	if (mp_irq->irqflag != m->irqflag)
-		return 4;
-	if (mp_irq->srcbus != m->srcbus)
-		return 5;
-	if (mp_irq->srcbusirq != m->srcbusirq)
-		return 6;
-	if (mp_irq->dstirq != m->dstirq)
-		return 7;
-
-	return 0;
-}
-
-static void __init MP_intsrc_info(struct mpc_intsrc *m)
-{
-	int i;
-
-	print_MP_intsrc_info(m);
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
-static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
 
@@ -321,7 +271,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
 			skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
 			break;
 		case MP_INTSRC:
-			MP_intsrc_info((struct mpc_intsrc *)mpt);
+			mp_save_irq((struct mpc_intsrc *)mpt);
 			skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
 			break;
 		case MP_LINTSRC:
@@ -413,13 +363,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
 
 		intsrc.srcbusirq = i;
 		intsrc.dstirq = i ? i : 2;	/* IRQ0 to INTIN2 */
-		MP_intsrc_info(&intsrc);
+		mp_save_irq(&intsrc);
 	}
 
 	intsrc.irqtype = mp_ExtINT;
 	intsrc.srcbusirq = 0;
 	intsrc.dstirq = 0;	/* 8259A to INTIN0 */
-	MP_intsrc_info(&intsrc);
+	mp_save_irq(&intsrc);
 }
 
 
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index fee0b49..ea6529e 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
 EXPORT_SYMBOL_GPL(sfi_mrtc_array);
 int sfi_mrtc_num;
 
-static inline void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq,
-				struct mpc_intsrc *m)
-{
-	return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
-}
-
-static void save_mp_irq(struct mpc_intsrc *m)
-{
-	int i;
-
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_cmp(&mp_irqs[i], m))
-			return;
-	}
-
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
-	if (++mp_irq_entries == MAX_IRQ_SOURCES)
-		panic("Max # of irq sources exceeded!!\n");
-}
-
 /* parse all the mtimer info to a static mtimer array */
 static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 {
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
 			mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 			mp_irq.dstapic = MP_APIC_ALL;
 			mp_irq.dstirq = pentry->irq;
-			save_mp_irq(&mp_irq);
+			mp_save_irq(&mp_irq);
 	}
 
 	return 0;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
 		mp_irq.srcbusirq = pentry->irq;	/* IRQ */
 		mp_irq.dstapic = MP_APIC_ALL;
 		mp_irq.dstirq = pentry->irq;
-		save_mp_irq(&mp_irq);
+		mp_save_irq(&mp_irq);
 	}
 	return 0;
 }

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:x86/apic-cleanups] x86: Further simplify mp_irq info handling
  2010-12-08  7:18             ` Feng Tang
@ 2010-12-09 20:57               ` tip-bot for Feng Tang
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Feng Tang @ 2010-12-09 20:57 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, alan, hpa, mingo, yinghai, feng.tang, tglx,
	feng.tang, len.brown

Commit-ID:  0e3fa13f4ee110de007bca3bf395b77997319fc8
Gitweb:     http://git.kernel.org/tip/0e3fa13f4ee110de007bca3bf395b77997319fc8
Author:     Feng Tang <feng.tang@intel.com>
AuthorDate: Wed, 8 Dec 2010 15:18:57 +0800
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Thu, 9 Dec 2010 21:52:06 +0100

x86: Further simplify mp_irq info handling

assign_to_mp_irq() is copying the struct mpc_intsrc members one by
one. That's silly. Use memcpy() and let the compiler figure it out.
Same for the identical function assign_to_mpc_intsrc()

mp_irq_mpc_intsrc_cmp() is comparing the struct members one by one,
but no caller ever checks the different return codes. Use memcmp()
instead.

Remove the extra printk in MP_ioapic_info()

Signed-off-by: Feng Tang <feng.tang@linux.intel.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: "Alan Cox <alan@linux.intel.com>
Cc: Len Brown <len.brown@intel.com>
LKML-Reference: <20101208151857.212f0018@feng-i7>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

---
 arch/x86/kernel/apic/io_apic.c |   37 ++-----------------------------------
 arch/x86/kernel/mpparse.c      |   38 ++++++--------------------------------
 2 files changed, 8 insertions(+), 67 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index c6b44f7..bb61a55 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -126,39 +126,6 @@ static int __init parse_noapic(char *str)
 }
 early_param("noapic", parse_noapic);
 
-static void assign_to_mp_irq(struct mpc_intsrc *m,
-				    struct mpc_intsrc *mp_irq)
-{
-	mp_irq->dstapic = m->dstapic;
-	mp_irq->type = m->type;
-	mp_irq->irqtype = m->irqtype;
-	mp_irq->irqflag = m->irqflag;
-	mp_irq->srcbus = m->srcbus;
-	mp_irq->srcbusirq = m->srcbusirq;
-	mp_irq->dstirq = m->dstirq;
-}
-
-static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	if (mp_irq->dstapic != m->dstapic)
-		return 1;
-	if (mp_irq->type != m->type)
-		return 2;
-	if (mp_irq->irqtype != m->irqtype)
-		return 3;
-	if (mp_irq->irqflag != m->irqflag)
-		return 4;
-	if (mp_irq->srcbus != m->srcbus)
-		return 5;
-	if (mp_irq->srcbusirq != m->srcbusirq)
-		return 6;
-	if (mp_irq->dstirq != m->dstirq)
-		return 7;
-
-	return 0;
-}
-
 /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
 void mp_save_irq(struct mpc_intsrc *m)
 {
@@ -170,11 +137,11 @@ void mp_save_irq(struct mpc_intsrc *m)
 		m->srcbusirq, m->dstapic, m->dstirq);
 
 	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
+		if (!memcmp(&mp_irqs[i], m, sizeof(*m)))
 			return;
 	}
 
-	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
+	memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m));
 	if (++mp_irq_entries == MAX_IRQ_SOURCES)
 		panic("Max # of irq sources exceeded!!\n");
 }
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 4318687..01b0f6d 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -118,21 +118,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
 
 static void __init MP_ioapic_info(struct mpc_ioapic *m)
 {
-	if (!(m->flags & MPC_APIC_USABLE))
-		return;
-
-	printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",
-	       m->apicid, m->apicver, m->apicaddr);
-
-	mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
-}
-
-static void print_MP_intsrc_info(struct mpc_intsrc *m)
-{
-	apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
-		" IRQ %02x, APIC ID %x, APIC INT %02x\n",
-		m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
-		m->srcbusirq, m->dstapic, m->dstirq);
+	if (m->flags & MPC_APIC_USABLE)
+		mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
 }
 
 static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
@@ -144,23 +131,11 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
 		mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
 }
 
-static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
-					struct mpc_intsrc *m)
-{
-	m->dstapic = mp_irq->dstapic;
-	m->type = mp_irq->type;
-	m->irqtype = mp_irq->irqtype;
-	m->irqflag = mp_irq->irqflag;
-	m->srcbus = mp_irq->srcbus;
-	m->srcbusirq = mp_irq->srcbusirq;
-	m->dstirq = mp_irq->dstirq;
-}
 #else /* CONFIG_X86_IO_APIC */
 static inline void __init MP_bus_info(struct mpc_bus *m) {}
 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
 #endif /* CONFIG_X86_IO_APIC */
 
-
 static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
 {
 	apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x,"
@@ -172,7 +147,6 @@ static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
 /*
  * Read/parse the MPC
  */
-
 static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str)
 {
 
@@ -718,11 +692,11 @@ static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
 	int i;
 
 	apic_printk(APIC_VERBOSE, "OLD ");
-	print_MP_intsrc_info(m);
+	print_mp_irq_info(m);
 
 	i = get_MP_intsrc_index(m);
 	if (i > 0) {
-		assign_to_mpc_intsrc(&mp_irqs[i], m);
+		memcpy(m, &mp_irqs[i], sizeof(*m));
 		apic_printk(APIC_VERBOSE, "NEW ");
 		print_mp_irq_info(&mp_irqs[i]);
 		return;
@@ -809,14 +783,14 @@ static int  __init replace_intsrc_all(struct mpc_table *mpc,
 		if (nr_m_spare > 0) {
 			apic_printk(APIC_VERBOSE, "*NEW* found\n");
 			nr_m_spare--;
-			assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]);
+			memcpy(m_spare[nr_m_spare], &mp_irqs[i], sizeof(mp_irqs[i]));
 			m_spare[nr_m_spare] = NULL;
 		} else {
 			struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;
 			count += sizeof(struct mpc_intsrc);
 			if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)
 				goto out;
-			assign_to_mpc_intsrc(&mp_irqs[i], m);
+			memcpy(m, &mp_irqs[i], sizeof(*m));
 			mpc->length = count;
 			mpt += sizeof(struct mpc_intsrc);
 		}

^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2010-12-09 20:57 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-03  4:11 [PATCH] x86: unify current 3 similar ways of saving IRQ info Feng Tang
2010-12-06 15:01 ` [tip:x86/platform] x86: Unify " tip-bot for Feng Tang
2010-12-06 17:50   ` Yinghai Lu
2010-12-06 19:51     ` Thomas Gleixner
2010-12-07  5:32     ` Feng Tang
2010-12-07 15:56       ` Thomas Gleixner
2010-12-07 18:43         ` Yinghai Lu
2010-12-07 22:32           ` Thomas Gleixner
2010-12-08  1:43             ` Yinghai Lu
2010-12-08  1:47               ` Yinghai Lu
2010-12-08  2:08                 ` Feng Tang
2010-12-08  1:52               ` Feng Tang
2010-12-08  7:18             ` Feng Tang
2010-12-09 20:57               ` [tip:x86/apic-cleanups] x86: Further simplify mp_irq info handling tip-bot for Feng Tang
2010-12-09 20:56       ` [tip:x86/apic-cleanups] x86: Unify 3 similar ways of saving mp_irqs info tip-bot for Feng Tang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox