2.4.25-pre8, 2.6.2-rc2 mca.c - pass irq_safe around
PATCH 1/1 2.4.25-pre8, 2.6.2-rc2 mca.c - pass irq_safe around
The patch is against 2.4.25-pre8 bk. It also applies to 2.6.2-rc2 bk (with some fuzz and offsets), after applying my previous 6 patches to 2.6.2-rc2 mca.c.
Patches from Ben Woodward to calculate irq_safe once and pass it around.
Index: 25-pre8.5/arch/ia64/kernel/mca.c
arch/ia64/kernel/mca.c Fri, 06 Feb 2004 17:29:43 +1100 kaos (linux-2.4/s/c/5_mca.c 1.1.3.2.3.1.1.1.1.2.1.1.1.1.1.1.1.6 644) renamed from arch/ia64/kernel/mca.c Fri, 06 Feb 2004 17:15:40 +1100 kaos (linux-2.4/s/c/5_mca.c 1.1.3.2.3.1.1.1.1.2.1.1.1.1.1.1.1.5 644) +5 -5
@@ -130,7 +130,7 @@ static int cmc_polling_enabled = 1; */ static int cpe_poll_enabled = 1; -extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size); +extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe); static struct tq_struct cmc_disable_tq, cmc_enable_tq;
@@ -201,17 +201,17 @@ ia64_log_init(int sal_info_type) * Get the current MCA log from SAL and copy it into the OS log buffer. * * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) + * irq_safe whether you can use printk at this point * Outputs : size (total record length) * *buffer (ptr to error record) * */ static u64 -ia64_log_get(int sal_info_type, u8 **buffer) +ia64_log_get(int sal_info_type, u8 **buffer, int irq_safe) { sal_log_record_header_t *log_buffer; u64 total_len = 0; int s; - int irq_safe = sal_info_type != SAL_INFO_TYPE_MCA && sal_info_type != SAL_INFO_TYPE_INIT; IA64_LOG_LOCK(sal_info_type);
@@ -252,11 +252,11 @@ ia64_mca_log_sal_error_record(int sal_in int irq_safe = sal_info_type != SAL_INFO_TYPE_MCA && sal_info_type != SAL_INFO_TYPE_INIT; static const char * const rec_name[] = { "MCA", "INIT", "CMC", "CPE" }; - size = ia64_log_get(sal_info_type, &buffer); + size = ia64_log_get(sal_info_type, &buffer, irq_safe); if (!size) return; - salinfo_log_wakeup(sal_info_type, buffer, size); + salinfo_log_wakeup(sal_info_type, buffer, size, irq_safe); if (irq_safe || called_from_init) printk(KERN_INFO "CPU %d: SAL log contains %s error record\n",
Index: 25-pre8.5/arch/ia64/kernel/salinfo.c
arch/ia64/kernel/salinfo.c Fri, 06 Feb 2004 17:29:43 +1100 kaos (linux-2.4/K/g/22_salinfo.c 1.1.1.1.1.1.1.3 644) renamed from arch/ia64/kernel/salinfo.c Sun, 25 Jan 2004 06:42:02 +1100 kaos (linux-2.4/K/g/22_salinfo.c 1.1.1.1.1.1.1.2 644) +2 -2
@@ -194,12 +194,12 @@ shift1_data_saved (struct salinfo_data * * changes. */ void -salinfo_log_wakeup(int type, u8 *buffer, u64 size) +salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe) { struct salinfo_data *data = salinfo_data + type; struct salinfo_data_saved *data_saved; unsigned long flags = 0; - int i, irqsafe = type != SAL_INFO_TYPE_MCA && type != SAL_INFO_TYPE_INIT; + int i; int saved_size = ARRAY_SIZE(data->data_saved); BUG_ON(type >= ARRAY_SIZE(salinfo_log_name));
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line · Keith Owens
Keith> The patch is against 2.4.25-pre8 bk. It also applies to Keith> 2.6.2-rc2 bk (with some fuzz and offsets), after applying my Keith> previous 6 patches to 2.6.2-rc2 mca.c.
Keith> Patches from Ben Woodward to calculate irq_safe once and pass Keith> it around.
I applied the patch but I'm wondering what happens if someone adds a new SAL_INFO_TYPE which isn't irq-safe. Wouldn't it be safer to flip things around and check sal_info_type against known-to-be-safe values?
--david
Quoted 7 lines · David Mosberger
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line · Keith Owens
Keith> Patches from Ben Woodward to calculate
irq_safeonce and pass Keith> it around.I applied the patch but I'm wondering what happens if someone adds a new
SAL_INFO_TYPEwhich isn't irq-safe. Wouldn't it be safer to flip things around and checksal_info_typeagainst known-to-be-safe values?
Adding a new type requires changes all through mca.c and salinfo.c, as well as user space. The periodic timer in salinfo has to explicitly scan the irq unsafe entries. We would spot any new unsafe type.