[RFC Patch V1 03/12] PowerPC, PCI: Use for_pci_msi_entry() to access MSI device list

2015-07-09 Thread Jiang Liu
Use accessor for_pci_msi_entry() to access MSI device list, so we could
easily move msi_list from struct pci_dev into struct device later.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/platforms/cell/axon_msi.c |6 +++---
 arch/powerpc/platforms/pasemi/msi.c|4 ++--
 arch/powerpc/platforms/powernv/pci.c   |4 ++--
 arch/powerpc/platforms/pseries/msi.c   |6 +++---
 arch/powerpc/sysdev/fsl_msi.c  |4 ++--
 arch/powerpc/sysdev/mpic_u3msi.c   |4 ++--
 arch/powerpc/sysdev/ppc4xx_hsta_msi.c  |4 ++--
 arch/powerpc/sysdev/ppc4xx_msi.c   |4 ++--
 8 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/arch/powerpc/platforms/cell/axon_msi.c 
b/arch/powerpc/platforms/cell/axon_msi.c
index fe51de4fcf13..306888acb737 100644
--- a/arch/powerpc/platforms/cell/axon_msi.c
+++ b/arch/powerpc/platforms/cell/axon_msi.c
@@ -213,7 +213,7 @@ static int setup_msi_msg_address(struct pci_dev *dev, 
struct msi_msg *msg)
return -ENODEV;
}
 
-   entry = list_first_entry(dev-msi_list, struct msi_desc, list);
+   entry = first_pci_msi_entry(dev);
 
for (; dn; dn = of_get_next_parent(dn)) {
if (entry-msi_attrib.is_64) {
@@ -269,7 +269,7 @@ static int axon_msi_setup_msi_irqs(struct pci_dev *dev, int 
nvec, int type)
if (rc)
return rc;
 
-   list_for_each_entry(entry, dev-msi_list, list) {
+   for_each_pci_msi_entry(entry, dev) {
virq = irq_create_direct_mapping(msic-irq_domain);
if (virq == NO_IRQ) {
dev_warn(dev-dev,
@@ -292,7 +292,7 @@ static void axon_msi_teardown_msi_irqs(struct pci_dev *dev)
 
dev_dbg(dev-dev, axon_msi: tearing down msi irqs\n);
 
-   list_for_each_entry(entry, dev-msi_list, list) {
+   for_each_pci_msi_entry(entry, dev) {
if (entry-irq == NO_IRQ)
continue;
 
diff --git a/arch/powerpc/platforms/pasemi/msi.c 
b/arch/powerpc/platforms/pasemi/msi.c
index 27f2b187a91b..e66ef1943338 100644
--- a/arch/powerpc/platforms/pasemi/msi.c
+++ b/arch/powerpc/platforms/pasemi/msi.c
@@ -66,7 +66,7 @@ static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
 
pr_debug(pasemi_msi_teardown_msi_irqs, pdev %p\n, pdev);
 
-   list_for_each_entry(entry, pdev-msi_list, list) {
+   for_each_pci_msi_entry(entry, pdev) {
if (entry-irq == NO_IRQ)
continue;
 
@@ -94,7 +94,7 @@ static int pasemi_msi_setup_msi_irqs(struct pci_dev *pdev, 
int nvec, int type)
msg.address_hi = 0;
msg.address_lo = PASEMI_MSI_ADDR;
 
-   list_for_each_entry(entry, pdev-msi_list, list) {
+   for_each_pci_msi_entry(entry, pdev) {
/* Allocate 16 interrupts for now, since that's the grouping for
 * affinity. This can be changed later if it turns out 32 is too
 * few MSIs for someone, but restrictions will apply to how the
diff --git a/arch/powerpc/platforms/powernv/pci.c 
b/arch/powerpc/platforms/powernv/pci.c
index 765d8ed558d0..bc6d4e02e29c 100644
--- a/arch/powerpc/platforms/powernv/pci.c
+++ b/arch/powerpc/platforms/powernv/pci.c
@@ -61,7 +61,7 @@ int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int 
type)
if (pdev-no_64bit_msi  !phb-msi32_support)
return -ENODEV;
 
-   list_for_each_entry(entry, pdev-msi_list, list) {
+   for_each_pci_msi_entry(entry, pdev) {
if (!entry-msi_attrib.is_64  !phb-msi32_support) {
pr_warn(%s: Supports only 64-bit MSIs\n,
pci_name(pdev));
@@ -103,7 +103,7 @@ void pnv_teardown_msi_irqs(struct pci_dev *pdev)
if (WARN_ON(!phb))
return;
 
-   list_for_each_entry(entry, pdev-msi_list, list) {
+   for_each_pci_msi_entry(entry, pdev) {
if (entry-irq == NO_IRQ)
continue;
irq_set_msi_desc(entry-irq, NULL);
diff --git a/arch/powerpc/platforms/pseries/msi.c 
b/arch/powerpc/platforms/pseries/msi.c
index c22bb647cce6..272e9ec1ab54 100644
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -118,7 +118,7 @@ static void rtas_teardown_msi_irqs(struct pci_dev *pdev)
 {
struct msi_desc *entry;
 
-   list_for_each_entry(entry, pdev-msi_list, list) {
+   for_each_pci_msi_entry(entry, pdev) {
if (entry-irq == NO_IRQ)
continue;
 
@@ -350,7 +350,7 @@ static int check_msix_entries(struct pci_dev *pdev)
 * So we must reject such requests. */
 
expected = 0;
-   list_for_each_entry(entry, pdev-msi_list, list) {
+   for_each_pci_msi_entry(entry, pdev) {
if (entry-msi_attrib.entry_nr != expected) {
pr_debug(rtas_msi: bad MSI-X entries.\n);
return -EINVAL;
@@ -462,7 +462,7 @@ again

[RFT v2 26/48] powerpc, irq: Prepare for killing the first parameter 'irq' of irq_flow_handler_t

2015-06-03 Thread Jiang Liu
Change irq flow handler to prepare for killing the first parameter 'irq'
of irq_flow_handler_t.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/platforms/512x/mpc5121_ads_cpld.c  |4 +++-
 arch/powerpc/platforms/85xx/socrates_fpga_pic.c |2 +-
 arch/powerpc/platforms/cell/interrupt.c |3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c 
b/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
index ca3a062ed1b9..4411ed51803e 100644
--- a/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
+++ b/arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
@@ -105,8 +105,10 @@ cpld_pic_get_irq(int offset, u8 ignore, u8 __iomem 
*statusp,
 }
 
 static void
-cpld_pic_cascade(unsigned int irq, struct irq_desc *desc)
+cpld_pic_cascade(unsigned int __irq, struct irq_desc *desc)
 {
+   unsigned int irq;
+
irq = cpld_pic_get_irq(0, PCI_IGNORE, cpld_regs-pci_status,
cpld_regs-pci_mask);
if (irq != NO_IRQ) {
diff --git a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c 
b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
index 55a9682b9529..5153e58654f7 100644
--- a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
+++ b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c
@@ -100,7 +100,7 @@ void socrates_fpga_pic_cascade(unsigned int irq, struct 
irq_desc *desc)
 * See if we actually have an interrupt, call generic handling code if
 * we do.
 */
-   cascade_irq = socrates_fpga_pic_get_irq(irq);
+   cascade_irq = socrates_fpga_pic_get_irq(irq_desc_get_irq(desc));
 
if (cascade_irq != NO_IRQ)
generic_handle_irq(cascade_irq);
diff --git a/arch/powerpc/platforms/cell/interrupt.c 
b/arch/powerpc/platforms/cell/interrupt.c
index 3af8324c122e..e2dd6c9d3a78 100644
--- a/arch/powerpc/platforms/cell/interrupt.c
+++ b/arch/powerpc/platforms/cell/interrupt.c
@@ -99,8 +99,9 @@ static void iic_ioexc_eoi(struct irq_data *d)
 {
 }
 
-static void iic_ioexc_cascade(unsigned int irq, struct irq_desc *desc)
+static void iic_ioexc_cascade(unsigned int __irq, struct irq_desc *desc)
 {
+   unsigned int irq = irq_desc_get_irq(desc);
struct irq_chip *chip = irq_desc_get_chip(desc);
struct cbe_iic_regs __iomem *node_iic =
(void __iomem *)irq_desc_get_handler_data(desc);
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[RFT v2 38/48] genirq, powerpc: Kill the first parameter 'irq' of irq_flow_handler_t

2015-06-03 Thread Jiang Liu
Now most IRQ flow handlers make no use of the first parameter 'irq'.
And for those who do make use of 'irq', we could easily get the irq
number through irq_desc-irq_data-irq. So kill the first parameter
'irq' of irq_flow_handler_t.

To ease review, I have split the changes into several parts, though
they should be merge as one to support bisecting.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/include/asm/qe_ic.h|   23 +--
 arch/powerpc/include/asm/tsi108_pci.h   |2 +-
 arch/powerpc/platforms/512x/mpc5121_ads_cpld.c  |2 +-
 arch/powerpc/platforms/52xx/media5200.c |2 +-
 arch/powerpc/platforms/52xx/mpc52xx_gpt.c   |2 +-
 arch/powerpc/platforms/82xx/pq2ads-pci-pic.c|2 +-
 arch/powerpc/platforms/85xx/common.c|2 +-
 arch/powerpc/platforms/85xx/mpc85xx_cds.c   |5 ++---
 arch/powerpc/platforms/85xx/mpc85xx_ds.c|2 +-
 arch/powerpc/platforms/85xx/socrates_fpga_pic.c |2 +-
 arch/powerpc/platforms/86xx/pic.c   |2 +-
 arch/powerpc/platforms/8xx/m8xx_setup.c |2 +-
 arch/powerpc/platforms/cell/axon_msi.c  |2 +-
 arch/powerpc/platforms/cell/interrupt.c |2 +-
 arch/powerpc/platforms/cell/spider-pic.c|2 +-
 arch/powerpc/platforms/chrp/setup.c |2 +-
 arch/powerpc/platforms/embedded6xx/hlwd-pic.c   |3 +--
 arch/powerpc/platforms/embedded6xx/mvme5100.c   |2 +-
 arch/powerpc/platforms/pseries/setup.c  |2 +-
 arch/powerpc/sysdev/ge/ge_pic.c |2 +-
 arch/powerpc/sysdev/ge/ge_pic.h |2 +-
 arch/powerpc/sysdev/mpic.c  |2 +-
 arch/powerpc/sysdev/qe_lib/qe_ic.c  |4 ++--
 arch/powerpc/sysdev/tsi108_pci.c|2 +-
 arch/powerpc/sysdev/uic.c   |2 +-
 arch/powerpc/sysdev/xilinx_intc.c   |2 +-
 26 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/arch/powerpc/include/asm/qe_ic.h b/arch/powerpc/include/asm/qe_ic.h
index 25784cc959a0..1e155ca6d33c 100644
--- a/arch/powerpc/include/asm/qe_ic.h
+++ b/arch/powerpc/include/asm/qe_ic.h
@@ -59,14 +59,14 @@ enum qe_ic_grp_id {
 
 #ifdef CONFIG_QUICC_ENGINE
 void qe_ic_init(struct device_node *node, unsigned int flags,
-   void (*low_handler)(unsigned int irq, struct irq_desc *desc),
-   void (*high_handler)(unsigned int irq, struct irq_desc *desc));
+   void (*low_handler)(struct irq_desc *desc),
+   void (*high_handler)(struct irq_desc *desc));
 unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic);
 unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic);
 #else
 static inline void qe_ic_init(struct device_node *node, unsigned int flags,
-   void (*low_handler)(unsigned int irq, struct irq_desc *desc),
-   void (*high_handler)(unsigned int irq, struct irq_desc *desc))
+   void (*low_handler)(struct irq_desc *desc),
+   void (*high_handler)(struct irq_desc *desc))
 {}
 static inline unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
 { return 0; }
@@ -78,8 +78,7 @@ void qe_ic_set_highest_priority(unsigned int virq, int high);
 int qe_ic_set_priority(unsigned int virq, unsigned int priority);
 int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int 
high);
 
-static inline void qe_ic_cascade_low_ipic(unsigned int irq,
- struct irq_desc *desc)
+static inline void qe_ic_cascade_low_ipic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
@@ -88,8 +87,7 @@ static inline void qe_ic_cascade_low_ipic(unsigned int irq,
generic_handle_irq(cascade_irq);
 }
 
-static inline void qe_ic_cascade_high_ipic(unsigned int irq,
-  struct irq_desc *desc)
+static inline void qe_ic_cascade_high_ipic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
@@ -98,8 +96,7 @@ static inline void qe_ic_cascade_high_ipic(unsigned int irq,
generic_handle_irq(cascade_irq);
 }
 
-static inline void qe_ic_cascade_low_mpic(unsigned int irq,
- struct irq_desc *desc)
+static inline void qe_ic_cascade_low_mpic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
@@ -111,8 +108,7 @@ static inline void qe_ic_cascade_low_mpic(unsigned int irq,
chip-irq_eoi(desc-irq_data);
 }
 
-static inline void qe_ic_cascade_high_mpic(unsigned int irq,
-  struct irq_desc *desc)
+static inline void qe_ic_cascade_high_mpic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic

[RFT v2 04/48] powerpc, irq: Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc

2015-06-03 Thread Jiang Liu
Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc while we
already have a pointer to corresponding irq_desc.

Note: this patch has been queued for 4.2 by Michael Ellerman 
m...@ellerman.id.au

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/platforms/52xx/mpc52xx_gpt.c |2 +-
 arch/powerpc/platforms/cell/axon_msi.c|2 +-
 arch/powerpc/platforms/embedded6xx/hlwd-pic.c |2 +-
 arch/powerpc/sysdev/uic.c |2 +-
 arch/powerpc/sysdev/xics/xics-common.c|2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c 
b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c
index c949ca055712..63016621aff8 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c
@@ -193,7 +193,7 @@ static struct irq_chip mpc52xx_gpt_irq_chip = {
 
 void mpc52xx_gpt_irq_cascade(unsigned int virq, struct irq_desc *desc)
 {
-   struct mpc52xx_gpt_priv *gpt = irq_get_handler_data(virq);
+   struct mpc52xx_gpt_priv *gpt = irq_desc_get_handler_data(desc);
int sub_virq;
u32 status;
 
diff --git a/arch/powerpc/platforms/cell/axon_msi.c 
b/arch/powerpc/platforms/cell/axon_msi.c
index 623bd961465a..817d0e6747ea 100644
--- a/arch/powerpc/platforms/cell/axon_msi.c
+++ b/arch/powerpc/platforms/cell/axon_msi.c
@@ -95,7 +95,7 @@ static void msic_dcr_write(struct axon_msic *msic, unsigned 
int dcr_n, u32 val)
 static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc)
 {
struct irq_chip *chip = irq_desc_get_chip(desc);
-   struct axon_msic *msic = irq_get_handler_data(irq);
+   struct axon_msic *msic = irq_desc_get_handler_data(desc);
u32 write_offset, msi;
int idx;
int retry = 0;
diff --git a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c 
b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c
index c269caee58f9..9dd154d6f89a 100644
--- a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c
+++ b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c
@@ -124,7 +124,7 @@ static void hlwd_pic_irq_cascade(unsigned int cascade_virq,
  struct irq_desc *desc)
 {
struct irq_chip *chip = irq_desc_get_chip(desc);
-   struct irq_domain *irq_domain = irq_get_handler_data(cascade_virq);
+   struct irq_domain *irq_domain = irq_desc_get_handler_data(desc);
unsigned int virq;
 
raw_spin_lock(desc-lock);
diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c
index 7c37157d4c24..e763fe215cf5 100644
--- a/arch/powerpc/sysdev/uic.c
+++ b/arch/powerpc/sysdev/uic.c
@@ -198,7 +198,7 @@ void uic_irq_cascade(unsigned int virq, struct irq_desc 
*desc)
 {
struct irq_chip *chip = irq_desc_get_chip(desc);
struct irq_data *idata = irq_desc_get_irq_data(desc);
-   struct uic *uic = irq_get_handler_data(virq);
+   struct uic *uic = irq_desc_get_handler_data(desc);
u32 msr;
int src;
int subvirq;
diff --git a/arch/powerpc/sysdev/xics/xics-common.c 
b/arch/powerpc/sysdev/xics/xics-common.c
index 878a54036a25..76be7b00dd80 100644
--- a/arch/powerpc/sysdev/xics/xics-common.c
+++ b/arch/powerpc/sysdev/xics/xics-common.c
@@ -227,7 +227,7 @@ void xics_migrate_irqs_away(void)
 
/* Locate interrupt server */
server = -1;
-   ics = irq_get_chip_data(virq);
+   ics = irq_desc_get_chip_data(desc);
if (ics)
server = ics-get_server(ics, irq);
if (server  0) {
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[Patch v3 24/36] powerpc, irq: Use access helper irq_data_get_affinity_mask()

2015-06-01 Thread Jiang Liu
Use access helper irq_data_get_affinity_mask() to hide implementation
details of struct irq_desc.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/kernel/irq.c   |2 +-
 arch/powerpc/sysdev/xics/ics-opal.c |2 +-
 arch/powerpc/sysdev/xics/ics-rtas.c |2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 45096033d37b..290559df1e8b 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -441,7 +441,7 @@ void migrate_irqs(void)
 
chip = irq_data_get_irq_chip(data);
 
-   cpumask_and(mask, data-affinity, map);
+   cpumask_and(mask, irq_data_get_affinity_mask(data), map);
if (cpumask_any(mask) = nr_cpu_ids) {
pr_warn(Breaking affinity for irq %i\n, irq);
cpumask_copy(mask, map);
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c 
b/arch/powerpc/sysdev/xics/ics-opal.c
index 68c7e5cc98e0..3996393c254d 100644
--- a/arch/powerpc/sysdev/xics/ics-opal.c
+++ b/arch/powerpc/sysdev/xics/ics-opal.c
@@ -54,7 +54,7 @@ static void ics_opal_unmask_irq(struct irq_data *d)
if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS)
return;
 
-   server = xics_get_irq_server(d-irq, d-affinity, 0);
+   server = xics_get_irq_server(d-irq, irq_data_get_affinity_mask(d), 0);
server = ics_opal_mangle_server(server);
 
rc = opal_set_xive(hw_irq, server, DEFAULT_PRIORITY);
diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c 
b/arch/powerpc/sysdev/xics/ics-rtas.c
index 0af97deb83f3..e2665a9dfc0f 100644
--- a/arch/powerpc/sysdev/xics/ics-rtas.c
+++ b/arch/powerpc/sysdev/xics/ics-rtas.c
@@ -47,7 +47,7 @@ static void ics_rtas_unmask_irq(struct irq_data *d)
if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS)
return;
 
-   server = xics_get_irq_server(d-irq, d-affinity, 0);
+   server = xics_get_irq_server(d-irq, irq_data_get_affinity_mask(d), 0);
 
call_status = rtas_call(ibm_set_xive, 3, 1, NULL, hw_irq, server,
DEFAULT_PRIORITY);
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[Patch v3 33/36] genirq: Use helper function to access irq_data-msi_desc

2015-06-01 Thread Jiang Liu
Use irq_data access helper to access irq_data-msi_desc, so we could
move msi_desc from struct irq_data into struct irq_common_data later.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/ia64/kernel/msi_ia64.c |2 +-
 arch/ia64/sn/kernel/msi_sn.c|2 +-
 arch/powerpc/sysdev/xics/ics-opal.c |2 +-
 arch/powerpc/sysdev/xics/ics-rtas.c |2 +-
 arch/tile/kernel/pci_gx.c   |2 +-
 drivers/pci/msi.c   |2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c
index 6c50d332b7d7..af4eaec0f7c3 100644
--- a/arch/ia64/kernel/msi_ia64.c
+++ b/arch/ia64/kernel/msi_ia64.c
@@ -23,7 +23,7 @@ static int ia64_set_msi_irq_affinity(struct irq_data *idata,
if (irq_prepare_move(irq, cpu))
return -1;
 
-   __get_cached_msi_msg(idata-msi_desc, msg);
+   __get_cached_msi_msg(irq_data_get_msi_desc(idata), msg);
 
addr = msg.address_lo;
addr = MSI_ADDR_DEST_ID_MASK;
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c
index 42b5a13af142..fb25065b22c6 100644
--- a/arch/ia64/sn/kernel/msi_sn.c
+++ b/arch/ia64/sn/kernel/msi_sn.c
@@ -175,7 +175,7 @@ static int sn_set_msi_irq_affinity(struct irq_data *data,
 * Release XIO resources for the old MSI PCI address
 */
 
-   __get_cached_msi_msg(data-msi_desc, msg);
+   __get_cached_msi_msg(irq_data_get_msi_desc(data), msg);
sn_pdev = (struct pcidev_info *)sn_irq_info-irq_pciioinfo;
pdev = sn_pdev-pdi_linux_pcidev;
provider = SN_PCIDEV_BUSPROVIDER(pdev);
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c 
b/arch/powerpc/sysdev/xics/ics-opal.c
index 3996393c254d..27c936c080a6 100644
--- a/arch/powerpc/sysdev/xics/ics-opal.c
+++ b/arch/powerpc/sysdev/xics/ics-opal.c
@@ -72,7 +72,7 @@ static unsigned int ics_opal_startup(struct irq_data *d)
 * card, using the MSI mask bits. Firmware doesn't appear to unmask
 * at that level, so we do it here by hand.
 */
-   if (d-msi_desc)
+   if (irq_data_get_msi_desc(d))
pci_msi_unmask_irq(d);
 #endif
 
diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c 
b/arch/powerpc/sysdev/xics/ics-rtas.c
index e2665a9dfc0f..3854dd41558d 100644
--- a/arch/powerpc/sysdev/xics/ics-rtas.c
+++ b/arch/powerpc/sysdev/xics/ics-rtas.c
@@ -75,7 +75,7 @@ static unsigned int ics_rtas_startup(struct irq_data *d)
 * card, using the MSI mask bits. Firmware doesn't appear to unmask
 * at that level, so we do it here by hand.
 */
-   if (d-msi_desc)
+   if (irq_data_get_msi_desc(d))
pci_msi_unmask_irq(d);
 #endif
/* unmask it */
diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index b1df847d0686..65b701b3b5ed 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -1442,7 +1442,7 @@ static struct pci_ops tile_cfg_ops = {
 /* MSI support starts here. */
 static unsigned int tilegx_msi_startup(struct irq_data *d)
 {
-   if (d-msi_desc)
+   if (irq_data_get_msi_desc(d))
pci_msi_unmask_irq(d);
 
return 0;
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index be6034cf5c21..c2f0da733d3a 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -1178,7 +1178,7 @@ EXPORT_SYMBOL(pci_enable_msix_range);
  */
 void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg)
 {
-   struct msi_desc *desc = irq_data-msi_desc;
+   struct msi_desc *desc = irq_data_get_msi_desc(irq_data);
 
/*
 * For MSI-X desc-irq is always equal to irq_data-irq. For
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [v3, 33/36] genirq: Use helper function to access irq_data-msi_desc

2015-06-01 Thread Jiang Liu
On 2015/6/2 11:45, Michael Ellerman wrote:
 On Mon, 2015-01-06 at 08:05:42 UTC, Jiang Liu wrote:
 Use irq_data access helper to access irq_data-msi_desc, so we could
 move msi_desc from struct irq_data into struct irq_common_data later.

 Signed-off-by: Jiang Liu jiang@linux.intel.com
 ---
  arch/powerpc/sysdev/xics/ics-opal.c |2 +-
  arch/powerpc/sysdev/xics/ics-rtas.c |2 +-

 diff --git a/arch/powerpc/sysdev/xics/ics-opal.c 
 b/arch/powerpc/sysdev/xics/ics-opal.c
 index 3996393c254d..27c936c080a6 100644
 --- a/arch/powerpc/sysdev/xics/ics-opal.c
 +++ b/arch/powerpc/sysdev/xics/ics-opal.c
 @@ -72,7 +72,7 @@ static unsigned int ics_opal_startup(struct irq_data *d)
   * card, using the MSI mask bits. Firmware doesn't appear to unmask
   * at that level, so we do it here by hand.
   */
 -if (d-msi_desc)
 +if (irq_data_get_msi_desc(d))
  pci_msi_unmask_irq(d);
  #endif
  
 diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c 
 b/arch/powerpc/sysdev/xics/ics-rtas.c
 index e2665a9dfc0f..3854dd41558d 100644
 --- a/arch/powerpc/sysdev/xics/ics-rtas.c
 +++ b/arch/powerpc/sysdev/xics/ics-rtas.c
 @@ -75,7 +75,7 @@ static unsigned int ics_rtas_startup(struct irq_data *d)
   * card, using the MSI mask bits. Firmware doesn't appear to unmask
   * at that level, so we do it here by hand.
   */
 -if (d-msi_desc)
 +if (irq_data_get_msi_desc(d))
  pci_msi_unmask_irq(d);
  #endif
  /* unmask it */
 
 These look OK.
 
 Though I would point out we already have 16 irq_foo_get_bar() accessors?!
Hi Michael,
Thanks for review. We are trying to solve some issues introduced
by hierarchy irqdomain/irqchip by splitting irq_data into a common part
(irq_common_data) and per-chip part(irq_data). These accessors are used
to ease the transition and hide implementation details.
Thanks!
Gerry

 
 Acked-by: Michael Ellerman m...@ellerman.id.au
 
 cheers
 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[Patch v2 08/14] genirq: Introduce helper function irq_data_get_affinity_mask()

2015-05-20 Thread Jiang Liu
Introduce helper function irq_data_get_affinity_mask() and
irq_get_affinity_mask() to hide implementation details,
so we could move field 'affinity' from struct irq_data into
struct irq_common_data later.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/alpha/kernel/irq.c   |2 +-
 arch/arm/kernel/irq.c |4 ++--
 arch/arm64/kernel/irq.c   |4 ++--
 arch/blackfin/mach-common/ints-priority.c |3 ++-
 arch/ia64/kernel/iosapic.c|2 +-
 arch/ia64/kernel/irq.c|6 +++---
 arch/ia64/kernel/msi_ia64.c   |4 ++--
 arch/ia64/sn/kernel/msi_sn.c  |2 +-
 arch/metag/kernel/irq.c   |   10 ++
 arch/mips/bcm63xx/irq.c   |2 +-
 arch/mips/cavium-octeon/octeon-irq.c  |   14 --
 arch/mips/pmcs-msp71xx/msp_irq_cic.c  |3 ++-
 arch/mn10300/kernel/cevt-mn10300.c|2 +-
 arch/mn10300/kernel/irq.c |   13 +++--
 arch/parisc/kernel/irq.c  |   12 ++--
 arch/powerpc/kernel/irq.c |2 +-
 arch/powerpc/sysdev/xics/ics-opal.c   |2 +-
 arch/powerpc/sysdev/xics/ics-rtas.c   |2 +-
 arch/sh/kernel/irq.c  |7 ---
 arch/sparc/kernel/irq_64.c|   12 +++-
 arch/sparc/kernel/leon_kernel.c   |6 +++---
 arch/x86/kernel/apic/io_apic.c|2 +-
 arch/x86/kernel/apic/vector.c |5 ++---
 arch/x86/kernel/irq.c |5 +++--
 arch/xtensa/kernel/irq.c  |   10 ++
 drivers/irqchip/irq-mips-gic.c|2 +-
 drivers/parisc/iosapic.c  |2 +-
 drivers/sh/intc/chip.c|6 +++---
 drivers/xen/events/events_base.c  |4 ++--
 include/linux/irq.h   |   12 
 30 files changed, 93 insertions(+), 69 deletions(-)

diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
index 7b2be251c30f..bd8e47699cad 100644
--- a/arch/alpha/kernel/irq.c
+++ b/arch/alpha/kernel/irq.c
@@ -60,7 +60,7 @@ int irq_select_affinity(unsigned int irq)
cpu = (cpu  (NR_CPUS-1) ? cpu + 1 : 0);
last_cpu = cpu;
 
-   cpumask_copy(data-affinity, cpumask_of(cpu));
+   cpumask_copy(irq_data_get_affinity_mask(data), cpumask_of(cpu));
chip-irq_set_affinity(data, cpumask_of(cpu), false);
return 0;
 }
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
index 350f188c92d2..baf8edebe26f 100644
--- a/arch/arm/kernel/irq.c
+++ b/arch/arm/kernel/irq.c
@@ -140,7 +140,7 @@ int __init arch_probe_nr_irqs(void)
 static bool migrate_one_irq(struct irq_desc *desc)
 {
struct irq_data *d = irq_desc_get_irq_data(desc);
-   const struct cpumask *affinity = d-affinity;
+   const struct cpumask *affinity = irq_data_get_affinity_mask(d);
struct irq_chip *c;
bool ret = false;
 
@@ -160,7 +160,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
if (!c-irq_set_affinity)
pr_debug(IRQ%u: unable to set affinity\n, d-irq);
else if (c-irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK  
ret)
-   cpumask_copy(d-affinity, affinity);
+   cpumask_copy(irq_data_get_affinity_mask(d), affinity);
 
return ret;
 }
diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c
index 240b75c0e94f..463fa2e7e34c 100644
--- a/arch/arm64/kernel/irq.c
+++ b/arch/arm64/kernel/irq.c
@@ -61,7 +61,7 @@ void __init init_IRQ(void)
 static bool migrate_one_irq(struct irq_desc *desc)
 {
struct irq_data *d = irq_desc_get_irq_data(desc);
-   const struct cpumask *affinity = d-affinity;
+   const struct cpumask *affinity = irq_data_get_affinity_mask(d);
struct irq_chip *c;
bool ret = false;
 
@@ -81,7 +81,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
if (!c-irq_set_affinity)
pr_debug(IRQ%u: unable to set affinity\n, d-irq);
else if (c-irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK  
ret)
-   cpumask_copy(d-affinity, affinity);
+   cpumask_copy(irq_data_get_affinity_mask(d), affinity);
 
return ret;
 }
diff --git a/arch/blackfin/mach-common/ints-priority.c 
b/arch/blackfin/mach-common/ints-priority.c
index 7236bdfc71e6..332a434b4669 100644
--- a/arch/blackfin/mach-common/ints-priority.c
+++ b/arch/blackfin/mach-common/ints-priority.c
@@ -194,7 +194,8 @@ void bfin_internal_unmask_irq(unsigned int irq)
 #ifdef CONFIG_SMP
 static void bfin_internal_unmask_irq_chip(struct irq_data *d)
 {
-   bfin_internal_unmask_irq_affinity(d-irq, d-affinity);
+   bfin_internal_unmask_irq_affinity(d-irq,
+ irq_data_get_affinity_mask(d));
 }
 
 static int bfin_internal_set_affinity(struct irq_data *d,
diff --git a/arch/ia64/kernel

[RFC v1 04/25] powerpc, irq: Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc

2015-05-20 Thread Jiang Liu
Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc while we
already have a pointer to corresponding irq_desc.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/platforms/52xx/mpc52xx_gpt.c |2 +-
 arch/powerpc/platforms/cell/axon_msi.c|2 +-
 arch/powerpc/platforms/embedded6xx/hlwd-pic.c |2 +-
 arch/powerpc/sysdev/uic.c |2 +-
 arch/powerpc/sysdev/xics/xics-common.c|2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c 
b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c
index c949ca055712..63016621aff8 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c
@@ -193,7 +193,7 @@ static struct irq_chip mpc52xx_gpt_irq_chip = {
 
 void mpc52xx_gpt_irq_cascade(unsigned int virq, struct irq_desc *desc)
 {
-   struct mpc52xx_gpt_priv *gpt = irq_get_handler_data(virq);
+   struct mpc52xx_gpt_priv *gpt = irq_desc_get_handler_data(desc);
int sub_virq;
u32 status;
 
diff --git a/arch/powerpc/platforms/cell/axon_msi.c 
b/arch/powerpc/platforms/cell/axon_msi.c
index 623bd961465a..817d0e6747ea 100644
--- a/arch/powerpc/platforms/cell/axon_msi.c
+++ b/arch/powerpc/platforms/cell/axon_msi.c
@@ -95,7 +95,7 @@ static void msic_dcr_write(struct axon_msic *msic, unsigned 
int dcr_n, u32 val)
 static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc)
 {
struct irq_chip *chip = irq_desc_get_chip(desc);
-   struct axon_msic *msic = irq_get_handler_data(irq);
+   struct axon_msic *msic = irq_desc_get_handler_data(desc);
u32 write_offset, msi;
int idx;
int retry = 0;
diff --git a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c 
b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c
index c269caee58f9..9dd154d6f89a 100644
--- a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c
+++ b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c
@@ -124,7 +124,7 @@ static void hlwd_pic_irq_cascade(unsigned int cascade_virq,
  struct irq_desc *desc)
 {
struct irq_chip *chip = irq_desc_get_chip(desc);
-   struct irq_domain *irq_domain = irq_get_handler_data(cascade_virq);
+   struct irq_domain *irq_domain = irq_desc_get_handler_data(desc);
unsigned int virq;
 
raw_spin_lock(desc-lock);
diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c
index 7c37157d4c24..e763fe215cf5 100644
--- a/arch/powerpc/sysdev/uic.c
+++ b/arch/powerpc/sysdev/uic.c
@@ -198,7 +198,7 @@ void uic_irq_cascade(unsigned int virq, struct irq_desc 
*desc)
 {
struct irq_chip *chip = irq_desc_get_chip(desc);
struct irq_data *idata = irq_desc_get_irq_data(desc);
-   struct uic *uic = irq_get_handler_data(virq);
+   struct uic *uic = irq_desc_get_handler_data(desc);
u32 msr;
int src;
int subvirq;
diff --git a/arch/powerpc/sysdev/xics/xics-common.c 
b/arch/powerpc/sysdev/xics/xics-common.c
index 878a54036a25..76be7b00dd80 100644
--- a/arch/powerpc/sysdev/xics/xics-common.c
+++ b/arch/powerpc/sysdev/xics/xics-common.c
@@ -227,7 +227,7 @@ void xics_migrate_irqs_away(void)
 
/* Locate interrupt server */
server = -1;
-   ics = irq_get_chip_data(virq);
+   ics = irq_desc_get_chip_data(desc);
if (ics)
server = ics-get_server(ics, irq);
if (server  0) {
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[Patch v2 12/14] genirq: Use helper function to access irq_data-msi_desc

2015-05-20 Thread Jiang Liu
Use irq_data access helper to access irq_data-msi_desc, so we could
move msi_desc from struct irq_data into struct irq_common_data later.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/ia64/kernel/msi_ia64.c |2 +-
 arch/ia64/sn/kernel/msi_sn.c|2 +-
 arch/powerpc/sysdev/xics/ics-opal.c |2 +-
 arch/powerpc/sysdev/xics/ics-rtas.c |2 +-
 arch/tile/kernel/pci_gx.c   |2 +-
 drivers/pci/msi.c   |2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c
index 6c50d332b7d7..af4eaec0f7c3 100644
--- a/arch/ia64/kernel/msi_ia64.c
+++ b/arch/ia64/kernel/msi_ia64.c
@@ -23,7 +23,7 @@ static int ia64_set_msi_irq_affinity(struct irq_data *idata,
if (irq_prepare_move(irq, cpu))
return -1;
 
-   __get_cached_msi_msg(idata-msi_desc, msg);
+   __get_cached_msi_msg(irq_data_get_msi_desc(idata), msg);
 
addr = msg.address_lo;
addr = MSI_ADDR_DEST_ID_MASK;
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c
index 42b5a13af142..fb25065b22c6 100644
--- a/arch/ia64/sn/kernel/msi_sn.c
+++ b/arch/ia64/sn/kernel/msi_sn.c
@@ -175,7 +175,7 @@ static int sn_set_msi_irq_affinity(struct irq_data *data,
 * Release XIO resources for the old MSI PCI address
 */
 
-   __get_cached_msi_msg(data-msi_desc, msg);
+   __get_cached_msi_msg(irq_data_get_msi_desc(data), msg);
sn_pdev = (struct pcidev_info *)sn_irq_info-irq_pciioinfo;
pdev = sn_pdev-pdi_linux_pcidev;
provider = SN_PCIDEV_BUSPROVIDER(pdev);
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c 
b/arch/powerpc/sysdev/xics/ics-opal.c
index 3996393c254d..27c936c080a6 100644
--- a/arch/powerpc/sysdev/xics/ics-opal.c
+++ b/arch/powerpc/sysdev/xics/ics-opal.c
@@ -72,7 +72,7 @@ static unsigned int ics_opal_startup(struct irq_data *d)
 * card, using the MSI mask bits. Firmware doesn't appear to unmask
 * at that level, so we do it here by hand.
 */
-   if (d-msi_desc)
+   if (irq_data_get_msi_desc(d))
pci_msi_unmask_irq(d);
 #endif
 
diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c 
b/arch/powerpc/sysdev/xics/ics-rtas.c
index e2665a9dfc0f..3854dd41558d 100644
--- a/arch/powerpc/sysdev/xics/ics-rtas.c
+++ b/arch/powerpc/sysdev/xics/ics-rtas.c
@@ -75,7 +75,7 @@ static unsigned int ics_rtas_startup(struct irq_data *d)
 * card, using the MSI mask bits. Firmware doesn't appear to unmask
 * at that level, so we do it here by hand.
 */
-   if (d-msi_desc)
+   if (irq_data_get_msi_desc(d))
pci_msi_unmask_irq(d);
 #endif
/* unmask it */
diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index b1df847d0686..65b701b3b5ed 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -1442,7 +1442,7 @@ static struct pci_ops tile_cfg_ops = {
 /* MSI support starts here. */
 static unsigned int tilegx_msi_startup(struct irq_data *d)
 {
-   if (d-msi_desc)
+   if (irq_data_get_msi_desc(d))
pci_msi_unmask_irq(d);
 
return 0;
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index be6034cf5c21..c2f0da733d3a 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -1178,7 +1178,7 @@ EXPORT_SYMBOL(pci_enable_msix_range);
  */
 void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg)
 {
-   struct msi_desc *desc = irq_data-msi_desc;
+   struct msi_desc *desc = irq_data_get_msi_desc(irq_data);
 
/*
 * For MSI-X desc-irq is always equal to irq_data-irq. For
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[RFC v1 16/25] genirq: Kill the first parameter 'irq' of irq_flow_handler_t

2015-05-20 Thread Jiang Liu
Now most IRQ flow handlers make no use of the first parameter 'irq'.
And for those who do make use of 'irq', we could easily get the irq
number through irq_desc-irq_data-irq. So kill the first parameter
'irq' of irq_flow_handler_t.

To ease review, I have split the changes into several parts, though
they should be merge as one to support bisecting.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/include/asm/qe_ic.h|   23 +--
 arch/powerpc/include/asm/tsi108_pci.h   |2 +-
 arch/powerpc/platforms/512x/mpc5121_ads_cpld.c  |4 +++-
 arch/powerpc/platforms/52xx/media5200.c |2 +-
 arch/powerpc/platforms/52xx/mpc52xx_gpt.c   |2 +-
 arch/powerpc/platforms/82xx/pq2ads-pci-pic.c|2 +-
 arch/powerpc/platforms/85xx/common.c|2 +-
 arch/powerpc/platforms/85xx/mpc85xx_ds.c|2 +-
 arch/powerpc/platforms/85xx/socrates_fpga_pic.c |3 ++-
 arch/powerpc/platforms/86xx/pic.c   |2 +-
 arch/powerpc/platforms/8xx/m8xx_setup.c |2 +-
 arch/powerpc/platforms/cell/axon_msi.c  |2 +-
 arch/powerpc/platforms/cell/interrupt.c |3 ++-
 arch/powerpc/platforms/cell/spider-pic.c|2 +-
 arch/powerpc/platforms/chrp/setup.c |2 +-
 arch/powerpc/platforms/embedded6xx/mvme5100.c   |2 +-
 arch/powerpc/platforms/pseries/setup.c  |2 +-
 arch/powerpc/sysdev/ge/ge_pic.c |2 +-
 arch/powerpc/sysdev/mpic.c  |2 +-
 arch/powerpc/sysdev/qe_lib/qe_ic.c  |4 ++--
 arch/powerpc/sysdev/tsi108_pci.c|2 +-
 arch/powerpc/sysdev/uic.c   |2 +-
 arch/powerpc/sysdev/xilinx_intc.c   |2 +-
 23 files changed, 36 insertions(+), 37 deletions(-)

diff --git a/arch/powerpc/include/asm/qe_ic.h b/arch/powerpc/include/asm/qe_ic.h
index 25784cc959a0..1e155ca6d33c 100644
--- a/arch/powerpc/include/asm/qe_ic.h
+++ b/arch/powerpc/include/asm/qe_ic.h
@@ -59,14 +59,14 @@ enum qe_ic_grp_id {
 
 #ifdef CONFIG_QUICC_ENGINE
 void qe_ic_init(struct device_node *node, unsigned int flags,
-   void (*low_handler)(unsigned int irq, struct irq_desc *desc),
-   void (*high_handler)(unsigned int irq, struct irq_desc *desc));
+   void (*low_handler)(struct irq_desc *desc),
+   void (*high_handler)(struct irq_desc *desc));
 unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic);
 unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic);
 #else
 static inline void qe_ic_init(struct device_node *node, unsigned int flags,
-   void (*low_handler)(unsigned int irq, struct irq_desc *desc),
-   void (*high_handler)(unsigned int irq, struct irq_desc *desc))
+   void (*low_handler)(struct irq_desc *desc),
+   void (*high_handler)(struct irq_desc *desc))
 {}
 static inline unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
 { return 0; }
@@ -78,8 +78,7 @@ void qe_ic_set_highest_priority(unsigned int virq, int high);
 int qe_ic_set_priority(unsigned int virq, unsigned int priority);
 int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int 
high);
 
-static inline void qe_ic_cascade_low_ipic(unsigned int irq,
- struct irq_desc *desc)
+static inline void qe_ic_cascade_low_ipic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
@@ -88,8 +87,7 @@ static inline void qe_ic_cascade_low_ipic(unsigned int irq,
generic_handle_irq(cascade_irq);
 }
 
-static inline void qe_ic_cascade_high_ipic(unsigned int irq,
-  struct irq_desc *desc)
+static inline void qe_ic_cascade_high_ipic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
@@ -98,8 +96,7 @@ static inline void qe_ic_cascade_high_ipic(unsigned int irq,
generic_handle_irq(cascade_irq);
 }
 
-static inline void qe_ic_cascade_low_mpic(unsigned int irq,
- struct irq_desc *desc)
+static inline void qe_ic_cascade_low_mpic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
@@ -111,8 +108,7 @@ static inline void qe_ic_cascade_low_mpic(unsigned int irq,
chip-irq_eoi(desc-irq_data);
 }
 
-static inline void qe_ic_cascade_high_mpic(unsigned int irq,
-  struct irq_desc *desc)
+static inline void qe_ic_cascade_high_mpic(struct irq_desc *desc)
 {
struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
@@ -124,8 +120,7 @@ static inline void qe_ic_cascade_high_mpic(unsigned int irq

[RFC v1 09/11] genirq: Use helper function to access irq_data-msi_desc

2015-05-03 Thread Jiang Liu
Use helper function to access irq_data-msi_desc, so we could move
msi_desc from struct irq_data into struct irq_common_data later.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/ia64/kernel/msi_ia64.c |2 +-
 arch/ia64/sn/kernel/msi_sn.c|2 +-
 arch/powerpc/sysdev/xics/ics-opal.c |2 +-
 arch/powerpc/sysdev/xics/ics-rtas.c |2 +-
 arch/tile/kernel/pci_gx.c   |2 +-
 drivers/pci/msi.c   |2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c
index 6c50d332b7d7..591b66d21bd1 100644
--- a/arch/ia64/kernel/msi_ia64.c
+++ b/arch/ia64/kernel/msi_ia64.c
@@ -23,7 +23,7 @@ static int ia64_set_msi_irq_affinity(struct irq_data *idata,
if (irq_prepare_move(irq, cpu))
return -1;
 
-   __get_cached_msi_msg(idata-msi_desc, msg);
+   __get_cached_msi_msg(irq_data_get_msi(idata), msg);
 
addr = msg.address_lo;
addr = MSI_ADDR_DEST_ID_MASK;
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c
index 42b5a13af142..6ccc39b36947 100644
--- a/arch/ia64/sn/kernel/msi_sn.c
+++ b/arch/ia64/sn/kernel/msi_sn.c
@@ -175,7 +175,7 @@ static int sn_set_msi_irq_affinity(struct irq_data *data,
 * Release XIO resources for the old MSI PCI address
 */
 
-   __get_cached_msi_msg(data-msi_desc, msg);
+   __get_cached_msi_msg(irq_data_get_msi(data), msg);
sn_pdev = (struct pcidev_info *)sn_irq_info-irq_pciioinfo;
pdev = sn_pdev-pdi_linux_pcidev;
provider = SN_PCIDEV_BUSPROVIDER(pdev);
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c 
b/arch/powerpc/sysdev/xics/ics-opal.c
index 3996393c254d..a709d81f885a 100644
--- a/arch/powerpc/sysdev/xics/ics-opal.c
+++ b/arch/powerpc/sysdev/xics/ics-opal.c
@@ -72,7 +72,7 @@ static unsigned int ics_opal_startup(struct irq_data *d)
 * card, using the MSI mask bits. Firmware doesn't appear to unmask
 * at that level, so we do it here by hand.
 */
-   if (d-msi_desc)
+   if (irq_data_get_msi(d))
pci_msi_unmask_irq(d);
 #endif
 
diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c 
b/arch/powerpc/sysdev/xics/ics-rtas.c
index e2665a9dfc0f..f09a7b3136b2 100644
--- a/arch/powerpc/sysdev/xics/ics-rtas.c
+++ b/arch/powerpc/sysdev/xics/ics-rtas.c
@@ -75,7 +75,7 @@ static unsigned int ics_rtas_startup(struct irq_data *d)
 * card, using the MSI mask bits. Firmware doesn't appear to unmask
 * at that level, so we do it here by hand.
 */
-   if (d-msi_desc)
+   if (irq_data_get_msi(d))
pci_msi_unmask_irq(d);
 #endif
/* unmask it */
diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index b1df847d0686..1438c60e263d 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -1442,7 +1442,7 @@ static struct pci_ops tile_cfg_ops = {
 /* MSI support starts here. */
 static unsigned int tilegx_msi_startup(struct irq_data *d)
 {
-   if (d-msi_desc)
+   if (irq_data_get_msi(d))
pci_msi_unmask_irq(d);
 
return 0;
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index c3e7dfcf9ff5..74b48ea0cf26 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -1178,7 +1178,7 @@ EXPORT_SYMBOL(pci_enable_msix_range);
  */
 void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg)
 {
-   struct msi_desc *desc = irq_data-msi_desc;
+   struct msi_desc *desc = irq_data_get_msi(irq_data);
 
/*
 * For MSI-X desc-irq is always equal to irq_data-irq. For
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[RFC v1 06/11] genirq: Introduce helper function irq_data_get_affinity_mask()

2015-05-03 Thread Jiang Liu
Introduce helper function irq_data_get_affinity_mask() and
irq_get_affinity_mask() to hide implementation details,
so we could move field 'affinity' from struct irq_data into
struct irq_common_data later.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/alpha/kernel/irq.c   |2 +-
 arch/arm/kernel/irq.c |4 ++--
 arch/arm64/kernel/irq.c   |4 ++--
 arch/blackfin/mach-common/ints-priority.c |3 ++-
 arch/ia64/kernel/iosapic.c|2 +-
 arch/ia64/kernel/irq.c|6 +++---
 arch/ia64/kernel/msi_ia64.c   |4 ++--
 arch/ia64/sn/kernel/msi_sn.c  |2 +-
 arch/metag/kernel/irq.c   |   10 ++
 arch/mips/bcm63xx/irq.c   |2 +-
 arch/mips/cavium-octeon/octeon-irq.c  |   14 --
 arch/mips/pmcs-msp71xx/msp_irq_cic.c  |3 ++-
 arch/mn10300/kernel/cevt-mn10300.c|2 +-
 arch/mn10300/kernel/irq.c |   13 +++--
 arch/parisc/kernel/irq.c  |   12 ++--
 arch/powerpc/kernel/irq.c |2 +-
 arch/powerpc/sysdev/xics/ics-opal.c   |2 +-
 arch/powerpc/sysdev/xics/ics-rtas.c   |2 +-
 arch/sh/kernel/irq.c  |7 ---
 arch/sparc/kernel/irq_64.c|   12 +++-
 arch/sparc/kernel/leon_kernel.c   |6 +++---
 arch/x86/kernel/apic/io_apic.c|2 +-
 arch/x86/kernel/apic/vector.c |5 ++---
 arch/x86/kernel/irq.c |5 +++--
 arch/xtensa/kernel/irq.c  |   10 ++
 drivers/irqchip/irq-mips-gic.c|2 +-
 drivers/parisc/iosapic.c  |2 +-
 drivers/sh/intc/chip.c|6 +++---
 drivers/xen/events/events_base.c  |4 ++--
 include/linux/irq.h   |   11 +++
 30 files changed, 92 insertions(+), 69 deletions(-)

diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
index 7b2be251c30f..bd8e47699cad 100644
--- a/arch/alpha/kernel/irq.c
+++ b/arch/alpha/kernel/irq.c
@@ -60,7 +60,7 @@ int irq_select_affinity(unsigned int irq)
cpu = (cpu  (NR_CPUS-1) ? cpu + 1 : 0);
last_cpu = cpu;
 
-   cpumask_copy(data-affinity, cpumask_of(cpu));
+   cpumask_copy(irq_data_get_affinity_mask(data), cpumask_of(cpu));
chip-irq_set_affinity(data, cpumask_of(cpu), false);
return 0;
 }
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
index 350f188c92d2..baf8edebe26f 100644
--- a/arch/arm/kernel/irq.c
+++ b/arch/arm/kernel/irq.c
@@ -140,7 +140,7 @@ int __init arch_probe_nr_irqs(void)
 static bool migrate_one_irq(struct irq_desc *desc)
 {
struct irq_data *d = irq_desc_get_irq_data(desc);
-   const struct cpumask *affinity = d-affinity;
+   const struct cpumask *affinity = irq_data_get_affinity_mask(d);
struct irq_chip *c;
bool ret = false;
 
@@ -160,7 +160,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
if (!c-irq_set_affinity)
pr_debug(IRQ%u: unable to set affinity\n, d-irq);
else if (c-irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK  
ret)
-   cpumask_copy(d-affinity, affinity);
+   cpumask_copy(irq_data_get_affinity_mask(d), affinity);
 
return ret;
 }
diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c
index 240b75c0e94f..463fa2e7e34c 100644
--- a/arch/arm64/kernel/irq.c
+++ b/arch/arm64/kernel/irq.c
@@ -61,7 +61,7 @@ void __init init_IRQ(void)
 static bool migrate_one_irq(struct irq_desc *desc)
 {
struct irq_data *d = irq_desc_get_irq_data(desc);
-   const struct cpumask *affinity = d-affinity;
+   const struct cpumask *affinity = irq_data_get_affinity_mask(d);
struct irq_chip *c;
bool ret = false;
 
@@ -81,7 +81,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
if (!c-irq_set_affinity)
pr_debug(IRQ%u: unable to set affinity\n, d-irq);
else if (c-irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK  
ret)
-   cpumask_copy(d-affinity, affinity);
+   cpumask_copy(irq_data_get_affinity_mask(d), affinity);
 
return ret;
 }
diff --git a/arch/blackfin/mach-common/ints-priority.c 
b/arch/blackfin/mach-common/ints-priority.c
index 7236bdfc71e6..332a434b4669 100644
--- a/arch/blackfin/mach-common/ints-priority.c
+++ b/arch/blackfin/mach-common/ints-priority.c
@@ -194,7 +194,8 @@ void bfin_internal_unmask_irq(unsigned int irq)
 #ifdef CONFIG_SMP
 static void bfin_internal_unmask_irq_chip(struct irq_data *d)
 {
-   bfin_internal_unmask_irq_affinity(d-irq, d-affinity);
+   bfin_internal_unmask_irq_affinity(d-irq,
+ irq_data_get_affinity_mask(d));
 }
 
 static int bfin_internal_set_affinity(struct irq_data *d,
diff --git a/arch/ia64/kernel

Ask help about killing irqchip.irq_print_chip on PPC platforms

2014-12-22 Thread Jiang Liu
Hi Scott and Tudor,
Sorry, resend and Ccing the list.
We are trying to clean up some irqchip interfaces, and
irqchip.irq_print_chip is a candidate for removal. After some
changes on x86 side, arch/powerpc/sysdev/fsl_msi.c may be the
last user of irqchip.irq_print_chip. So could you please help
to advice on whether we could kill irqchip.irq_print_chip
by using fsl-msi instead of fsl-msi-%d for irqchip name?
Will it break any userspace interfaces?
Thanks!
Gerry
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[RFC Part4 v1 11/17] PCI, MSI: Rename __read_msi_msg() as __pci_read_msi_msg()

2014-11-09 Thread Jiang Liu
Rename __read_msi_msg() as __pci_read_msi_msg() and kill unused
read_msi_msg(). It's a preparation to separate generic MSI code
from PCI core.

Signed-off-by: Jiang Liu jiang@linux.intel.com
---
 arch/powerpc/platforms/pseries/msi.c |2 +-
 arch/x86/pci/xen.c   |2 +-
 drivers/pci/msi.c|9 +
 include/linux/msi.h  |3 +--
 4 files changed, 4 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/msi.c 
b/arch/powerpc/platforms/pseries/msi.c
index 8ab5add4ac82..90f756d0f58f 100644
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -476,7 +476,7 @@ again:
irq_set_msi_desc(virq, entry);
 
/* Read config space back so we can restore after reset */
-   __read_msi_msg(entry, msg);
+   __pci_read_msi_msg(entry, msg);
entry-msg = msg;
}
 
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index 093f5f4272d3..a48ca2f8b93e 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -229,7 +229,7 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int 
nvec, int type)
return 1;
 
list_for_each_entry(msidesc, dev-msi_list, list) {
-   __read_msi_msg(msidesc, msg);
+   __pci_read_msi_msg(msidesc, msg);
pirq = MSI_ADDR_EXT_DEST_ID(msg.address_hi) |
((msg.address_lo  MSI_ADDR_DEST_ID_SHIFT)  0xff);
if (msg.data != XEN_PIRQ_MSI_DATA ||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index e1814f4be4b9..6011dfb475a1 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -243,7 +243,7 @@ void default_restore_msi_irqs(struct pci_dev *dev)
default_restore_msi_irq(dev, entry-irq);
 }
 
-void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
+void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 {
BUG_ON(entry-dev-current_state != PCI_D0);
 
@@ -273,13 +273,6 @@ void __read_msi_msg(struct msi_desc *entry, struct msi_msg 
*msg)
}
 }
 
-void read_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-   struct msi_desc *entry = irq_get_msi_desc(irq);
-
-   __read_msi_msg(entry, msg);
-}
-
 void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 {
if (entry-dev-current_state != PCI_D0) {
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 19502186a64d..4b0d070ff481 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -61,9 +61,8 @@ void msi_domain_deactivate(struct irq_domain *domain,
 
 #ifdef CONFIG_PCI_MSI
 /* Helper functions */
-void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-void read_msi_msg(unsigned int irq, struct msi_msg *msg);
 void write_msi_msg(unsigned int irq, struct msi_msg *msg);
 
 /*
-- 
1.7.10.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] pci: Fix root port bus-self is NULL

2014-01-07 Thread Jiang Liu


On 2014/1/7 16:27, Yijing Wang wrote:
 On 2014/1/7 16:04, Dongsheng Wang wrote:
 From: Wang Dongsheng dongsheng.w...@freescale.com

 the root port bus-self always NULL, so put root port pci device
 into root port bus-self.

 Signed-off-by: Wang Dongsheng dongsheng.w...@freescale.com

 diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
 index 38e403d..7f2d1ab 100644
 --- a/drivers/pci/probe.c
 +++ b/drivers/pci/probe.c
 @@ -1472,6 +1472,9 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
  if (!dev-is_added)
  nr++;
  
 +if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
 +bus-self = dev;
 
 In this case, bus is the pci root bus I think, so why set bus-self = root 
 port ?
 bus-self should pointer to the pci device that bridge out this bus.
Yes, this patch seems wrong. If dev is root port, bus should be root
bus, so we shouldn't set root_bus-self = pci_dev_of_root_port.

Actually PCI core has correctly setup pci_bus-self for secondary bus
of PCIe root port.

Thanks!
Gerry

 
 +
  for (fn = next_fn(bus, dev, 0); fn  0; fn = next_fn(bus, dev, fn)) {
  dev = pci_scan_single_device(bus, devfn + fn);
  if (dev) {

 
 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 1/2] pci: Fix root port bus-self is NULL

2014-01-07 Thread Jiang Liu


On 2014/1/7 17:51, dongsheng.w...@freescale.com wrote:
 diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index
 38e403d..7f2d1ab 100644
 --- a/drivers/pci/probe.c
 +++ b/drivers/pci/probe.c
 @@ -1472,6 +1472,9 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
if (!dev-is_added)
nr++;

 +  if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
 +  bus-self = dev;

 In this case, bus is the pci root bus I think, so why set bus-self = root
 port ?
 bus-self should pointer to the pci device that bridge out this bus.
 Yes, this patch seems wrong. If dev is root port, bus should be root bus, so 
 we
 shouldn't set root_bus-self = pci_dev_of_root_port.

 Why the root bus-self pointer to the bridge?
 If child bus create from root bus, the child-self will get the bridge(root 
 port) pci device.
 
 Actually PCI core has correctly setup pci_bus-self for secondary bus of PCIe
 root port.
 Yes, right. But the root-bus-self is NULL. I think the root bus should get 
 root port
 pci device for itself. If there is no bridge at board how to get the root 
 port device?
Hi Dongsheng,
PCI root bus represents PCI host bridge, which has no
corresponding PCI device.

 
 -Dongsheng
 

 Thanks!
 Gerry

 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH v2 15/25] smp, ppc: kill SMP single function call interrupt

2013-09-12 Thread Jiang Liu
On 09/12/2013 04:03 AM, Srivatsa S. Bhat wrote:
 On 09/11/2013 09:37 PM, Jiang Liu wrote:
 From: Jiang Liu jiang@huawei.com

 Commit 9a46ad6d6df3b54 smp: make smp_call_function_many() use logic
 similar to smp_call_function_single() has unified the way to handle
 single and multiple cross-CPU function calls. Now only one interrupt
 is needed for architecture specific code to support generic SMP function
 call interfaces, so kill the redundant single function call interrupt.

 Signed-off-by: Jiang Liu jiang@huawei.com
 Cc: Jiang Liu liu...@gmail.com
 ---
 
 It turns out that freeing up the IPI slot in powerpc is very useful, since
 we actually wanted a slot for some other use-case (and there are only 4 slots
 available on powerpc).
 
 Here are the patches which achieve that:
 http://marc.info/?l=linuxppc-embeddedm=137886807502898w=2
 http://marc.info/?l=linuxppc-embeddedm=137886811502909w=2
Hi Srivatsa,
That's great and I will drop this patch from my series.
Could you please to kill call_function_single_action() instead of
call_function_action()? Please refer to
http://lkml.org/lkml/2013/9/11/579
Regards!
Gerry

 
 So, can you kindly consider dropping the powerpc patch from your series,
 if that is OK with you? Thanks!
 
 BTW, after doing the powerpc cleanup, even I had thought about killing one
 of the smp-function variants in various architectures, but never got around
 to do it. But now that you have posted the series which does that, I'll try
 to review them.
 
 Thank you!
 
 Regards,
 Srivatsa S. Bhat
 
  arch/powerpc/include/asm/smp.h |  3 +--
  arch/powerpc/kernel/smp.c  | 12 +---
  2 files changed, 2 insertions(+), 13 deletions(-)

 diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
 index 48cfc85..53faa03 100644
 --- a/arch/powerpc/include/asm/smp.h
 +++ b/arch/powerpc/include/asm/smp.h
 @@ -119,8 +119,7 @@ extern int cpu_to_core_id(int cpu);
   * in /proc/interrupts will be wrong!!! --Troy */
  #define PPC_MSG_CALL_FUNCTION   0
  #define PPC_MSG_RESCHEDULE  1
 -#define PPC_MSG_CALL_FUNC_SINGLE2
 -#define PPC_MSG_DEBUGGER_BREAK  3
 +#define PPC_MSG_DEBUGGER_BREAK  2

  /* for irq controllers that have dedicated ipis per message (4) */
  extern int smp_request_message_ipi(int virq, int message);
 diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
 index 38b0ba6..0c53b10 100644
 --- a/arch/powerpc/kernel/smp.c
 +++ b/arch/powerpc/kernel/smp.c
 @@ -123,12 +123,6 @@ static irqreturn_t reschedule_action(int irq, void 
 *data)
  return IRQ_HANDLED;
  }

 -static irqreturn_t call_function_single_action(int irq, void *data)
 -{
 -generic_smp_call_function_single_interrupt();
 -return IRQ_HANDLED;
 -}
 -
  static irqreturn_t debug_ipi_action(int irq, void *data)
  {
  if (crash_ipi_function_ptr) {
 @@ -146,14 +140,12 @@ static irqreturn_t debug_ipi_action(int irq, void 
 *data)
  static irq_handler_t smp_ipi_action[] = {
  [PPC_MSG_CALL_FUNCTION] =  call_function_action,
  [PPC_MSG_RESCHEDULE] = reschedule_action,
 -[PPC_MSG_CALL_FUNC_SINGLE] = call_function_single_action,
  [PPC_MSG_DEBUGGER_BREAK] = debug_ipi_action,
  };

  const char *smp_ipi_name[] = {
  [PPC_MSG_CALL_FUNCTION] =  ipi call function,
  [PPC_MSG_RESCHEDULE] = ipi reschedule,
 -[PPC_MSG_CALL_FUNC_SINGLE] = ipi call function single,
  [PPC_MSG_DEBUGGER_BREAK] = ipi debugger,
  };

 @@ -225,8 +217,6 @@ irqreturn_t smp_ipi_demux(void)
  generic_smp_call_function_interrupt();
  if (all  (1  (24 - 8 * PPC_MSG_RESCHEDULE)))
  scheduler_ipi();
 -if (all  (1  (24 - 8 * PPC_MSG_CALL_FUNC_SINGLE)))
 -generic_smp_call_function_single_interrupt();
  if (all  (1  (24 - 8 * PPC_MSG_DEBUGGER_BREAK)))
  debug_ipi_action(0, NULL);
  #else
 @@ -257,7 +247,7 @@ EXPORT_SYMBOL_GPL(smp_send_reschedule);

  void arch_send_call_function_single_ipi(int cpu)
  {
 -do_message_pass(cpu, PPC_MSG_CALL_FUNC_SINGLE);
 +do_message_pass(cpu, PPC_MSG_CALL_FUNCTION);
  }

  void arch_send_call_function_ipi_mask(const struct cpumask *mask)

 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC PATCH v2 15/25] smp, ppc: kill SMP single function call interrupt

2013-09-11 Thread Jiang Liu
From: Jiang Liu jiang@huawei.com

Commit 9a46ad6d6df3b54 smp: make smp_call_function_many() use logic
similar to smp_call_function_single() has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Jiang Liu liu...@gmail.com
---
 arch/powerpc/include/asm/smp.h |  3 +--
 arch/powerpc/kernel/smp.c  | 12 +---
 2 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
index 48cfc85..53faa03 100644
--- a/arch/powerpc/include/asm/smp.h
+++ b/arch/powerpc/include/asm/smp.h
@@ -119,8 +119,7 @@ extern int cpu_to_core_id(int cpu);
  * in /proc/interrupts will be wrong!!! --Troy */
 #define PPC_MSG_CALL_FUNCTION   0
 #define PPC_MSG_RESCHEDULE  1
-#define PPC_MSG_CALL_FUNC_SINGLE   2
-#define PPC_MSG_DEBUGGER_BREAK  3
+#define PPC_MSG_DEBUGGER_BREAK  2
 
 /* for irq controllers that have dedicated ipis per message (4) */
 extern int smp_request_message_ipi(int virq, int message);
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 38b0ba6..0c53b10 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -123,12 +123,6 @@ static irqreturn_t reschedule_action(int irq, void *data)
return IRQ_HANDLED;
 }
 
-static irqreturn_t call_function_single_action(int irq, void *data)
-{
-   generic_smp_call_function_single_interrupt();
-   return IRQ_HANDLED;
-}
-
 static irqreturn_t debug_ipi_action(int irq, void *data)
 {
if (crash_ipi_function_ptr) {
@@ -146,14 +140,12 @@ static irqreturn_t debug_ipi_action(int irq, void *data)
 static irq_handler_t smp_ipi_action[] = {
[PPC_MSG_CALL_FUNCTION] =  call_function_action,
[PPC_MSG_RESCHEDULE] = reschedule_action,
-   [PPC_MSG_CALL_FUNC_SINGLE] = call_function_single_action,
[PPC_MSG_DEBUGGER_BREAK] = debug_ipi_action,
 };
 
 const char *smp_ipi_name[] = {
[PPC_MSG_CALL_FUNCTION] =  ipi call function,
[PPC_MSG_RESCHEDULE] = ipi reschedule,
-   [PPC_MSG_CALL_FUNC_SINGLE] = ipi call function single,
[PPC_MSG_DEBUGGER_BREAK] = ipi debugger,
 };
 
@@ -225,8 +217,6 @@ irqreturn_t smp_ipi_demux(void)
generic_smp_call_function_interrupt();
if (all  (1  (24 - 8 * PPC_MSG_RESCHEDULE)))
scheduler_ipi();
-   if (all  (1  (24 - 8 * PPC_MSG_CALL_FUNC_SINGLE)))
-   generic_smp_call_function_single_interrupt();
if (all  (1  (24 - 8 * PPC_MSG_DEBUGGER_BREAK)))
debug_ipi_action(0, NULL);
 #else
@@ -257,7 +247,7 @@ EXPORT_SYMBOL_GPL(smp_send_reschedule);
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-   do_message_pass(cpu, PPC_MSG_CALL_FUNC_SINGLE);
+   do_message_pass(cpu, PPC_MSG_CALL_FUNCTION);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
-- 
1.8.1.2

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH v3, part1 03/10] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

2013-06-06 Thread Jiang Liu
On Thu 06 Jun 2013 04:07:18 AM CST, Bjorn Helgaas wrote:
 On Sat, May 25, 2013 at 7:48 AM, Jiang Liu liu...@gmail.com wrote:
 From: Gu Zheng guz.f...@cn.fujitsu.com

 Use the new pci_alloc_dev(bus) to replace the existing using of
 alloc_pci_dev(void).
 ...

 diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
 index 26df9c8..d5d18a0 100644
 --- a/drivers/pci/probe.c
 +++ b/drivers/pci/probe.c
 @@ -1130,6 +1130,7 @@ static void pci_release_dev(struct device *dev)
 struct pci_dev *pci_dev;

 pci_dev = to_pci_dev(dev);
 +   pci_bus_put(pci_dev-bus);
 pci_release_capabilities(pci_dev);
 pci_release_of_node(pci_dev);
 kfree(pci_dev);

 I think we should drop the pci_bus reference *last* (before the
 kfree).  Otherwise, we have to audit pci_release_capabilities() and
 pci_release_of_node() to make sure they don't use pci_dev-bus.

 I made this change on my branch already; just let me know if you object.
Hi Bjorn,
   You are right, thanks for fixing it.


 Bjorn


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v6, part4 31/41] mm/ppc: prepare for removing num_physpages and simplify mem_init()

2013-05-29 Thread Jiang Liu
Prepare for removing num_physpages and simplify mem_init().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c | 56 +++
 1 file changed, 12 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 3bcfc0d..49c18b6 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -299,46 +299,27 @@ void __init paging_init(void)
 
 void __init mem_init(void)
 {
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   int nid;
-#endif
-   pg_data_t *pgdat;
-   unsigned long i;
-   struct page *page;
-   unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
-
 #ifdef CONFIG_SWIOTLB
swiotlb_init(0);
 #endif
 
-   num_physpages = memblock_phys_mem_size()  PAGE_SHIFT;
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
-for_each_online_node(nid) {
-   if (NODE_DATA(nid)-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n, nid);
-   free_all_bootmem_node(NODE_DATA(nid));
-   }
+   {
+   pg_data_t *pgdat;
+
+   for_each_online_pgdat(pgdat)
+   if (pgdat-node_spanned_pages != 0) {
+   printk(freeing bootmem node %d\n,
+   pgdat-node_id);
+   free_all_bootmem_node(pgdat);
+   }
}
 #else
max_mapnr = max_pfn;
free_all_bootmem();
 #endif
-   for_each_online_pgdat(pgdat) {
-   for (i = 0; i  pgdat-node_spanned_pages; i++) {
-   if (!pfn_valid(pgdat-node_start_pfn + i))
-   continue;
-   page = pgdat_page_nr(pgdat, i);
-   if (PageReserved(page))
-   reservedpages++;
-   }
-   }
-
-   codesize = (unsigned long)_sdata - (unsigned long)_stext;
-   datasize = (unsigned long)_edata - (unsigned long)_sdata;
-   initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
-   bsssize = (unsigned long)__bss_stop - (unsigned long)__bss_start;
 
 #ifdef CONFIG_HIGHMEM
{
@@ -348,13 +329,9 @@ void __init mem_init(void)
for (pfn = highmem_mapnr; pfn  max_mapnr; ++pfn) {
phys_addr_t paddr = (phys_addr_t)pfn  PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
-   if (memblock_is_reserved(paddr))
-   continue;
-   free_highmem_page(page);
-   reservedpages--;
+   if (!memblock_is_reserved(paddr))
+   free_highmem_page(page);
}
-   printk(KERN_DEBUG High memory: %luk\n,
-  totalhigh_pages  (PAGE_SHIFT-10));
}
 #endif /* CONFIG_HIGHMEM */
 
@@ -367,16 +344,7 @@ void __init mem_init(void)
(mfspr(SPRN_TLB1CFG)  TLBnCFG_N_ENTRY) - 1;
 #endif
 
-   printk(KERN_INFO Memory: %luk/%luk available (%luk kernel code, 
-  %luk reserved, %luk data, %luk bss, %luk init)\n,
-   nr_free_pages()  (PAGE_SHIFT-10),
-   num_physpages  (PAGE_SHIFT-10),
-   codesize  10,
-   reservedpages  (PAGE_SHIFT-10),
-   datasize  10,
-   bsssize  10,
-   initsize  10);
-
+   mem_init_print_info(NULL);
 #ifdef CONFIG_PPC32
pr_info(Kernel virtual memory layout:\n);
pr_info(  * 0x%08lx..0x%08lx  : fixmap\n, FIXADDR_START, FIXADDR_TOP);
-- 
1.8.1.2

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH, v2 09/13] mm/PPC: prepare for killing free_all_bootmem_node()

2013-05-29 Thread Jiang Liu
Prepare for killing free_all_bootmem_node() by using
free_all_bootmem().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: Alexander Graf ag...@suse.de
Cc: Suzuki K. Poulose suz...@in.ibm.com
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c | 16 +---
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 49c18b6..1cb1ea1 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -304,22 +304,8 @@ void __init mem_init(void)
 #endif
 
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
-
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   {
-   pg_data_t *pgdat;
-
-   for_each_online_pgdat(pgdat)
-   if (pgdat-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n,
-   pgdat-node_id);
-   free_all_bootmem_node(pgdat);
-   }
-   }
-#else
-   max_mapnr = max_pfn;
+   set_max_mapnr(max_pfn);
free_all_bootmem();
-#endif
 
 #ifdef CONFIG_HIGHMEM
{
-- 
1.8.1.2

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v3, part2 10/20] PCI, PPC: use hotplug-safe iterators to walk PCI buses

2013-05-26 Thread Jiang Liu
Enhance PPC architecture specific code to use hotplug-safe iterators
to walk PCI buses.

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: Gavin Shan sha...@linux.vnet.ibm.com
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Grant Likely grant.lik...@secretlab.ca
Cc: Bill Pemberton wf...@virginia.edu
Cc: Yinghai Lu ying...@kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/kernel/pci-common.c |  4 ++--
 arch/powerpc/kernel/pci_64.c | 22 --
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index f5c5c90..56ad3a4 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1386,7 +1386,7 @@ void __init pcibios_resource_survey(void)
struct pci_bus *b;
 
/* Allocate and assign resources */
-   list_for_each_entry(b, pci_root_buses, node)
+   for_each_pci_root_bus(b)
pcibios_allocate_bus_resources(b);
pcibios_allocate_resources(0);
pcibios_allocate_resources(1);
@@ -1396,7 +1396,7 @@ void __init pcibios_resource_survey(void)
 * bus available resources to avoid allocating things on top of them
 */
if (!pci_has_flag(PCI_PROBE_ONLY)) {
-   list_for_each_entry(b, pci_root_buses, node)
+   for_each_pci_root_bus(b)
pcibios_reserve_legacy_regions(b);
}
 
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 873050d..d71249b 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -207,10 +207,8 @@ void pcibios_setup_phb_io_space(struct pci_controller 
*hose)
 long sys_pciconfig_iobase(long which, unsigned long in_bus,
  unsigned long in_devfn)
 {
-   struct pci_controller* hose;
-   struct list_head *ln;
-   struct pci_bus *bus = NULL;
-   struct device_node *hose_node;
+   struct pci_controller* hose = NULL;
+   struct pci_bus *bus;
 
/* Argh ! Please forgive me for that hack, but that's the
 * simplest way to get existing XFree to not lockup on some
@@ -229,19 +227,15 @@ long sys_pciconfig_iobase(long which, unsigned long 
in_bus,
/* That syscall isn't quite compatible with PCI domains, but it's
 * used on pre-domains setup. We return the first match
 */
-
-   for (ln = pci_root_buses.next; ln != pci_root_buses; ln = ln-next) {
-   bus = pci_bus_b(ln);
-   if (in_bus = bus-number  in_bus = bus-busn_res.end)
+   for_each_pci_root_bus(bus)
+   if (in_bus = bus-number  in_bus = bus-busn_res.end) {
+   hose = pci_bus_to_host(bus);
+   pci_bus_put(bus);
break;
-   bus = NULL;
-   }
-   if (bus == NULL || bus-dev.of_node == NULL)
+   }
+   if (hose == NULL)
return -ENODEV;
 
-   hose_node = bus-dev.of_node;
-   hose = PCI_DN(hose_node)-phb;
-
switch (which) {
case IOBASE_BRIDGE_NUMBER:
return (long)hose-first_busno;
-- 
1.8.1.2

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v3, part1 03/10] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

2013-05-25 Thread Jiang Liu
From: Gu Zheng guz.f...@cn.fujitsu.com

Use the new pci_alloc_dev(bus) to replace the existing using of
alloc_pci_dev(void).

v2:
  Follow Bjorn's correction to move pci_bus_put() to
  pci_release_dev() instead.

v3:
  release reference to bus on error recovery path

Signed-off-by: Gu Zheng guz.f...@cn.fujitsu.com
Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: David S. Miller da...@davemloft.net
Cc: David Airlie airl...@linux.ie
Cc: Neela Syam Kolli megaraidli...@lsi.com
Cc: James E.J. Bottomley jbottom...@parallels.com
Cc: Yinghai Lu ying...@kernel.org
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Andrew Morton a...@linux-foundation.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
Cc: sparcli...@vger.kernel.org
Cc: linux-...@vger.kernel.org
Cc: linux-s...@vger.kernel.org
---
 arch/powerpc/kernel/pci_of_scan.c | 3 +--
 arch/sparc/kernel/pci.c   | 3 +--
 drivers/char/agp/alpha-agp.c  | 2 +-
 drivers/char/agp/parisc-agp.c | 2 +-
 drivers/pci/iov.c | 8 +---
 drivers/pci/probe.c   | 5 +++--
 drivers/scsi/megaraid.c   | 2 +-
 7 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/kernel/pci_of_scan.c 
b/arch/powerpc/kernel/pci_of_scan.c
index d2d407d..6b0ba58 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -128,7 +128,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
const char *type;
struct pci_slot *slot;
 
-   dev = alloc_pci_dev();
+   dev = pci_alloc_dev(bus);
if (!dev)
return NULL;
type = of_get_property(node, device_type, NULL);
@@ -137,7 +137,6 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
 
pr_debug(create device, devfn: %x, type: %s\n, devfn, type);
 
-   dev-bus = bus;
dev-dev.of_node = of_node_get(node);
dev-dev.parent = bus-bridge;
dev-dev.bus = pci_bus_type;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index 972892a..b16f624 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -254,7 +254,7 @@ static struct pci_dev *of_create_pci_dev(struct 
pci_pbm_info *pbm,
const char *type;
u32 class;
 
-   dev = alloc_pci_dev();
+   dev = pci_alloc_dev(bus);
if (!dev)
return NULL;
 
@@ -281,7 +281,6 @@ static struct pci_dev *of_create_pci_dev(struct 
pci_pbm_info *pbm,
printk(create device, devfn: %x, type: %s\n,
   devfn, type);
 
-   dev-bus = bus;
dev-sysdata = node;
dev-dev.parent = bus-bridge;
dev-dev.bus = pci_bus_type;
diff --git a/drivers/char/agp/alpha-agp.c b/drivers/char/agp/alpha-agp.c
index dd84af4..199b8e9 100644
--- a/drivers/char/agp/alpha-agp.c
+++ b/drivers/char/agp/alpha-agp.c
@@ -174,7 +174,7 @@ alpha_core_agp_setup(void)
/*
 * Build a fake pci_dev struct
 */
-   pdev = alloc_pci_dev();
+   pdev = pci_alloc_dev(NULL);
if (!pdev)
return -ENOMEM;
pdev-vendor = 0x;
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c
index 94821ab..bf5d247 100644
--- a/drivers/char/agp/parisc-agp.c
+++ b/drivers/char/agp/parisc-agp.c
@@ -333,7 +333,7 @@ parisc_agp_setup(void __iomem *ioc_hpa, void __iomem 
*lba_hpa)
struct agp_bridge_data *bridge;
int error = 0;
 
-   fake_bridge_dev = alloc_pci_dev();
+   fake_bridge_dev = pci_alloc_dev(NULL);
if (!fake_bridge_dev) {
error = -ENOMEM;
goto fail;
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index c93071d..2652ca0 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -75,18 +75,20 @@ static int virtfn_add(struct pci_dev *dev, int id, int 
reset)
struct pci_dev *virtfn;
struct resource *res;
struct pci_sriov *iov = dev-sriov;
+   struct pci_bus *bus;
 
-   virtfn = alloc_pci_dev();
+   virtfn = pci_alloc_dev(NULL);
if (!virtfn)
return -ENOMEM;
 
mutex_lock(iov-dev-sriov-lock);
-   virtfn-bus = virtfn_add_bus(dev-bus, virtfn_bus(dev, id));
-   if (!virtfn-bus) {
+   bus = virtfn_add_bus(dev-bus, virtfn_bus(dev, id));
+   if (!bus) {
kfree(virtfn);
mutex_unlock(iov-dev-sriov-lock);
return -ENOMEM;
}
+   virtfn-bus = pci_bus_get(bus);
virtfn-devfn = virtfn_devfn(dev, id);
virtfn-vendor = dev-vendor;
pci_read_config_word(dev, iov-pos + PCI_SRIOV_VF_DID, virtfn-device);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 26df9c8..d5d18a0 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1130,6 +1130,7 @@ static void pci_release_dev(struct device *dev)
struct pci_dev *pci_dev;
 
pci_dev

PCI, PPC: use hotplug-safe iterators to walk PCI buses

2013-05-15 Thread Jiang Liu
Enhance PPC architecture specific code to use hotplug-safe iterators
to walk PCI buses.

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: Gavin Shan sha...@linux.vnet.ibm.com
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Grant Likely grant.lik...@secretlab.ca
Cc: Bill Pemberton wf...@virginia.edu
Cc: Yinghai Lu ying...@kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
Hi Benjamin,
How about this version? Use pci_bus_to_host() instead
to simplify code.
Regards!
Gerry
---
 arch/powerpc/kernel/pci-common.c |  4 ++--
 arch/powerpc/kernel/pci_64.c | 22 --
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index fa12ae4..26fca09 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1400,7 +1400,7 @@ void __init pcibios_resource_survey(void)
struct pci_bus *b;
 
/* Allocate and assign resources */
-   list_for_each_entry(b, pci_root_buses, node)
+   for_each_pci_root_bus(b)
pcibios_allocate_bus_resources(b);
pcibios_allocate_resources(0);
pcibios_allocate_resources(1);
@@ -1410,7 +1410,7 @@ void __init pcibios_resource_survey(void)
 * bus available resources to avoid allocating things on top of them
 */
if (!pci_has_flag(PCI_PROBE_ONLY)) {
-   list_for_each_entry(b, pci_root_buses, node)
+   for_each_pci_root_bus(b)
pcibios_reserve_legacy_regions(b);
}
 
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 51a133a..8bea231 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -207,10 +207,8 @@ void pcibios_setup_phb_io_space(struct pci_controller 
*hose)
 long sys_pciconfig_iobase(long which, unsigned long in_bus,
  unsigned long in_devfn)
 {
-   struct pci_controller* hose;
-   struct list_head *ln;
-   struct pci_bus *bus = NULL;
-   struct device_node *hose_node;
+   struct pci_controller* hose = NULL;
+   struct pci_bus *bus;
 
/* Argh ! Please forgive me for that hack, but that's the
 * simplest way to get existing XFree to not lockup on some
@@ -229,19 +227,15 @@ long sys_pciconfig_iobase(long which, unsigned long 
in_bus,
/* That syscall isn't quite compatible with PCI domains, but it's
 * used on pre-domains setup. We return the first match
 */
-
-   for (ln = pci_root_buses.next; ln != pci_root_buses; ln = ln-next) {
-   bus = pci_bus_b(ln);
-   if (in_bus = bus-number  in_bus = bus-busn_res.end)
+   for_each_pci_root_bus(bus)
+   if (in_bus = bus-number  in_bus = bus-busn_res.end) {
+   hose = pci_bus_to_host(bus);
+   pci_bus_put(bus);
break;
-   bus = NULL;
-   }
-   if (bus == NULL || bus-dev.of_node == NULL)
+   }
+   if (hose == NULL)
return -ENODEV;
 
-   hose_node = bus-dev.of_node;
-   hose = PCI_DN(hose_node)-phb;
-
switch (which) {
case IOBASE_BRIDGE_NUMBER:
return (long)hose-first_busno;
-- 
1.8.1.2

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC PATCH v2, part 2 09/18] PCI, PPC: use hotplug-safe iterators to walk PCI buses

2013-05-14 Thread Jiang Liu
Enhance PPC architecture specific code to use hotplug-safe iterators
to walk PCI buses.

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Bjorn Helgaas bhelg...@google.com
Cc: Gavin Shan sha...@linux.vnet.ibm.com
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Grant Likely grant.lik...@secretlab.ca
Cc: Bill Pemberton wf...@virginia.edu
Cc: Yinghai Lu ying...@kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/kernel/pci-common.c |  4 ++--
 arch/powerpc/kernel/pci_64.c | 13 +
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index fa12ae4..26fca09 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1400,7 +1400,7 @@ void __init pcibios_resource_survey(void)
struct pci_bus *b;
 
/* Allocate and assign resources */
-   list_for_each_entry(b, pci_root_buses, node)
+   for_each_pci_root_bus(b)
pcibios_allocate_bus_resources(b);
pcibios_allocate_resources(0);
pcibios_allocate_resources(1);
@@ -1410,7 +1410,7 @@ void __init pcibios_resource_survey(void)
 * bus available resources to avoid allocating things on top of them
 */
if (!pci_has_flag(PCI_PROBE_ONLY)) {
-   list_for_each_entry(b, pci_root_buses, node)
+   for_each_pci_root_bus(b)
pcibios_reserve_legacy_regions(b);
}
 
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 51a133a..a41c6dd 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -208,7 +208,6 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus,
  unsigned long in_devfn)
 {
struct pci_controller* hose;
-   struct list_head *ln;
struct pci_bus *bus = NULL;
struct device_node *hose_node;
 
@@ -229,18 +228,16 @@ long sys_pciconfig_iobase(long which, unsigned long 
in_bus,
/* That syscall isn't quite compatible with PCI domains, but it's
 * used on pre-domains setup. We return the first match
 */
-
-   for (ln = pci_root_buses.next; ln != pci_root_buses; ln = ln-next) {
-   bus = pci_bus_b(ln);
-   if (in_bus = bus-number  in_bus = bus-busn_res.end)
+   for_each_pci_root_bus(bus)
+   if (in_bus = bus-number  in_bus = bus-busn_res.end 
+   bus-dev.of_node)
break;
-   bus = NULL;
-   }
-   if (bus == NULL || bus-dev.of_node == NULL)
+   if (bus == NULL)
return -ENODEV;
 
hose_node = bus-dev.of_node;
hose = PCI_DN(hose_node)-phb;
+   pci_bus_put(bus);
 
switch (which) {
case IOBASE_BRIDGE_NUMBER:
-- 
1.8.1.2

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

2013-05-13 Thread Jiang Liu
From: Gu Zheng guz.f...@cn.fujitsu.com

marker to prevent gmail from removing below From:
From: Gu Zheng guz.f...@cn.fujitsu.com

Use the new pci_alloc_dev(bus) to replace the existing using of
alloc_pci_dev(void).

v2:
  Follow Bjorn's correction to move pci_bus_put() to
  pci_release_dev() instead.

Signed-off-by: Gu Zheng guz.f...@cn.fujitsu.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: David S. Miller da...@davemloft.net
Cc: David Airlie airl...@linux.ie
Cc: Neela Syam Kolli megaraidli...@lsi.com
Cc: James E.J. Bottomley jbottom...@parallels.com
Cc: Yinghai Lu ying...@kernel.org
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Andrew Morton a...@linux-foundation.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
Cc: sparcli...@vger.kernel.org
Cc: linux-...@vger.kernel.org
Cc: linux-s...@vger.kernel.org
Signed-off-by: Jiang Liu jiang@huawei.com
---
 arch/powerpc/kernel/pci_of_scan.c | 3 +--
 arch/sparc/kernel/pci.c   | 3 +--
 drivers/char/agp/alpha-agp.c  | 2 +-
 drivers/char/agp/parisc-agp.c | 2 +-
 drivers/pci/iov.c | 8 +---
 drivers/pci/probe.c   | 4 ++--
 drivers/scsi/megaraid.c   | 2 +-
 7 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/kernel/pci_of_scan.c 
b/arch/powerpc/kernel/pci_of_scan.c
index 2a67e9b..24d01c4 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -128,7 +128,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
const char *type;
struct pci_slot *slot;
 
-   dev = alloc_pci_dev();
+   dev = pci_alloc_dev(bus);
if (!dev)
return NULL;
type = of_get_property(node, device_type, NULL);
@@ -137,7 +137,6 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
 
pr_debug(create device, devfn: %x, type: %s\n, devfn, type);
 
-   dev-bus = bus;
dev-dev.of_node = of_node_get(node);
dev-dev.parent = bus-bridge;
dev-dev.bus = pci_bus_type;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index baf4366..e5871fb 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -254,7 +254,7 @@ static struct pci_dev *of_create_pci_dev(struct 
pci_pbm_info *pbm,
const char *type;
u32 class;
 
-   dev = alloc_pci_dev();
+   dev = pci_alloc_dev(bus);
if (!dev)
return NULL;
 
@@ -281,7 +281,6 @@ static struct pci_dev *of_create_pci_dev(struct 
pci_pbm_info *pbm,
printk(create device, devfn: %x, type: %s\n,
   devfn, type);
 
-   dev-bus = bus;
dev-sysdata = node;
dev-dev.parent = bus-bridge;
dev-dev.bus = pci_bus_type;
diff --git a/drivers/char/agp/alpha-agp.c b/drivers/char/agp/alpha-agp.c
index dd84af4..199b8e9 100644
--- a/drivers/char/agp/alpha-agp.c
+++ b/drivers/char/agp/alpha-agp.c
@@ -174,7 +174,7 @@ alpha_core_agp_setup(void)
/*
 * Build a fake pci_dev struct
 */
-   pdev = alloc_pci_dev();
+   pdev = pci_alloc_dev(NULL);
if (!pdev)
return -ENOMEM;
pdev-vendor = 0x;
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c
index 94821ab..bf5d247 100644
--- a/drivers/char/agp/parisc-agp.c
+++ b/drivers/char/agp/parisc-agp.c
@@ -333,7 +333,7 @@ parisc_agp_setup(void __iomem *ioc_hpa, void __iomem 
*lba_hpa)
struct agp_bridge_data *bridge;
int error = 0;
 
-   fake_bridge_dev = alloc_pci_dev();
+   fake_bridge_dev = pci_alloc_dev(NULL);
if (!fake_bridge_dev) {
error = -ENOMEM;
goto fail;
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index ee599f2..24134cd 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -75,18 +75,20 @@ static int virtfn_add(struct pci_dev *dev, int id, int 
reset)
struct pci_dev *virtfn;
struct resource *res;
struct pci_sriov *iov = dev-sriov;
+   struct pci_bus *bus;
 
-   virtfn = alloc_pci_dev();
+   virtfn = pci_alloc_dev(NULL);
if (!virtfn)
return -ENOMEM;
 
mutex_lock(iov-dev-sriov-lock);
-   virtfn-bus = virtfn_add_bus(dev-bus, virtfn_bus(dev, id));
-   if (!virtfn-bus) {
+   bus = virtfn_add_bus(dev-bus, virtfn_bus(dev, id));
+   if (!bus) {
kfree(virtfn);
mutex_unlock(iov-dev-sriov-lock);
return -ENOMEM;
}
+   virtfn-bus = pci_bus_get(bus);
virtfn-devfn = virtfn_devfn(dev, id);
virtfn-vendor = dev-vendor;
pci_read_config_word(dev, iov-pos + PCI_SRIOV_VF_DID, virtfn-device);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4f0bc0a..bc075a3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1131,6 +1131,7 @@ static void pci_release_dev(struct device *dev)
struct pci_dev

[PATCH v5, part4 31/41] mm/ppc: prepare for removing num_physpages and simplify mem_init()

2013-05-08 Thread Jiang Liu
Prepare for removing num_physpages and simplify mem_init().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c |   56 +++--
 1 file changed, 12 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index b890245..4e24f1c 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -299,46 +299,27 @@ void __init paging_init(void)
 
 void __init mem_init(void)
 {
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   int nid;
-#endif
-   pg_data_t *pgdat;
-   unsigned long i;
-   struct page *page;
-   unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
-
 #ifdef CONFIG_SWIOTLB
swiotlb_init(0);
 #endif
 
-   num_physpages = memblock_phys_mem_size()  PAGE_SHIFT;
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
-for_each_online_node(nid) {
-   if (NODE_DATA(nid)-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n, nid);
-   free_all_bootmem_node(NODE_DATA(nid));
-   }
+   {
+   pg_data_t *pgdat;
+
+   for_each_online_pgdat(pgdat)
+   if (pgdat-node_spanned_pages != 0) {
+   printk(freeing bootmem node %d\n,
+   pgdat-node_id);
+   free_all_bootmem_node(pgdat);
+   }
}
 #else
max_mapnr = max_pfn;
free_all_bootmem();
 #endif
-   for_each_online_pgdat(pgdat) {
-   for (i = 0; i  pgdat-node_spanned_pages; i++) {
-   if (!pfn_valid(pgdat-node_start_pfn + i))
-   continue;
-   page = pgdat_page_nr(pgdat, i);
-   if (PageReserved(page))
-   reservedpages++;
-   }
-   }
-
-   codesize = (unsigned long)_sdata - (unsigned long)_stext;
-   datasize = (unsigned long)_edata - (unsigned long)_sdata;
-   initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
-   bsssize = (unsigned long)__bss_stop - (unsigned long)__bss_start;
 
 #ifdef CONFIG_HIGHMEM
{
@@ -348,13 +329,9 @@ void __init mem_init(void)
for (pfn = highmem_mapnr; pfn  max_mapnr; ++pfn) {
phys_addr_t paddr = (phys_addr_t)pfn  PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
-   if (memblock_is_reserved(paddr))
-   continue;
-   free_highmem_page(page);
-   reservedpages--;
+   if (!memblock_is_reserved(paddr))
+   free_highmem_page(page);
}
-   printk(KERN_DEBUG High memory: %luk\n,
-  totalhigh_pages  (PAGE_SHIFT-10));
}
 #endif /* CONFIG_HIGHMEM */
 
@@ -367,16 +344,7 @@ void __init mem_init(void)
(mfspr(SPRN_TLB1CFG)  TLBnCFG_N_ENTRY) - 1;
 #endif
 
-   printk(KERN_INFO Memory: %luk/%luk available (%luk kernel code, 
-  %luk reserved, %luk data, %luk bss, %luk init)\n,
-   nr_free_pages()  (PAGE_SHIFT-10),
-   num_physpages  (PAGE_SHIFT-10),
-   codesize  10,
-   reservedpages  (PAGE_SHIFT-10),
-   datasize  10,
-   bsssize  10,
-   initsize  10);
-
+   mem_init_print_info(NULL);
 #ifdef CONFIG_PPC32
pr_info(Kernel virtual memory layout:\n);
pr_info(  * 0x%08lx..0x%08lx  : fixmap\n, FIXADDR_START, FIXADDR_TOP);
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC PATCH v1 09/19] mm/PPC: prepare for killing free_all_bootmem_node()

2013-04-13 Thread Jiang Liu
Prepare for killing free_all_bootmem_node() by using
free_all_bootmem().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: Alexander Graf ag...@suse.de
Cc: Suzuki K. Poulose suz...@in.ibm.com
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c |   16 +---
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 07663de..22e46db 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -305,22 +305,8 @@ void __init mem_init(void)
 #endif
 
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
-
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   {
-   pg_data_t *pgdat;
-
-   for_each_online_pgdat(pgdat)
-   if (pgdat-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n,
-   pgdat-node_id);
-   free_all_bootmem_node(pgdat);
-   }
-   }
-#else
-   max_mapnr = max_pfn;
+   set_max_mapnr(max_pfn);
free_all_bootmem();
-#endif
 
 #ifdef CONFIG_HIGHMEM
{
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v4, part3 31/41] mm/ppc: prepare for removing num_physpages and simplify mem_init()

2013-04-06 Thread Jiang Liu
Prepare for removing num_physpages and simplify mem_init().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c |   56 +++--
 1 file changed, 12 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 8ddef0a..07663de 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -300,46 +300,27 @@ void __init paging_init(void)
 
 void __init mem_init(void)
 {
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   int nid;
-#endif
-   pg_data_t *pgdat;
-   unsigned long i;
-   struct page *page;
-   unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
-
 #ifdef CONFIG_SWIOTLB
swiotlb_init(0);
 #endif
 
-   num_physpages = memblock_phys_mem_size()  PAGE_SHIFT;
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
-for_each_online_node(nid) {
-   if (NODE_DATA(nid)-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n, nid);
-   free_all_bootmem_node(NODE_DATA(nid));
-   }
+   {
+   pg_data_t *pgdat;
+
+   for_each_online_pgdat(pgdat)
+   if (pgdat-node_spanned_pages != 0) {
+   printk(freeing bootmem node %d\n,
+   pgdat-node_id);
+   free_all_bootmem_node(pgdat);
+   }
}
 #else
max_mapnr = max_pfn;
free_all_bootmem();
 #endif
-   for_each_online_pgdat(pgdat) {
-   for (i = 0; i  pgdat-node_spanned_pages; i++) {
-   if (!pfn_valid(pgdat-node_start_pfn + i))
-   continue;
-   page = pgdat_page_nr(pgdat, i);
-   if (PageReserved(page))
-   reservedpages++;
-   }
-   }
-
-   codesize = (unsigned long)_sdata - (unsigned long)_stext;
-   datasize = (unsigned long)_edata - (unsigned long)_sdata;
-   initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
-   bsssize = (unsigned long)__bss_stop - (unsigned long)__bss_start;
 
 #ifdef CONFIG_HIGHMEM
{
@@ -349,13 +330,9 @@ void __init mem_init(void)
for (pfn = highmem_mapnr; pfn  max_mapnr; ++pfn) {
phys_addr_t paddr = (phys_addr_t)pfn  PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
-   if (memblock_is_reserved(paddr))
-   continue;
-   free_highmem_page(page);
-   reservedpages--;
+   if (!memblock_is_reserved(paddr))
+   free_highmem_page(page);
}
-   printk(KERN_DEBUG High memory: %luk\n,
-  totalhigh_pages  (PAGE_SHIFT-10));
}
 #endif /* CONFIG_HIGHMEM */
 
@@ -368,16 +345,7 @@ void __init mem_init(void)
(mfspr(SPRN_TLB1CFG)  TLBnCFG_N_ENTRY) - 1;
 #endif
 
-   printk(KERN_INFO Memory: %luk/%luk available (%luk kernel code, 
-  %luk reserved, %luk data, %luk bss, %luk init)\n,
-   nr_free_pages()  (PAGE_SHIFT-10),
-   num_physpages  (PAGE_SHIFT-10),
-   codesize  10,
-   reservedpages  (PAGE_SHIFT-10),
-   datasize  10,
-   bsssize  10,
-   initsize  10);
-
+   mem_init_print_info(NULL);
 #ifdef CONFIG_PPC32
pr_info(Kernel virtual memory layout:\n);
pr_info(  * 0x%08lx..0x%08lx  : fixmap\n, FIXADDR_START, FIXADDR_TOP);
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v3, part4 28/39] mm/ppc: prepare for removing num_physpages and simplify mem_init()

2013-03-26 Thread Jiang Liu
Prepare for removing num_physpages and simplify mem_init().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
Hi all,
Sorry for my mistake that my previous patch series has been screwed up.
So I regenerate a third version and also set up a git tree at:
git://github.com/jiangliu/linux.git mem_init
Any help to review and test are welcomed!

Regards!
Gerry
---
 arch/powerpc/mm/mem.c |   56 +++--
 1 file changed, 12 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 0e154a9..8aba687 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -303,46 +303,27 @@ void __init paging_init(void)
 
 void __init mem_init(void)
 {
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   int nid;
-#endif
-   pg_data_t *pgdat;
-   unsigned long i;
-   struct page *page;
-   unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
-
 #ifdef CONFIG_SWIOTLB
swiotlb_init(0);
 #endif
 
-   num_physpages = memblock_phys_mem_size()  PAGE_SHIFT;
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
-for_each_online_node(nid) {
-   if (NODE_DATA(nid)-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n, nid);
-   free_all_bootmem_node(NODE_DATA(nid));
-   }
+   {
+   pg_data_t *pgdat;
+
+   for_each_online_pgdat(pgdat)
+   if (pgdat-node_spanned_pages != 0) {
+   printk(freeing bootmem node %d\n,
+   pgdat-node_id);
+   free_all_bootmem_node(pgdat);
+   }
}
 #else
max_mapnr = max_pfn;
free_all_bootmem();
 #endif
-   for_each_online_pgdat(pgdat) {
-   for (i = 0; i  pgdat-node_spanned_pages; i++) {
-   if (!pfn_valid(pgdat-node_start_pfn + i))
-   continue;
-   page = pgdat_page_nr(pgdat, i);
-   if (PageReserved(page))
-   reservedpages++;
-   }
-   }
-
-   codesize = (unsigned long)_sdata - (unsigned long)_stext;
-   datasize = (unsigned long)_edata - (unsigned long)_sdata;
-   initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
-   bsssize = (unsigned long)__bss_stop - (unsigned long)__bss_start;
 
 #ifdef CONFIG_HIGHMEM
{
@@ -352,13 +333,9 @@ void __init mem_init(void)
for (pfn = highmem_mapnr; pfn  max_mapnr; ++pfn) {
phys_addr_t paddr = (phys_addr_t)pfn  PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
-   if (memblock_is_reserved(paddr))
-   continue;
-   free_highmem_page(page);
-   reservedpages--;
+   if (!memblock_is_reserved(paddr))
+   free_highmem_page(page);
}
-   printk(KERN_DEBUG High memory: %luk\n,
-  totalhigh_pages  (PAGE_SHIFT-10));
}
 #endif /* CONFIG_HIGHMEM */
 
@@ -371,16 +348,7 @@ void __init mem_init(void)
(mfspr(SPRN_TLB1CFG)  TLBnCFG_N_ENTRY) - 1;
 #endif
 
-   printk(KERN_INFO Memory: %luk/%luk available (%luk kernel code, 
-  %luk reserved, %luk data, %luk bss, %luk init)\n,
-   nr_free_pages()  (PAGE_SHIFT-10),
-   num_physpages  (PAGE_SHIFT-10),
-   codesize  10,
-   reservedpages  (PAGE_SHIFT-10),
-   datasize  10,
-   bsssize  10,
-   initsize  10);
-
+   mem_init_print_info(NULL);
 #ifdef CONFIG_PPC32
pr_info(Kernel virtual memory layout:\n);
pr_info(  * 0x%08lx..0x%08lx  : fixmap\n, FIXADDR_START, FIXADDR_TOP);
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC PATCH v2, part4 27/39] mm/ppc: prepare for removing num_physpages and simplify mem_init()

2013-03-24 Thread Jiang Liu
Prepare for removing num_physpages and simplify mem_init().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c |   56 +++--
 1 file changed, 12 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 0e154a9..8aba687 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -303,46 +303,27 @@ void __init paging_init(void)
 
 void __init mem_init(void)
 {
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   int nid;
-#endif
-   pg_data_t *pgdat;
-   unsigned long i;
-   struct page *page;
-   unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
-
 #ifdef CONFIG_SWIOTLB
swiotlb_init(0);
 #endif
 
-   num_physpages = memblock_phys_mem_size()  PAGE_SHIFT;
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
-for_each_online_node(nid) {
-   if (NODE_DATA(nid)-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n, nid);
-   free_all_bootmem_node(NODE_DATA(nid));
-   }
+   {
+   pg_data_t *pgdat;
+
+   for_each_online_pgdat(pgdat)
+   if (pgdat-node_spanned_pages != 0) {
+   printk(freeing bootmem node %d\n,
+   pgdat-node_id);
+   free_all_bootmem_node(pgdat);
+   }
}
 #else
max_mapnr = max_pfn;
free_all_bootmem();
 #endif
-   for_each_online_pgdat(pgdat) {
-   for (i = 0; i  pgdat-node_spanned_pages; i++) {
-   if (!pfn_valid(pgdat-node_start_pfn + i))
-   continue;
-   page = pgdat_page_nr(pgdat, i);
-   if (PageReserved(page))
-   reservedpages++;
-   }
-   }
-
-   codesize = (unsigned long)_sdata - (unsigned long)_stext;
-   datasize = (unsigned long)_edata - (unsigned long)_sdata;
-   initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
-   bsssize = (unsigned long)__bss_stop - (unsigned long)__bss_start;
 
 #ifdef CONFIG_HIGHMEM
{
@@ -352,13 +333,9 @@ void __init mem_init(void)
for (pfn = highmem_mapnr; pfn  max_mapnr; ++pfn) {
phys_addr_t paddr = (phys_addr_t)pfn  PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
-   if (memblock_is_reserved(paddr))
-   continue;
-   free_highmem_page(page);
-   reservedpages--;
+   if (!memblock_is_reserved(paddr))
+   free_highmem_page(page);
}
-   printk(KERN_DEBUG High memory: %luk\n,
-  totalhigh_pages  (PAGE_SHIFT-10));
}
 #endif /* CONFIG_HIGHMEM */
 
@@ -371,16 +348,7 @@ void __init mem_init(void)
(mfspr(SPRN_TLB1CFG)  TLBnCFG_N_ENTRY) - 1;
 #endif
 
-   printk(KERN_INFO Memory: %luk/%luk available (%luk kernel code, 
-  %luk reserved, %luk data, %luk bss, %luk init)\n,
-   nr_free_pages()  (PAGE_SHIFT-10),
-   num_physpages  (PAGE_SHIFT-10),
-   codesize  10,
-   reservedpages  (PAGE_SHIFT-10),
-   datasize  10,
-   bsssize  10,
-   initsize  10);
-
+   mem_init_print_info(NULL);
 #ifdef CONFIG_PPC32
pr_info(Kernel virtual memory layout:\n);
pr_info(  * 0x%08lx..0x%08lx  : fixmap\n, FIXADDR_START, FIXADDR_TOP);
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC PATCH v2, part4 28/39] mm/ppc: prepare for removing num_physpages and simplify mem_init()

2013-03-24 Thread Jiang Liu
Prepare for removing num_physpages and simplify mem_init().

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c |   56 +++--
 1 file changed, 12 insertions(+), 44 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 0e154a9..8aba687 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -303,46 +303,27 @@ void __init paging_init(void)
 
 void __init mem_init(void)
 {
-#ifdef CONFIG_NEED_MULTIPLE_NODES
-   int nid;
-#endif
-   pg_data_t *pgdat;
-   unsigned long i;
-   struct page *page;
-   unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
-
 #ifdef CONFIG_SWIOTLB
swiotlb_init(0);
 #endif
 
-   num_physpages = memblock_phys_mem_size()  PAGE_SHIFT;
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
-for_each_online_node(nid) {
-   if (NODE_DATA(nid)-node_spanned_pages != 0) {
-   printk(freeing bootmem node %d\n, nid);
-   free_all_bootmem_node(NODE_DATA(nid));
-   }
+   {
+   pg_data_t *pgdat;
+
+   for_each_online_pgdat(pgdat)
+   if (pgdat-node_spanned_pages != 0) {
+   printk(freeing bootmem node %d\n,
+   pgdat-node_id);
+   free_all_bootmem_node(pgdat);
+   }
}
 #else
max_mapnr = max_pfn;
free_all_bootmem();
 #endif
-   for_each_online_pgdat(pgdat) {
-   for (i = 0; i  pgdat-node_spanned_pages; i++) {
-   if (!pfn_valid(pgdat-node_start_pfn + i))
-   continue;
-   page = pgdat_page_nr(pgdat, i);
-   if (PageReserved(page))
-   reservedpages++;
-   }
-   }
-
-   codesize = (unsigned long)_sdata - (unsigned long)_stext;
-   datasize = (unsigned long)_edata - (unsigned long)_sdata;
-   initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
-   bsssize = (unsigned long)__bss_stop - (unsigned long)__bss_start;
 
 #ifdef CONFIG_HIGHMEM
{
@@ -352,13 +333,9 @@ void __init mem_init(void)
for (pfn = highmem_mapnr; pfn  max_mapnr; ++pfn) {
phys_addr_t paddr = (phys_addr_t)pfn  PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
-   if (memblock_is_reserved(paddr))
-   continue;
-   free_highmem_page(page);
-   reservedpages--;
+   if (!memblock_is_reserved(paddr))
+   free_highmem_page(page);
}
-   printk(KERN_DEBUG High memory: %luk\n,
-  totalhigh_pages  (PAGE_SHIFT-10));
}
 #endif /* CONFIG_HIGHMEM */
 
@@ -371,16 +348,7 @@ void __init mem_init(void)
(mfspr(SPRN_TLB1CFG)  TLBnCFG_N_ENTRY) - 1;
 #endif
 
-   printk(KERN_INFO Memory: %luk/%luk available (%luk kernel code, 
-  %luk reserved, %luk data, %luk bss, %luk init)\n,
-   nr_free_pages()  (PAGE_SHIFT-10),
-   num_physpages  (PAGE_SHIFT-10),
-   codesize  10,
-   reservedpages  (PAGE_SHIFT-10),
-   datasize  10,
-   bsssize  10,
-   initsize  10);
-
+   mem_init_print_info(NULL);
 #ifdef CONFIG_PPC32
pr_info(Kernel virtual memory layout:\n);
pr_info(  * 0x%08lx..0x%08lx  : fixmap\n, FIXADDR_START, FIXADDR_TOP);
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v2, part2 07/10] mm/PPC: use free_highmem_page() to free highmem pages into buddy system

2013-03-10 Thread Jiang Liu
Use helper function free_highmem_page() to free highmem pages into
the buddy system.

Signed-off-by: Jiang Liu jiang@huawei.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: Jiang Liu jiang@huawei.com
Cc: Andrew Morton a...@linux-foundation.org
Cc: Alexander Graf ag...@suse.de
Cc: Suzuki K. Poulose suz...@in.ibm.com
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
---
 arch/powerpc/mm/mem.c |6 +-
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index c756713..68f51d0 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -352,13 +352,9 @@ void __init mem_init(void)
struct page *page = pfn_to_page(pfn);
if (memblock_is_reserved(paddr))
continue;
-   ClearPageReserved(page);
-   init_page_count(page);
-   __free_page(page);
-   totalhigh_pages++;
+   free_higmem_page(page);
reservedpages--;
}
-   totalram_pages += totalhigh_pages;
printk(KERN_DEBUG High memory: %luk\n,
   totalhigh_pages  (PAGE_SHIFT-10));
}
-- 
1.7.9.5

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH v3 0/13] memory-hotplug : hot-remove physical memory

2012-07-11 Thread Jiang Liu
On 07/11/2012 08:54 AM, Yasuaki Ishimatsu wrote:
 Hi Jiang,
 
 2012/07/11 9:21, Jiang Liu wrote:
 On 07/11/2012 08:09 AM, Yasuaki Ishimatsu wrote:
 Hi Jiang,

 2012/07/11 1:50, Jiang Liu wrote:
 On 07/10/2012 05:58 PM, Yasuaki Ishimatsu wrote:
 Hi Christoph,

 2012/07/10 0:18, Christoph Lameter wrote:

 On Mon, 9 Jul 2012, Yasuaki Ishimatsu wrote:

 Even if you apply these patches, you cannot remove the physical memory
 completely since these patches are still under development. I want you 
 to
 cooperate to improve the physical memory hot-remove. So please review 
 these
 patches and give your comment/idea.

 Could you at least give a method on how you want to do physical memory
 removal?

 We plan to release a dynamic hardware partitionable system. It will be
 able to hot remove/add a system board which included memory and cpu.
 But as you know, Linux does not support memory hot-remove on x86 box.
 So I try to develop it.

 Current plan to hot remove system board is to use container driver.
 Thus I define the system board in ACPI DSDT table as a container device.
 It have supported hot-add a container device. And if container device
 has _EJ0 ACPI method, eject file to remove the container device is
 prepared as follow:

 # ls -l /sys/bus/acpi/devices/ACPI0004\:01/eject
 --w---. 1 root root 4096 Jul 10 18:19 
 /sys/bus/acpi/devices/ACPI0004:01/eject

 When I hot-remove the container device, I echo 1 to the file as follow:

 #echo 1  /sys/bus/acpi/devices/ACPI0004\:02/eject

 Then acpi_bus_trim() is called. And it calls acpi_memory_device_remove()
 for removing memory device. But the code does not do nothing.
 So I developed the continuation of the function.

 You would have to remove all objects from the range you want to
 physically remove. That is only possible under special circumstances and
 with a limited set of objects. Even if you exclusively use ZONE_MOVEABLE
 you still may get cases where pages are pinned for a long time.

 I know it. So my memory hot-remove plan is as follows:

 1. hot-added a system board
  All memory which included the system board is offline.

 2. online the memory as removable page
  The function has not supported yet. It is being developed by Lai as 
 follow:
  http://lkml.indiana.edu/hypermail/linux/kernel/1207.0/01478.html
  If it is supported, I will be able to create movable memory.

 3. hot-remove the memory by container device's eject file
 We have implemented a prototype to do physical node (mem + CPU + IOH) 
 hotplug
 for Itanium and is now porting it to x86. But with currently solution, 
 memory
 hotplug functionality may cause 10-20% performance decrease because we 
 concentrate
 all DMA/Normal memory to the first NUMA node, and all other NUMA nodes only
 hosts ZONE_MOVABLE. We are working on solution to minimize the performance
 drop now.

 Thank you for your interesting response.

 I have a question. How do you move all other NUMA nodes to ZONE_MOVABLE?
 To use ZONE_MOVABLE, we need to use boot options like kernelcore or 
 movablecore.
 But it is not enough, since the requested amount is spread evenly throughout
 all nodes in the system. So I think we do not have way to move all other 
 NUMA
 node to ZONE_MOVABLE.
 We have modified the ZONE_MOVABLE spreading and bootmem allocation. If the 
 kernelcore
 or movablecore kernel parameters are present, we follow current behavior. If 
 those
 parameter are absent and the platform supports physical hotplug, we will 
 concentrate
 DMA/NORMAL memory to specific nodes.
 
 That's interesting. I want to know more details, if you do not mind.
 Current kernel doesn't do the behavior, does it? So I think you have some
 patches for changing the behavior. Will you merge these patches into
 community kernel?
Yeah, we do have patches for that. But it's still prototype, still much work
needed before sending them to the community. 
Currently I'm trying to send out patches for an ACPI based system device
hotplug framework, which will support processor, memory, IOH and node hotplug
in a unified way. After that, I will prepare the memory hotplug code.

Thanks!
Gerry
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH v3 0/13] memory-hotplug : hot-remove physical memory

2012-07-10 Thread Jiang Liu
On 07/10/2012 05:58 PM, Yasuaki Ishimatsu wrote:
 Hi Christoph,
 
 2012/07/10 0:18, Christoph Lameter wrote:

 On Mon, 9 Jul 2012, Yasuaki Ishimatsu wrote:

 Even if you apply these patches, you cannot remove the physical memory
 completely since these patches are still under development. I want you to
 cooperate to improve the physical memory hot-remove. So please review these
 patches and give your comment/idea.

 Could you at least give a method on how you want to do physical memory
 removal?
 
 We plan to release a dynamic hardware partitionable system. It will be
 able to hot remove/add a system board which included memory and cpu.
 But as you know, Linux does not support memory hot-remove on x86 box.
 So I try to develop it.
 
 Current plan to hot remove system board is to use container driver.
 Thus I define the system board in ACPI DSDT table as a container device.
 It have supported hot-add a container device. And if container device
 has _EJ0 ACPI method, eject file to remove the container device is
 prepared as follow:
 
 # ls -l /sys/bus/acpi/devices/ACPI0004\:01/eject
 --w---. 1 root root 4096 Jul 10 18:19 
 /sys/bus/acpi/devices/ACPI0004:01/eject
 
 When I hot-remove the container device, I echo 1 to the file as follow:
 
 #echo 1  /sys/bus/acpi/devices/ACPI0004\:02/eject
 
 Then acpi_bus_trim() is called. And it calls acpi_memory_device_remove()
 for removing memory device. But the code does not do nothing.
 So I developed the continuation of the function.
 
 You would have to remove all objects from the range you want to
 physically remove. That is only possible under special circumstances and
 with a limited set of objects. Even if you exclusively use ZONE_MOVEABLE
 you still may get cases where pages are pinned for a long time.
 
 I know it. So my memory hot-remove plan is as follows:
 
 1. hot-added a system board
All memory which included the system board is offline.
 
 2. online the memory as removable page
The function has not supported yet. It is being developed by Lai as follow:
http://lkml.indiana.edu/hypermail/linux/kernel/1207.0/01478.html
If it is supported, I will be able to create movable memory.
 
 3. hot-remove the memory by container device's eject file
We have implemented a prototype to do physical node (mem + CPU + IOH) hotplug
for Itanium and is now porting it to x86. But with currently solution, memory
hotplug functionality may cause 10-20% performance decrease because we 
concentrate
all DMA/Normal memory to the first NUMA node, and all other NUMA nodes only
hosts ZONE_MOVABLE. We are working on solution to minimize the performance
drop now.

 
 Thanks,
 Yasuaki Ishimatsu
 

 I am not sure that these patches are useful unless we know where you are
 going with this. If we end up with a situation where we still cannot
 remove physical memory then this patchset is not helpful.
 
 
 


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH v3 0/13] memory-hotplug : hot-remove physical memory

2012-07-10 Thread Jiang Liu
On 07/11/2012 08:09 AM, Yasuaki Ishimatsu wrote:
 Hi Jiang,
 
 2012/07/11 1:50, Jiang Liu wrote:
 On 07/10/2012 05:58 PM, Yasuaki Ishimatsu wrote:
 Hi Christoph,

 2012/07/10 0:18, Christoph Lameter wrote:

 On Mon, 9 Jul 2012, Yasuaki Ishimatsu wrote:

 Even if you apply these patches, you cannot remove the physical memory
 completely since these patches are still under development. I want you to
 cooperate to improve the physical memory hot-remove. So please review 
 these
 patches and give your comment/idea.

 Could you at least give a method on how you want to do physical memory
 removal?

 We plan to release a dynamic hardware partitionable system. It will be
 able to hot remove/add a system board which included memory and cpu.
 But as you know, Linux does not support memory hot-remove on x86 box.
 So I try to develop it.

 Current plan to hot remove system board is to use container driver.
 Thus I define the system board in ACPI DSDT table as a container device.
 It have supported hot-add a container device. And if container device
 has _EJ0 ACPI method, eject file to remove the container device is
 prepared as follow:

 # ls -l /sys/bus/acpi/devices/ACPI0004\:01/eject
 --w---. 1 root root 4096 Jul 10 18:19 
 /sys/bus/acpi/devices/ACPI0004:01/eject

 When I hot-remove the container device, I echo 1 to the file as follow:

 #echo 1  /sys/bus/acpi/devices/ACPI0004\:02/eject

 Then acpi_bus_trim() is called. And it calls acpi_memory_device_remove()
 for removing memory device. But the code does not do nothing.
 So I developed the continuation of the function.

 You would have to remove all objects from the range you want to
 physically remove. That is only possible under special circumstances and
 with a limited set of objects. Even if you exclusively use ZONE_MOVEABLE
 you still may get cases where pages are pinned for a long time.

 I know it. So my memory hot-remove plan is as follows:

 1. hot-added a system board
 All memory which included the system board is offline.

 2. online the memory as removable page
 The function has not supported yet. It is being developed by Lai as 
 follow:
 http://lkml.indiana.edu/hypermail/linux/kernel/1207.0/01478.html
 If it is supported, I will be able to create movable memory.

 3. hot-remove the memory by container device's eject file
 We have implemented a prototype to do physical node (mem + CPU + IOH) hotplug
 for Itanium and is now porting it to x86. But with currently solution, memory
 hotplug functionality may cause 10-20% performance decrease because we 
 concentrate
 all DMA/Normal memory to the first NUMA node, and all other NUMA nodes only
 hosts ZONE_MOVABLE. We are working on solution to minimize the performance
 drop now.
 
 Thank you for your interesting response.
 
 I have a question. How do you move all other NUMA nodes to ZONE_MOVABLE?
 To use ZONE_MOVABLE, we need to use boot options like kernelcore or 
 movablecore.
 But it is not enough, since the requested amount is spread evenly throughout
 all nodes in the system. So I think we do not have way to move all other NUMA
 node to ZONE_MOVABLE.
We have modified the ZONE_MOVABLE spreading and bootmem allocation. If the 
kernelcore
or movablecore kernel parameters are present, we follow current behavior. If 
those
parameter are absent and the platform supports physical hotplug, we will 
concentrate
DMA/NORMAL memory to specific nodes.

 
 Thanks,
 Yasuaki Ishimatsu
 


 Thanks,
 Yasuaki Ishimatsu


 I am not sure that these patches are useful unless we know where you are
 going with this. If we end up with a situation where we still cannot
 remove physical memory then this patchset is not helpful.





 
 
 


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] mm: setup pageblock_order before it's used by sparse

2012-07-02 Thread Jiang Liu
On 2012-7-3 4:43, Yinghai Lu wrote:
 On Sun, Jul 1, 2012 at 7:01 PM, Jiang Liu jiang@huawei.com wrote:
 Hi Yinghai,
 The patch fails compilation as below:
 mm/page_alloc.c:151: error: initializer element is not constant
 mm/page_alloc.c:151: error: expected ‘,’ or ‘;’ before ‘__attribute__’

 On IA64, HUGETLB_PAGE_ORDER has dependency on variable hpage_shift.
 # define HUGETLB_PAGE_ORDER(HPAGE_SHIFT - PAGE_SHIFT)
 # define HPAGE_SHIFT   hpage_shift

 And hpage_shift could be changed by early parameter hugepagesz.
 So seems will still need to keep function set_pageblock_order().
 
 ah,  then use use _DEFAULT instead and later could update that in earlyparam.
 
 So attached -v2 should  work.
Hi Yinghai,

I'm afraid the v2 will break powerpc. Currently only IA64 and PowerPC
supports variable hugetlb size. 

HPAGE_SHIFT is a variable default to 0 on powerpc. But seems PowerPC 
is doing something wrong here, according to it's mm initialization 
sequence as below:
start_kernel()
setup_arch()
paging_init()
free_area_init_node()
set_pageblock_order()
refer to HPAGE_SHIFT (still 0)
init_rest() 
do_initcalls()
hugetlbpage_init()
setup HPAGE_SHIFT
That means pageblock_order is always set to MAX_ORDER - 1, not sure
whether this is intended. And it has the same issue as IA64 of wasting
memory if CONFIG_SPARSE is enabled.

So it would be better to keep function set_pageblock_order(), it will
fix the memory wasting on both IA64 and PowerPC.

Thanks!
Gerry

 
 Thanks
 
 Yinghai


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] mm: setup pageblock_order before it's used by sparse

2012-07-02 Thread Jiang Liu
 Hi Yinghai,

 I'm afraid the v2 will break powerpc. Currently only IA64 and PowerPC
 supports variable hugetlb size.

 HPAGE_SHIFT is a variable default to 0 on powerpc. But seems PowerPC
 is doing something wrong here, according to it's mm initialization
 sequence as below:
 start_kernel()
 setup_arch()
 paging_init()
 free_area_init_node()
 set_pageblock_order()
 refer to HPAGE_SHIFT (still 0)
 init_rest()
 do_initcalls()
 hugetlbpage_init()
 setup HPAGE_SHIFT
 That means pageblock_order is always set to MAX_ORDER - 1, not sure
 whether this is intended. And it has the same issue as IA64 of wasting
 memory if CONFIG_SPARSE is enabled.
 
 adding BenH, need to know if it is powerpc intended.
 

 So it would be better to keep function set_pageblock_order(), it will
 fix the memory wasting on both IA64 and PowerPC.
 
 Should setup pageblock_order as early as possible to avoid confusing.
OK, waiting response from PPC. If we could find some ways to set HPAGE_SIZE
early on PPC too, we can setup pageblock_order in arch instead of page_alloc.c
as early as possible.

Thanks!
Gerry

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 2/12] memory-hogplug : check memory offline in offline_pages

2012-06-30 Thread Jiang Liu
On 06/27/2012 01:44 PM, Yasuaki Ishimatsu wrote:
 When offline_pages() is called to offlined memory, the function fails since
 all memory has been offlined. In this case, the function should succeed.
 The patch adds the check function into offline_pages().
 
 CC: Len Brown len.br...@intel.com
 CC: Benjamin Herrenschmidt b...@kernel.crashing.org
 CC: Paul Mackerras pau...@samba.org
 CC: Christoph Lameter c...@linux.com
 Cc: Minchan Kim minchan@gmail.com
 CC: Andrew Morton a...@linux-foundation.org
 CC: KOSAKI Motohiro kosaki.motoh...@jp.fujitsu.com
 CC: Wen Congyang we...@cn.fujitsu.com
 Signed-off-by: Yasuaki Ishimatsu isimatu.yasu...@jp.fujitsu.com
 
 ---
  drivers/base/memory.c  |   20 
  include/linux/memory.h |1 +
  mm/memory_hotplug.c|5 +
  3 files changed, 26 insertions(+)
 
 Index: linux-3.5-rc4/drivers/base/memory.c
 ===
 --- linux-3.5-rc4.orig/drivers/base/memory.c  2012-06-26 13:28:16.726211752 
 +0900
 +++ linux-3.5-rc4/drivers/base/memory.c   2012-06-26 13:34:22.423639904 
 +0900
 @@ -70,6 +70,26 @@ void unregister_memory_isolate_notifier(
  }
  EXPORT_SYMBOL(unregister_memory_isolate_notifier);
 
 +bool memory_is_offline(unsigned long start_pfn, unsigned long end_pfn)
 +{
 + struct memory_block *mem;
 + struct mem_section *section;
 + unsigned long pfn, section_nr;
 +
 + for (pfn = start_pfn; pfn  end_pfn; pfn += PAGES_PER_SECTION) {
 + section_nr = pfn_to_section_nr(pfn);
 + section = __nr_to_section(section_nr);
Is it possible for __nr_to_section return NULL here?

 + mem = find_memory_block(section);
 + if (!mem)
 + continue;
 + if (mem-state == MEM_OFFLINE)
 + continue;
 + return false;
 + }
 +
 + return true;
 +}
Need a put_dev(mem-dev) for the last memory block device handled before 
return.

 +
  /*
   * register_memory - Setup a sysfs device for a memory block
   */
 Index: linux-3.5-rc4/include/linux/memory.h
 ===
 --- linux-3.5-rc4.orig/include/linux/memory.h 2012-06-25 04:53:04.0 
 +0900
 +++ linux-3.5-rc4/include/linux/memory.h  2012-06-26 13:34:22.424639891 
 +0900
 @@ -120,6 +120,7 @@ extern int memory_isolate_notify(unsigne
  extern struct memory_block *find_memory_block_hinted(struct mem_section *,
   struct memory_block *);
  extern struct memory_block *find_memory_block(struct mem_section *);
 +extern bool memory_is_offline(unsigned long start_pfn, unsigned long 
 end_pfn);
  #define CONFIG_MEM_BLOCK_SIZE(PAGES_PER_SECTIONPAGE_SHIFT)
  enum mem_add_context { BOOT, HOTPLUG };
  #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
 Index: linux-3.5-rc4/mm/memory_hotplug.c
 ===
 --- linux-3.5-rc4.orig/mm/memory_hotplug.c2012-06-26 13:28:16.743211538 
 +0900
 +++ linux-3.5-rc4/mm/memory_hotplug.c 2012-06-26 13:48:38.264940468 +0900
 @@ -887,6 +887,11 @@ static int __ref offline_pages(unsigned
 
   lock_memory_hotplug();
 
 + if (memory_is_offline(start_pfn, end_pfn)) {
 + ret = 0;
 + goto out;
 + }
 +
   zone = page_zone(pfn_to_page(start_pfn));
   node = zone_to_nid(zone);
   nr_pages = end_pfn - start_pfn;
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-acpi in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 2/12] memory-hogplug : check memory offline in offline_pages

2012-06-30 Thread Jiang Liu
On 06/27/2012 01:44 PM, Yasuaki Ishimatsu wrote:
 When offline_pages() is called to offlined memory, the function fails since
 all memory has been offlined. In this case, the function should succeed.
 The patch adds the check function into offline_pages().
 
 CC: Len Brown len.br...@intel.com
 CC: Benjamin Herrenschmidt b...@kernel.crashing.org
 CC: Paul Mackerras pau...@samba.org
 CC: Christoph Lameter c...@linux.com
 Cc: Minchan Kim minchan@gmail.com
 CC: Andrew Morton a...@linux-foundation.org
 CC: KOSAKI Motohiro kosaki.motoh...@jp.fujitsu.com
 CC: Wen Congyang we...@cn.fujitsu.com
 Signed-off-by: Yasuaki Ishimatsu isimatu.yasu...@jp.fujitsu.com
 
 ---
  drivers/base/memory.c  |   20 
  include/linux/memory.h |1 +
  mm/memory_hotplug.c|5 +
  3 files changed, 26 insertions(+)
 
 Index: linux-3.5-rc4/drivers/base/memory.c
 ===
 --- linux-3.5-rc4.orig/drivers/base/memory.c  2012-06-26 13:28:16.726211752 
 +0900
 +++ linux-3.5-rc4/drivers/base/memory.c   2012-06-26 13:34:22.423639904 
 +0900
 @@ -70,6 +70,26 @@ void unregister_memory_isolate_notifier(
  }
  EXPORT_SYMBOL(unregister_memory_isolate_notifier);
 
 +bool memory_is_offline(unsigned long start_pfn, unsigned long end_pfn)
 +{
 + struct memory_block *mem;
 + struct mem_section *section;
 + unsigned long pfn, section_nr;
 +
 + for (pfn = start_pfn; pfn  end_pfn; pfn += PAGES_PER_SECTION) {
 + section_nr = pfn_to_section_nr(pfn);
 + section = __nr_to_section(section_nr);
 + mem = find_memory_block(section);
Seems find_memory_block_hinted() is more efficient than find_memory_block() 
here.

 + if (!mem)
 + continue;
 + if (mem-state == MEM_OFFLINE)
 + continue;
 + return false;
 + }
 +
 + return true;
 +}
 +
  /*
   * register_memory - Setup a sysfs device for a memory block
   */
 Index: linux-3.5-rc4/include/linux/memory.h
 ===
 --- linux-3.5-rc4.orig/include/linux/memory.h 2012-06-25 04:53:04.0 
 +0900
 +++ linux-3.5-rc4/include/linux/memory.h  2012-06-26 13:34:22.424639891 
 +0900
 @@ -120,6 +120,7 @@ extern int memory_isolate_notify(unsigne
  extern struct memory_block *find_memory_block_hinted(struct mem_section *,
   struct memory_block *);
  extern struct memory_block *find_memory_block(struct mem_section *);
 +extern bool memory_is_offline(unsigned long start_pfn, unsigned long 
 end_pfn);
  #define CONFIG_MEM_BLOCK_SIZE(PAGES_PER_SECTIONPAGE_SHIFT)
  enum mem_add_context { BOOT, HOTPLUG };
  #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
 Index: linux-3.5-rc4/mm/memory_hotplug.c
 ===
 --- linux-3.5-rc4.orig/mm/memory_hotplug.c2012-06-26 13:28:16.743211538 
 +0900
 +++ linux-3.5-rc4/mm/memory_hotplug.c 2012-06-26 13:48:38.264940468 +0900
 @@ -887,6 +887,11 @@ static int __ref offline_pages(unsigned
 
   lock_memory_hotplug();
 
 + if (memory_is_offline(start_pfn, end_pfn)) {
 + ret = 0;
 + goto out;
 + }
 +
   zone = page_zone(pfn_to_page(start_pfn));
   node = zone_to_nid(zone);
   nr_pages = end_pfn - start_pfn;
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-acpi in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/12] memory-hotplug : free memmap of sparse-vmemmap

2012-06-30 Thread Jiang Liu
On 06/27/2012 01:56 PM, Yasuaki Ishimatsu wrote:
 I don't think that all pages of virtual mapping in removed memory can be
 freed, since page which type is MIX_SECTION_INFO is difficult to free.
 So, the patch only frees page which type is SECTION_INFO at first.
 
 CC: Len Brown len.br...@intel.com
 CC: Benjamin Herrenschmidt b...@kernel.crashing.org
 CC: Paul Mackerras pau...@samba.org
 CC: Christoph Lameter c...@linux.com
 Cc: Minchan Kim minchan@gmail.com
 CC: Andrew Morton a...@linux-foundation.org
 CC: KOSAKI Motohiro kosaki.motoh...@jp.fujitsu.com
 CC: Wen Congyang we...@cn.fujitsu.com
 Signed-off-by: Yasuaki Ishimatsu isimatu.yasu...@jp.fujitsu.com
 
 ---
  arch/x86/mm/init_64.c |   89 
 ++
  include/linux/mm.h|2 +
  mm/memory_hotplug.c   |5 ++
  mm/sparse.c   |5 +-
  4 files changed, 99 insertions(+), 2 deletions(-)
 
 Index: linux-3.5-rc4/include/linux/mm.h
 ===
 --- linux-3.5-rc4.orig/include/linux/mm.h 2012-06-27 09:11:13.790150442 
 +0900
 +++ linux-3.5-rc4/include/linux/mm.h  2012-06-27 09:11:16.433117400 +0900
 @@ -1588,6 +1588,8 @@ int vmemmap_populate(struct page *start_
  void vmemmap_populate_print_last(void);
  void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
 unsigned long size);
 +void vmemmap_kfree(struct page *memmpa, unsigned long nr_pages);
 +void vmemmap_free_bootmem(struct page *memmpa, unsigned long nr_pages);
 
  enum mf_flags {
   MF_COUNT_INCREASED = 1  0,
 Index: linux-3.5-rc4/mm/sparse.c
 ===
 --- linux-3.5-rc4.orig/mm/sparse.c2012-06-27 09:06:35.317631878 +0900
 +++ linux-3.5-rc4/mm/sparse.c 2012-06-27 09:11:16.434117388 +0900
 @@ -614,12 +614,13 @@ static inline struct page *kmalloc_secti
   /* This will make the necessary allocations eventually. */
   return sparse_mem_map_populate(pnum, nid);
  }
 -static void __kfree_section_memmap(struct page *memmap, unsigned long 
 nr_pages)
 +static void __kfree_section_memmap(struct page *page, unsigned long nr_pages)
  {
 - return; /* XXX: Not implemented yet */
 + vmemmap_kfree(page, nr_pages);
  }
  static void free_map_bootmem(struct page *page, unsigned long nr_pages)
  {
 + vmemmap_free_bootmem(page, nr_pages);
  }
  #else
  static struct page *__kmalloc_section_memmap(unsigned long nr_pages)
 Index: linux-3.5-rc4/arch/x86/mm/init_64.c
 ===
 --- linux-3.5-rc4.orig/arch/x86/mm/init_64.c  2012-06-27 09:11:13.791150430 
 +0900
 +++ linux-3.5-rc4/arch/x86/mm/init_64.c   2012-06-27 09:11:59.254581998 
 +0900
 @@ -978,6 +978,95 @@ vmemmap_populate(struct page *start_page
   return 0;
  }
 
 +unsigned long find_and_clear_pte_page(unsigned long addr, unsigned long end,
 +   struct page *page)
I think the third parameter should be struct page **pp instead of struct 
page *page.
And page = pte_page(*pte) should be *pp = pte_page(*pte).
Otherwise the found page pointer can't be returned to the caller and 
vmemmap_kfree()
just sees random value in variable page.

 +{
 + pgd_t *pgd;
 + pud_t *pud;
 + pmd_t *pmd;
 + pte_t *pte;
 + unsigned long next;
 +
 + page = NULL;
 +
 + pgd = pgd_offset_k(addr);
 + if (pgd_none(*pgd))
 + return PAGE_SIZE;
 +
 + pud = pud_offset(pgd, addr);
 + if (pud_none(*pud))
 + return PAGE_SIZE;
 +
 + if (!cpu_has_pse) {
 + next = (addr + PAGE_SIZE)  PAGE_MASK;
 + pmd = pmd_offset(pud, addr);
 + if (pmd_none(*pmd))
 + return next;
 +
 + pte = pte_offset_kernel(pmd, addr);
 + if (pte_none(*pte))
 + return next;
 +
 + page = pte_page(*pte);
 + pte_clear(init_mm, addr, pte);
 + } else {
 + next = pmd_addr_end(addr, end);
 +
 + pmd = pmd_offset(pud, addr);
 + if (pmd_none(*pmd))
 + return next;
 +
 + page = pmd_page(*pmd);
 + pmd_clear(pmd);
 + }
 +
 + return next;
 +}
 +
 +void __meminit
 +vmemmap_kfree(struct page *memmap, unsigned long nr_pages)
 +{
 + unsigned long addr = (unsigned long)memmap;
 + unsigned long end = (unsigned long)(memmap + nr_pages);
 + unsigned long next;
 + unsigned int order;
 + struct page *page;
 +
 + for (; addr  end; addr = next) {
 + next = find_and_clear_pte_page(addr, end, page);
 + if (!page)
 + continue;
 +
 + if (is_vmalloc_addr(page))
 + vfree(page);
 + else {
 + order = next - addr;
 + free_pages((unsigned long)page,
 +