[Patch Part2 v4 26/33] x86/irq: Move private data in struct irq_cfg into dedicated data structure

2015-01-19 Thread Jiang Liu
Several fields in struct irq_cfg are private to vector.c, so move it
into dedicated data structure. This helps to hide implementation
details.

Signed-off-by: Jiang Liu 
Cc: Konrad Rzeszutek Wilk 
Cc: Tony Luck 
Cc: Joerg Roedel 
Cc: Greg Kroah-Hartman 
Cc: Bjorn Helgaas 
Cc: Benjamin Herrenschmidt 
Cc: Rafael J. Wysocki 
Cc: Randy Dunlap 
Cc: Yinghai Lu 
Cc: Borislav Petkov 
Link: 
http://lkml.kernel.org/r/1416901802-24211-35-git-send-email-jiang@linux.intel.com
Signed-off-by: Thomas Gleixner 
Tested-by: Joerg Roedel 
---
 arch/x86/include/asm/hw_irq.h |3 -
 arch/x86/kernel/apic/vector.c |  221 ++---
 2 files changed, 119 insertions(+), 105 deletions(-)

diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index 330445236484..e7ae6eb84934 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -171,11 +171,8 @@ enum {
 };
 
 struct irq_cfg {
-   cpumask_var_t   domain;
-   cpumask_var_t   old_domain;
unsigned intdest_apicid;
u8  vector;
-   u8  move_in_progress : 1;
 };
 
 extern struct irq_domain *x86_vector_domain;
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index a5ce2eef0528..0e7c39beefed 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -21,11 +21,18 @@
 #include 
 #include 
 
+struct apic_chip_data {
+   struct irq_cfg  cfg;
+   cpumask_var_t   domain;
+   cpumask_var_t   old_domain;
+   u8  move_in_progress : 1;
+};
+
 struct irq_domain *x86_vector_domain;
 static DEFINE_RAW_SPINLOCK(vector_lock);
 static struct irq_chip lapic_controller;
 #ifdef CONFIG_X86_IO_APIC
-static struct irq_cfg *legacy_irq_cfgs[NR_IRQS_LEGACY];
+static struct apic_chip_data *legacy_irq_data[NR_IRQS_LEGACY];
 #endif
 
 void lock_vector_lock(void)
@@ -41,12 +48,7 @@ void unlock_vector_lock(void)
raw_spin_unlock(_lock);
 }
 
-struct irq_cfg *irq_cfg(unsigned int irq)
-{
-   return irqd_cfg(irq_get_irq_data(irq));
-}
-
-struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
+static struct apic_chip_data *apic_chip_data(struct irq_data *irq_data)
 {
if (!irq_data)
return NULL;
@@ -57,36 +59,48 @@ struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
return irq_data->chip_data;
 }
 
-static struct irq_cfg *alloc_irq_cfg(int node)
+struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
+{
+   struct apic_chip_data *data = apic_chip_data(irq_data);
+
+   return data ? >cfg : NULL;
+}
+
+struct irq_cfg *irq_cfg(unsigned int irq)
 {
-   struct irq_cfg *cfg;
+   return irqd_cfg(irq_get_irq_data(irq));
+}
 
-   cfg = kzalloc_node(sizeof(*cfg), GFP_KERNEL, node);
-   if (!cfg)
+static struct apic_chip_data *alloc_apic_chip_data(int node)
+{
+   struct apic_chip_data *data;
+
+   data = kzalloc_node(sizeof(*data), GFP_KERNEL, node);
+   if (!data)
return NULL;
-   if (!zalloc_cpumask_var_node(>domain, GFP_KERNEL, node))
-   goto out_cfg;
-   if (!zalloc_cpumask_var_node(>old_domain, GFP_KERNEL, node))
+   if (!zalloc_cpumask_var_node(>domain, GFP_KERNEL, node))
+   goto out_data;
+   if (!zalloc_cpumask_var_node(>old_domain, GFP_KERNEL, node))
goto out_domain;
-   return cfg;
+   return data;
 out_domain:
-   free_cpumask_var(cfg->domain);
-out_cfg:
-   kfree(cfg);
+   free_cpumask_var(data->domain);
+out_data:
+   kfree(data);
return NULL;
 }
 
-static void free_irq_cfg(struct irq_cfg *cfg)
+static void free_apic_chip_data(struct apic_chip_data *data)
 {
-   if (cfg) {
-   free_cpumask_var(cfg->domain);
-   free_cpumask_var(cfg->old_domain);
-   kfree(cfg);
+   if (data) {
+   free_cpumask_var(data->domain);
+   free_cpumask_var(data->old_domain);
+   kfree(data);
}
 }
 
-static int
-__assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
+static int __assign_irq_vector(int irq, struct apic_chip_data *d,
+  const struct cpumask *mask)
 {
/*
 * NOTE! The local APIC isn't very good at handling
@@ -104,7 +118,7 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const 
struct cpumask *mask)
int cpu, err;
cpumask_var_t tmp_mask;
 
-   if (cfg->move_in_progress)
+   if (d->move_in_progress)
return -EBUSY;
 
if (!alloc_cpumask_var(_mask, GFP_ATOMIC))
@@ -112,26 +126,26 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const 
struct cpumask *mask)
 
/* Only try and allocate irqs on cpus that are present */
err = -ENOSPC;
-   cpumask_clear(cfg->old_domain);
+   cpumask_clear(d->old_domain);
cpu = cpumask_first_and(mask, 

[Patch Part2 v4 26/33] x86/irq: Move private data in struct irq_cfg into dedicated data structure

2015-01-19 Thread Jiang Liu
Several fields in struct irq_cfg are private to vector.c, so move it
into dedicated data structure. This helps to hide implementation
details.

Signed-off-by: Jiang Liu jiang@linux.intel.com
Cc: Konrad Rzeszutek Wilk konrad.w...@oracle.com
Cc: Tony Luck tony.l...@intel.com
Cc: Joerg Roedel j...@8bytes.org
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Bjorn Helgaas bhelg...@google.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Rafael J. Wysocki r...@rjwysocki.net
Cc: Randy Dunlap rdun...@infradead.org
Cc: Yinghai Lu ying...@kernel.org
Cc: Borislav Petkov b...@alien8.de
Link: 
http://lkml.kernel.org/r/1416901802-24211-35-git-send-email-jiang@linux.intel.com
Signed-off-by: Thomas Gleixner t...@linutronix.de
Tested-by: Joerg Roedel jroe...@suse.de
---
 arch/x86/include/asm/hw_irq.h |3 -
 arch/x86/kernel/apic/vector.c |  221 ++---
 2 files changed, 119 insertions(+), 105 deletions(-)

diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index 330445236484..e7ae6eb84934 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -171,11 +171,8 @@ enum {
 };
 
 struct irq_cfg {
-   cpumask_var_t   domain;
-   cpumask_var_t   old_domain;
unsigned intdest_apicid;
u8  vector;
-   u8  move_in_progress : 1;
 };
 
 extern struct irq_domain *x86_vector_domain;
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index a5ce2eef0528..0e7c39beefed 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -21,11 +21,18 @@
 #include asm/desc.h
 #include asm/irq_remapping.h
 
+struct apic_chip_data {
+   struct irq_cfg  cfg;
+   cpumask_var_t   domain;
+   cpumask_var_t   old_domain;
+   u8  move_in_progress : 1;
+};
+
 struct irq_domain *x86_vector_domain;
 static DEFINE_RAW_SPINLOCK(vector_lock);
 static struct irq_chip lapic_controller;
 #ifdef CONFIG_X86_IO_APIC
-static struct irq_cfg *legacy_irq_cfgs[NR_IRQS_LEGACY];
+static struct apic_chip_data *legacy_irq_data[NR_IRQS_LEGACY];
 #endif
 
 void lock_vector_lock(void)
@@ -41,12 +48,7 @@ void unlock_vector_lock(void)
raw_spin_unlock(vector_lock);
 }
 
-struct irq_cfg *irq_cfg(unsigned int irq)
-{
-   return irqd_cfg(irq_get_irq_data(irq));
-}
-
-struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
+static struct apic_chip_data *apic_chip_data(struct irq_data *irq_data)
 {
if (!irq_data)
return NULL;
@@ -57,36 +59,48 @@ struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
return irq_data-chip_data;
 }
 
-static struct irq_cfg *alloc_irq_cfg(int node)
+struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
+{
+   struct apic_chip_data *data = apic_chip_data(irq_data);
+
+   return data ? data-cfg : NULL;
+}
+
+struct irq_cfg *irq_cfg(unsigned int irq)
 {
-   struct irq_cfg *cfg;
+   return irqd_cfg(irq_get_irq_data(irq));
+}
 
-   cfg = kzalloc_node(sizeof(*cfg), GFP_KERNEL, node);
-   if (!cfg)
+static struct apic_chip_data *alloc_apic_chip_data(int node)
+{
+   struct apic_chip_data *data;
+
+   data = kzalloc_node(sizeof(*data), GFP_KERNEL, node);
+   if (!data)
return NULL;
-   if (!zalloc_cpumask_var_node(cfg-domain, GFP_KERNEL, node))
-   goto out_cfg;
-   if (!zalloc_cpumask_var_node(cfg-old_domain, GFP_KERNEL, node))
+   if (!zalloc_cpumask_var_node(data-domain, GFP_KERNEL, node))
+   goto out_data;
+   if (!zalloc_cpumask_var_node(data-old_domain, GFP_KERNEL, node))
goto out_domain;
-   return cfg;
+   return data;
 out_domain:
-   free_cpumask_var(cfg-domain);
-out_cfg:
-   kfree(cfg);
+   free_cpumask_var(data-domain);
+out_data:
+   kfree(data);
return NULL;
 }
 
-static void free_irq_cfg(struct irq_cfg *cfg)
+static void free_apic_chip_data(struct apic_chip_data *data)
 {
-   if (cfg) {
-   free_cpumask_var(cfg-domain);
-   free_cpumask_var(cfg-old_domain);
-   kfree(cfg);
+   if (data) {
+   free_cpumask_var(data-domain);
+   free_cpumask_var(data-old_domain);
+   kfree(data);
}
 }
 
-static int
-__assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
+static int __assign_irq_vector(int irq, struct apic_chip_data *d,
+  const struct cpumask *mask)
 {
/*
 * NOTE! The local APIC isn't very good at handling
@@ -104,7 +118,7 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const 
struct cpumask *mask)
int cpu, err;
cpumask_var_t tmp_mask;
 
-   if (cfg-move_in_progress)
+   if (d-move_in_progress)
return -EBUSY;
 
if (!alloc_cpumask_var(tmp_mask, GFP_ATOMIC))
@@ -112,26