From: Yinghai Lu <yhlu.kernel@gmail.com>
To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Dhaval Giani <dhaval@linux.vnet.ibm.com>,
Mike Travis <travis@sgi.com>,
Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, Yinghai Lu <yhlu.kernel@gmail.com>
Subject: [PATCH 32/33] remove >= nr_irqs checking with config_have_sparse_irq
Date: Wed, 6 Aug 2008 01:43:14 -0700 [thread overview]
Message-ID: <1218012195-10429-33-git-send-email-yhlu.kernel@gmail.com> (raw)
In-Reply-To: <1218012195-10429-32-git-send-email-yhlu.kernel@gmail.com>
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
arch/x86/kernel/io_apic_64.c | 36 ++++++++++++++++++++++++------------
arch/x86/kernel/irq_64.c | 2 +-
drivers/char/random.c | 4 ++++
fs/proc/proc_misc.c | 29 +++++++++++++++++------------
kernel/irq/chip.c | 28 +++++++++++++++++++++++++++-
kernel/irq/manage.c | 37 +++++++++++++++++++++++++++++++------
6 files changed, 104 insertions(+), 32 deletions(-)
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
index 8bb6565..1416925 100644
--- a/arch/x86/kernel/io_apic_64.c
+++ b/arch/x86/kernel/io_apic_64.c
@@ -135,6 +135,26 @@ static void __init init_work(void *data)
static struct irq_cfg *irq_cfgx;
DEFINE_DYN_ARRAY(irq_cfgx, sizeof(struct irq_cfg), nr_irq_cfg, PAGE_SIZE, init_work);
+static struct irq_cfg *get_irq_cfg_without_new(unsigned int irq)
+{
+ struct irq_cfg *cfg;
+
+ BUG_ON(irq == -1U);
+
+ cfg = &irq_cfgx[0];
+ while (cfg) {
+ if (cfg->irq == irq)
+ return cfg;
+
+ if (cfg->irq == -1U) {
+ return NULL;
+ }
+ cfg = cfg->next;
+ }
+
+ return NULL;
+}
+
static struct irq_cfg *get_irq_cfg(unsigned int irq)
{
struct irq_cfg *cfg, *cfg_pri;
@@ -380,7 +400,6 @@ static inline void io_apic_sync(unsigned int apic)
struct irq_cfg *cfg; \
struct irq_pin_list *entry; \
\
- BUG_ON(irq >= nr_irqs); \
cfg = get_irq_cfg(irq); \
entry = cfg->irq_2_pin; \
for (;;) { \
@@ -460,7 +479,6 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
struct irq_cfg *cfg;
struct irq_pin_list *entry;
- BUG_ON(irq >= nr_irqs);
cfg = get_irq_cfg(irq);
entry = cfg->irq_2_pin;
for (;;) {
@@ -529,7 +547,6 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin)
struct irq_cfg *cfg;
struct irq_pin_list *entry;
- BUG_ON(irq >= nr_irqs);
cfg = get_irq_cfg(irq);
entry = cfg->irq_2_pin;
if (!entry) {
@@ -820,7 +837,6 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
best_guess = irq;
}
}
- BUG_ON(best_guess >= nr_irqs);
return best_guess;
}
@@ -952,7 +968,6 @@ static int pin_2_irq(int idx, int apic, int pin)
irq += nr_ioapic_registers[i++];
irq += pin;
}
- BUG_ON(irq >= nr_irqs);
return irq;
}
@@ -974,7 +989,6 @@ static int __assign_irq_vector(int irq, cpumask_t mask)
int cpu;
struct irq_cfg *cfg;
- BUG_ON((unsigned)irq >= nr_irqs);
cfg = get_irq_cfg(irq);
/* Only try and allocate irqs on cpus that are present */
@@ -1048,7 +1062,6 @@ static void __clear_irq_vector(int irq)
cpumask_t mask;
int cpu, vector;
- BUG_ON((unsigned)irq >= nr_irqs);
cfg = get_irq_cfg(irq);
BUG_ON(!cfg->vector);
@@ -1898,8 +1911,6 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void)
struct irq_desc *desc;
struct irq_cfg *cfg;
irq = __get_cpu_var(vector_irq)[vector];
- if (irq >= nr_irqs)
- continue;
desc = get_irq_desc(irq);
cfg = get_irq_cfg(irq);
@@ -2475,16 +2486,17 @@ int create_irq(void)
int irq;
int new;
unsigned long flags;
- struct irq_cfg *cfg_new;
+ struct irq_cfg *cfg_new, *cfg;
irq = -ENOSPC;
spin_lock_irqsave(&vector_lock, flags);
for (new = (nr_irqs - 1); new >= 0; new--) {
if (platform_legacy_irq(new))
continue;
- cfg_new = get_irq_cfg(new);
- if (cfg_new->vector != 0)
+ cfg = get_irq_cfg_without_new(new);
+ if (!cfg || cfg->vector != 0)
continue;
+ cfg_new = get_irq_cfg(new);
if (__assign_irq_vector(new, TARGET_CPUS) == 0)
irq = new;
break;
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c
index c2fe49f..118f24f 100644
--- a/arch/x86/kernel/irq_64.c
+++ b/arch/x86/kernel/irq_64.c
@@ -202,7 +202,7 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
stack_overflow_check(regs);
#endif
- if (likely(irq < nr_irqs))
+ if (likely(get_irq_desc_without_new(irq)))
generic_handle_irq(irq);
else {
if (!disable_apic)
diff --git a/drivers/char/random.c b/drivers/char/random.c
index d9e7a08..02c4f13 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -649,8 +649,10 @@ void add_interrupt_randomness(int irq)
struct timer_rand_state *state;
struct irq_desc *desc;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
desc = get_irq_desc(irq);
state = desc->timer_rand_state;
@@ -920,8 +922,10 @@ void rand_initialize_irq(int irq)
struct timer_rand_state *state;
struct irq_desc *desc;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
desc = get_irq_desc(irq);
state = desc->timer_rand_state;
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
index 32de344..2a50625 100644
--- a/fs/proc/proc_misc.c
+++ b/fs/proc/proc_misc.c
@@ -495,19 +495,15 @@ static const struct file_operations proc_vmalloc_operations = {
static int show_stat(struct seq_file *p, void *v)
{
- int i;
+ int i, j;
unsigned long jif;
cputime64_t user, nice, system, idle, iowait, irq, softirq, steal;
cputime64_t guest;
u64 sum = 0;
struct timespec boottime;
- unsigned int *per_irq_sum;
+ unsigned int per_irq_sum;
struct irq_desc *desc;
- per_irq_sum = kzalloc(sizeof(unsigned int)*nr_irqs, GFP_KERNEL);
- if (!per_irq_sum)
- return -ENOMEM;
-
user = nice = system = idle = iowait =
irq = softirq = steal = cputime64_zero;
guest = cputime64_zero;
@@ -515,8 +511,6 @@ static int show_stat(struct seq_file *p, void *v)
jif = boottime.tv_sec;
for_each_possible_cpu(i) {
- int j;
-
user = cputime64_add(user, kstat_cpu(i).cpustat.user);
nice = cputime64_add(nice, kstat_cpu(i).cpustat.nice);
system = cputime64_add(system, kstat_cpu(i).cpustat.system);
@@ -531,7 +525,6 @@ static int show_stat(struct seq_file *p, void *v)
temp = kstat_irqs_cpu(j, i);
sum += temp;
- per_irq_sum[j] += temp;
}
sum += arch_irq_stat_cpu(i);
}
@@ -574,8 +567,21 @@ static int show_stat(struct seq_file *p, void *v)
}
seq_printf(p, "intr %llu", (unsigned long long)sum);
- for (i = 0; i < nr_irqs; i++)
- seq_printf(p, " %u", per_irq_sum[i]);
+ /* sum again ? it could be updated? have another field in irq_desc?*/
+ for (j = 0; j < nr_irqs; j++) {
+ per_irq_sum = 0;
+ desc = get_irq_desc_without_new(j);
+
+ if (desc)
+ for_each_possible_cpu(i) {
+ unsigned int temp;
+
+ temp = kstat_irqs_cpu(j, i);
+ per_irq_sum += temp;
+ }
+
+ seq_printf(p, " %u", per_irq_sum);
+ }
seq_printf(p,
"\nctxt %llu\n"
@@ -589,7 +595,6 @@ static int show_stat(struct seq_file *p, void *v)
nr_running(),
nr_iowait());
- kfree(per_irq_sum);
return 0;
}
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index d09800a..2476e96 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -27,10 +27,12 @@ void dynamic_irq_init(unsigned int irq)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
return;
}
+#endif
/* Ensure we don't have left over values from a previous use of this irq */
desc = get_irq_desc(irq);
@@ -60,10 +62,12 @@ void dynamic_irq_cleanup(unsigned int irq)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
return;
}
+#endif
desc = get_irq_desc(irq);
spin_lock_irqsave(&desc->lock, flags);
@@ -92,10 +96,12 @@ int set_irq_chip(unsigned int irq, struct irq_chip *chip)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq);
return -EINVAL;
}
+#endif
if (!chip)
chip = &no_irq_chip;
@@ -121,10 +127,12 @@ int set_irq_type(unsigned int irq, unsigned int type)
unsigned long flags;
int ret = -ENXIO;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
return -ENODEV;
}
+#endif
desc = get_irq_desc(irq);
if (desc->chip->set_type) {
@@ -148,11 +156,13 @@ int set_irq_data(unsigned int irq, void *data)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
printk(KERN_ERR
"Trying to install controller data for IRQ%d\n", irq);
return -EINVAL;
}
+#endif
desc = get_irq_desc(irq);
spin_lock_irqsave(&desc->lock, flags);
@@ -174,11 +184,13 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
printk(KERN_ERR
"Trying to install msi data for IRQ%d\n", irq);
return -EINVAL;
}
+#endif
desc = get_irq_desc(irq);
spin_lock_irqsave(&desc->lock, flags);
desc->msi_desc = entry;
@@ -200,8 +212,16 @@ int set_irq_chip_data(unsigned int irq, void *data)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
+ if (irq >= nr_irqs) {
+ printk(KERN_ERR
+ "Trying to install chip data for IRQ%d\n", irq);
+ return -EINVAL;
+ }
+#endif
+
desc = get_irq_desc(irq);
- if (irq >= nr_irqs || !desc->chip) {
+ if (!desc->chip) {
printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq);
return -EINVAL;
}
@@ -545,11 +565,13 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
printk(KERN_ERR
"Trying to install type control for IRQ%d\n", irq);
return;
}
+#endif
desc = get_irq_desc(irq);
@@ -610,11 +632,13 @@ void __init set_irq_noprobe(unsigned int irq)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
return;
}
+#endif
desc = get_irq_desc(irq);
@@ -628,11 +652,13 @@ void __init set_irq_probe(unsigned int irq)
struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs) {
printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
return;
}
+#endif
desc = get_irq_desc(irq);
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 13db003..f6735a2 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -34,8 +34,10 @@ void synchronize_irq(unsigned int irq)
struct irq_desc *desc = get_irq_desc(irq);
unsigned int status;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
do {
unsigned long flags;
@@ -142,12 +144,15 @@ int irq_select_affinity(unsigned int irq)
*/
void disable_irq_nosync(unsigned int irq)
{
- struct irq_desc *desc = get_irq_desc(irq);
+ struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
+ desc = get_irq_desc(irq);
spin_lock_irqsave(&desc->lock, flags);
if (!desc->depth++) {
desc->status |= IRQ_DISABLED;
@@ -171,11 +176,14 @@ EXPORT_SYMBOL(disable_irq_nosync);
*/
void disable_irq(unsigned int irq)
{
- struct irq_desc *desc = get_irq_desc(irq);
+ struct irq_desc *desc;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
+ desc = get_irq_desc(irq);
disable_irq_nosync(irq);
if (desc->action)
synchronize_irq(irq);
@@ -213,12 +221,15 @@ static void __enable_irq(struct irq_desc *desc, unsigned int irq)
*/
void enable_irq(unsigned int irq)
{
- struct irq_desc *desc = get_irq_desc(irq);
+ struct irq_desc *desc;
unsigned long flags;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
+ desc = get_irq_desc(irq);
spin_lock_irqsave(&desc->lock, flags);
__enable_irq(desc, irq);
spin_unlock_irqrestore(&desc->lock, flags);
@@ -290,10 +301,16 @@ EXPORT_SYMBOL(set_irq_wake);
*/
int can_request_irq(unsigned int irq, unsigned long irqflags)
{
- struct irq_desc *desc = get_irq_desc(irq);
+ struct irq_desc *desc;
struct irqaction *action;
- if (irq >= nr_irqs || desc->status & IRQ_NOREQUEST)
+#ifndef CONFIG_HAVE_SPARSE_IRQ
+ if (irq >= nr_irqs)
+ return 0;
+#endif
+
+ desc = get_irq_desc(irq);
+ if (desc->status & IRQ_NOREQUEST)
return 0;
action =desc->action;
@@ -345,16 +362,19 @@ static int __irq_set_trigger(struct irq_chip *chip, unsigned int irq,
*/
int setup_irq(unsigned int irq, struct irqaction *new)
{
- struct irq_desc *desc = get_irq_desc(irq);
+ struct irq_desc *desc;
struct irqaction *old, **p;
const char *old_name = NULL;
unsigned long flags;
int shared = 0;
int ret;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return -EINVAL;
+#endif
+ desc = get_irq_desc(irq);
if (desc->chip == &no_irq_chip)
return -ENOSYS;
/*
@@ -506,8 +526,11 @@ void free_irq(unsigned int irq, void *dev_id)
unsigned long flags;
WARN_ON(in_interrupt());
+
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
desc = get_irq_desc(irq);
spin_lock_irqsave(&desc->lock, flags);
@@ -621,8 +644,10 @@ int request_irq(unsigned int irq, irq_handler_t handler,
*/
if ((irqflags & IRQF_SHARED) && !dev_id)
return -EINVAL;
+#ifndef CONFIG_HAVE_SPARSE_IRQ
if (irq >= nr_irqs)
return -EINVAL;
+#endif
desc = get_irq_desc(irq);
if (desc->status & IRQ_NOREQUEST)
return -EINVAL;
--
1.5.4.5
next prev parent reply other threads:[~2008-08-06 9:04 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-06 8:42 [PATCH 00/33] dyn_array and nr_irqs support v4 Yinghai Lu
2008-08-06 8:42 ` [PATCH 01/33] x86: add after_bootmem for 32bit Yinghai Lu
2008-08-06 8:42 ` [PATCH 02/33] x86: remove irq_vectors_limits Yinghai Lu
2008-08-06 8:42 ` [PATCH 03/33] add dyn_array support Yinghai Lu
2008-08-06 8:42 ` [PATCH 04/33] add per_cpu_dyn_array support Yinghai Lu
2008-08-06 8:42 ` [PATCH 05/33] x86: alloc dyn_array all alltogether Yinghai Lu
2008-08-06 8:42 ` [PATCH 06/33] x86: enable dyn_array support Yinghai Lu
2008-08-06 8:42 ` [PATCH 07/33] introduce nr_irqs Yinghai Lu
2008-08-06 8:42 ` [PATCH 08/33] x86: using nr_irqs Yinghai Lu
2008-08-06 8:42 ` [PATCH 09/33] drivers/char to use nr_irqs Yinghai Lu
2008-08-06 8:42 ` [PATCH 10/33] drivers/net " Yinghai Lu
2008-08-06 8:42 ` [PATCH 11/33] drivers intr remapping " Yinghai Lu
2008-08-06 8:42 ` [PATCH 12/33] drivers/pcmcia " Yinghai Lu
2008-08-06 8:42 ` [PATCH 13/33] drivers/rtc " Yinghai Lu
2008-08-06 8:42 ` [PATCH 14/33] drivers/scsi " Yinghai Lu
2008-08-06 8:42 ` [PATCH 15/33] drivers/serial " Yinghai Lu
2008-08-06 8:42 ` [PATCH 16/33] drivers proc " Yinghai Lu
2008-08-06 8:42 ` [PATCH 17/33] drivers xen events " Yinghai Lu
2008-08-06 8:43 ` [PATCH 18/33] make irq_timer_state to use dyn_array Yinghai Lu
2008-08-06 8:43 ` [PATCH 19/33] make irq2_iommu " Yinghai Lu
2008-08-06 8:43 ` [PATCH 20/33] make irq_desc " Yinghai Lu
2008-08-06 8:43 ` [PATCH 21/33] serial: change remove NR_IRQS in 8250.c v2 Yinghai Lu
2008-08-06 8:43 ` [PATCH 22/33] irq: make irqs in kernel stat use per_cpu_dyn_array Yinghai Lu
2008-08-06 8:43 ` [PATCH 23/33] x86: use dyn_array in io_apic_xx.c Yinghai Lu
2008-08-06 8:43 ` [PATCH 24/33] x86: get mp_irqs from madt Yinghai Lu
2008-08-06 8:43 ` [PATCH 25/33] x86: remove nr_irq_vectors Yinghai Lu
2008-08-06 8:43 ` [PATCH 26/33] x86_64: use get_irq_desc together with dyn_array Yinghai Lu
2008-08-06 8:43 ` [PATCH 27/33] x86: add get_irq_cfg in io_apic_64.c Yinghai Lu
2008-08-06 8:43 ` [PATCH 28/33] x86: put irq_2_pin pointer into irq_cfg Yinghai Lu
2008-08-06 8:43 ` [PATCH 29/33] x86: put timer_rand_state pointer into irq_desc Yinghai Lu
2008-08-06 8:43 ` [PATCH 30/33] x86: move kstat_irqs from kstat to irq_desc Yinghai Lu
2008-08-06 8:43 ` [PATCH 31/33] replace loop with nr_irqs with for_each_irq_desc Yinghai Lu
2008-08-06 8:43 ` Yinghai Lu [this message]
2008-08-06 8:43 ` [PATCH 33/33] x86_64: add irq_desc in function in paramater Yinghai Lu
2008-08-06 10:29 ` [PATCH 32/33] remove >= nr_irqs checking with config_have_sparse_irq Yinghai Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1218012195-10429-33-git-send-email-yhlu.kernel@gmail.com \
--to=yhlu.kernel@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=dhaval@linux.vnet.ibm.com \
--cc=ebiederm@xmission.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
--cc=travis@sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.