All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org,
	linux-rt-users <linux-rt-users@vger.kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Carsten Emde <C.Emde@osadl.org>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	John Kacur <jkacur@redhat.com>,
	Paul Gortmaker <paul.gortmaker@windriver.com>,
	Julia Cartwright <julia@ni.com>,
	Daniel Wagner <daniel.wagner@siemens.com>,
	tom.zanussi@linux.intel.com
Subject: [PATCH RT 12/24] irqchip/gic-v3-its: Move ITS ->pend_page allocation into an early CPU up hook
Date: Fri, 07 Sep 2018 16:59:09 -0400	[thread overview]
Message-ID: <20180907205931.634338824@goodmis.org> (raw)
In-Reply-To: 20180907205857.262840394@goodmis.org

4.14.63-rt41-rc2 stable review patch.
If anyone has any objections, please let me know.

------------------

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

[ Upstream commit e083f14dc2e98ced872bf077b4d1cccf95b7e4f8 ]

The AP-GIC-starting hook allocates memory for the ->pend_page while the
CPU is started during boot-up. This callback is invoked on the target
CPU with disabled interrupts.
This does not work on -RT beacuse memory allocations are not possible
with disabled interrupts.
Move the memory allocation to an earlier hotplug step which invoked with
enabled interrupts on the boot CPU.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 drivers/irqchip/irq-gic-v3-its.c | 60 ++++++++++++++++++++++----------
 1 file changed, 41 insertions(+), 19 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index e8217ebe8c1e..60533a795124 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -165,6 +165,7 @@ static DEFINE_RAW_SPINLOCK(vmovp_lock);
 static DEFINE_IDA(its_vpeid_ida);
 
 #define gic_data_rdist()		(raw_cpu_ptr(gic_rdists->rdist))
+#define gic_data_rdist_cpu(cpu)		(per_cpu_ptr(gic_rdists->rdist, cpu))
 #define gic_data_rdist_rd_base()	(gic_data_rdist()->rd_base)
 #define gic_data_rdist_vlpi_base()	(gic_data_rdist_rd_base() + SZ_128K)
 
@@ -1734,15 +1735,17 @@ static int its_alloc_collections(struct its_node *its)
 	return 0;
 }
 
-static struct page *its_allocate_pending_table(gfp_t gfp_flags)
+static struct page *its_allocate_pending_table(unsigned int cpu)
 {
 	struct page *pend_page;
+	unsigned int order;
 	/*
 	 * The pending pages have to be at least 64kB aligned,
 	 * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below.
 	 */
-	pend_page = alloc_pages(gfp_flags | __GFP_ZERO,
-				get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
+	order = get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K));
+	pend_page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL | __GFP_ZERO,
+				     order);
 	if (!pend_page)
 		return NULL;
 
@@ -1758,6 +1761,28 @@ static void its_free_pending_table(struct page *pt)
 		   get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
 }
 
+static int its_alloc_pend_page(unsigned int cpu)
+{
+	struct page *pend_page;
+	phys_addr_t paddr;
+
+	pend_page = gic_data_rdist_cpu(cpu)->pend_page;
+	if (pend_page)
+		return 0;
+
+	pend_page = its_allocate_pending_table(cpu);
+	if (!pend_page) {
+		pr_err("Failed to allocate PENDBASE for CPU%d\n",
+		       smp_processor_id());
+		return -ENOMEM;
+	}
+
+	paddr = page_to_phys(pend_page);
+	pr_info("CPU%d: using LPI pending table @%pa\n", cpu, &paddr);
+	gic_data_rdist_cpu(cpu)->pend_page = pend_page;
+	return 0;
+}
+
 static void its_cpu_init_lpis(void)
 {
 	void __iomem *rbase = gic_data_rdist_rd_base();
@@ -1766,21 +1791,8 @@ static void its_cpu_init_lpis(void)
 
 	/* If we didn't allocate the pending table yet, do it now */
 	pend_page = gic_data_rdist()->pend_page;
-	if (!pend_page) {
-		phys_addr_t paddr;
-
-		pend_page = its_allocate_pending_table(GFP_NOWAIT);
-		if (!pend_page) {
-			pr_err("Failed to allocate PENDBASE for CPU%d\n",
-			       smp_processor_id());
-			return;
-		}
-
-		paddr = page_to_phys(pend_page);
-		pr_info("CPU%d: using LPI pending table @%pa\n",
-			smp_processor_id(), &paddr);
-		gic_data_rdist()->pend_page = pend_page;
-	}
+	if (!pend_page)
+		return;
 
 	/* Disable LPIs */
 	val = readl_relaxed(rbase + GICR_CTLR);
@@ -2599,7 +2611,7 @@ static int its_vpe_init(struct its_vpe *vpe)
 		return vpe_id;
 
 	/* Allocate VPT */
-	vpt_page = its_allocate_pending_table(GFP_KERNEL);
+	vpt_page = its_allocate_pending_table(raw_smp_processor_id());
 	if (!vpt_page) {
 		its_vpe_id_free(vpe_id);
 		return -ENOMEM;
@@ -3282,6 +3294,16 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists,
 	if (err)
 		return err;
 
+	err = cpuhp_setup_state(CPUHP_BP_PREPARE_DYN, "irqchip/arm/gicv3:prepare",
+				its_alloc_pend_page, NULL);
+	if (err < 0) {
+		pr_warn("ITS: Can't register CPU-hoplug callback.\n");
+		return err;
+	}
+	err = its_alloc_pend_page(smp_processor_id());
+	if (err < 0)
+		return err;
+
 	list_for_each_entry(its, &its_nodes, entry)
 		has_v4 |= its->is_v4;
 
-- 
2.18.0

  parent reply	other threads:[~2018-09-07 20:59 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-07 20:58 [PATCH RT 00/24] Linux 4.14.63-rt41-rc2 Steven Rostedt
2018-09-07 20:58 ` [PATCH RT 01/24] sched/fair: Fix CFS bandwidth control lockdep DEADLOCK report Steven Rostedt
2018-09-07 20:58 ` [PATCH RT 02/24] locallock: provide {get,put}_locked_ptr() variants Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 03/24] squashfs: make use of local lock in multi_cpu decompressor Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 04/24] PM / suspend: Prevent might sleep splats (updated) Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 05/24] PM / wakeup: Make events_lock a RAW_SPINLOCK Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 06/24] PM / s2idle: Make s2idle_wait_head swait based Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 07/24] seqlock: provide the same ordering semantics as mainline Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 08/24] Revert "x86: UV: raw_spinlock conversion" Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 09/24] Revert "timer: delay waking softirqs from the jiffy tick" Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 10/24] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 11/24] sched/migrate_disable: fallback to preempt_disable() instead barrier() Steven Rostedt
2018-09-07 20:59 ` Steven Rostedt [this message]
2018-09-07 20:59 ` [PATCH RT 13/24] irqchip/gic-v3-its: Move pending table allocation to init time Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 14/24] x86/ioapic: Dont let setaffinity unmask threaded EOI interrupt too early Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 15/24] efi: Allow efi=runtime Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 16/24] efi: Disable runtime services on RT Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 17/24] crypto: cryptd - add a lock instead preempt_disable/local_bh_disable Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 18/24] crypto: scompress - serialize RT percpu scratch buffer access with a local lock Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 19/24] sched/core: Avoid __schedule() being called twice in a row Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 20/24] Revert "arm64/xen: Make XEN depend on !RT" Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 21/24] sched: Allow pinned user tasks to be awakened to the CPU they pinned Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 23/24] Revert "softirq: keep the softirq pending check RT-only" Steven Rostedt
2018-09-07 20:59 ` [PATCH RT 24/24] Linux 4.14.63-rt41-rc2 Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180907205931.634338824@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=C.Emde@osadl.org \
    --cc=bigeasy@linutronix.de \
    --cc=daniel.wagner@siemens.com \
    --cc=jkacur@redhat.com \
    --cc=julia@ni.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=paul.gortmaker@windriver.com \
    --cc=tglx@linutronix.de \
    --cc=tom.zanussi@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.