From: Raghu Gandham <raghu@mips.com>
To: linux-mips@linux-mips.org
Cc: chris@mips.com
Subject: [PATCH 14/15] Avoid queing multiple reschedule IPI's in SMTC
Date: Wed, 01 Jul 2009 19:43:16 -0700 [thread overview]
Message-ID: <20090702024315.23268.65987.stgit@linux-raghu> (raw)
In-Reply-To: <20090702023938.23268.65453.stgit@linux-raghu>
From: Jaidev Patwardhan <jaidev@mips.com>
Signed-off-by: Chris Dearman <chris@mips.com>
---
arch/mips/include/asm/smtc_ipi.h | 5 +++--
arch/mips/kernel/smtc.c | 33 +++++++++++++++++++++++++++++----
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/arch/mips/include/asm/smtc_ipi.h b/arch/mips/include/asm/smtc_ipi.h
index 8ce5175..832b8be 100644
--- a/arch/mips/include/asm/smtc_ipi.h
+++ b/arch/mips/include/asm/smtc_ipi.h
@@ -23,8 +23,8 @@ struct smtc_ipi {
void *arg;
int dest;
#ifdef SMTC_IPI_DEBUG
- int sender;
- long stamp;
+ unsigned sender;
+ unsigned long long stamp;
#endif /* SMTC_IPI_DEBUG */
};
@@ -45,6 +45,7 @@ struct smtc_ipi_q {
spinlock_t lock;
struct smtc_ipi *tail;
int depth;
+ int resched_flag; /* reschedule already queued */
};
static inline void smtc_ipi_nq(struct smtc_ipi_q *q, struct smtc_ipi *p)
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c
index 8a0626c..69240c4 100644
--- a/arch/mips/kernel/smtc.c
+++ b/arch/mips/kernel/smtc.c
@@ -75,7 +75,6 @@ unsigned long irq_hwmask[NR_IRQS];
asiduse smtc_live_asid[MAX_SMTC_TLBS][MAX_SMTC_ASIDS];
-
/*
* Number of InterProcessor Interrupt (IPI) message buffers to allocate
*/
@@ -388,6 +387,7 @@ void smtc_prepare_cpus(int cpus)
IPIQ[i].head = IPIQ[i].tail = NULL;
spin_lock_init(&IPIQ[i].lock);
IPIQ[i].depth = 0;
+ IPIQ[i].resched_flag = 0; /* No reschedules queued initially */
}
/* cpu_data index starts at zero */
@@ -738,11 +738,24 @@ void smtc_forward_irq(unsigned int irq)
static void smtc_ipi_qdump(void)
{
int i;
+ struct smtc_ipi *temp;
for (i = 0; i < NR_CPUS ;i++) {
- printk("IPIQ[%d]: head = 0x%x, tail = 0x%x, depth = %d\n",
+ pr_info("IPIQ[%d]: head = 0x%x, tail = 0x%x, depth = %d\n",
i, (unsigned)IPIQ[i].head, (unsigned)IPIQ[i].tail,
IPIQ[i].depth);
+ temp = IPIQ[i].head;
+
+ while (temp != IPIQ[i].tail) {
+ pr_debug("%d %d %d: ", temp->type, temp->dest,
+ (int)temp->arg);
+#ifdef SMTC_IPI_DEBUG
+ pr_debug("%u %lu\n", temp->sender, temp->stamp);
+#else
+ pr_debug("\n");
+#endif
+ temp = temp->flink;
+ }
}
}
@@ -781,11 +794,15 @@ void smtc_send_ipi(int cpu, int type, unsigned int action)
int mtflags;
unsigned long tcrestart;
extern void r4k_wait_irqoff(void), __pastwait(void);
+ int set_resched_flag = (type == LINUX_SMP_IPI &&
+ action == SMP_RESCHEDULE_YOURSELF);
if (cpu == smp_processor_id()) {
printk("Cannot Send IPI to self!\n");
return;
}
+ if (set_resched_flag && IPIQ[cpu].resched_flag != 0)
+ return; /* There is a reschedule queued already */
/* Set up a descriptor, to be delivered either promptly or queued */
pipi = smtc_ipi_dq(&freeIPIq);
if (pipi == NULL) {
@@ -798,6 +815,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action)
pipi->dest = cpu;
if (cpu_data[cpu].vpe_id != cpu_data[smp_processor_id()].vpe_id) {
/* If not on same VPE, enqueue and send cross-VPE interrupt */
+ IPIQ[cpu].resched_flag |= set_resched_flag;
smtc_ipi_nq(&IPIQ[cpu], pipi);
LOCK_CORE_PRA();
settc(cpu_data[cpu].tc_id);
@@ -844,6 +862,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action)
*/
write_tc_c0_tchalt(0);
UNLOCK_CORE_PRA();
+ IPIQ[cpu].resched_flag |= set_resched_flag;
smtc_ipi_nq(&IPIQ[cpu], pipi);
} else {
postdirect:
@@ -993,12 +1012,15 @@ void deferred_smtc_ipi(void)
* already enabled.
*/
local_irq_save(flags);
-
spin_lock(&q->lock);
pipi = __smtc_ipi_dq(q);
spin_unlock(&q->lock);
- if (pipi != NULL)
+ if (pipi != NULL) {
+ if (pipi->type == LINUX_SMP_IPI &&
+ (int)pipi->arg == SMP_RESCHEDULE_YOURSELF)
+ IPIQ[q].resched_flag = 0;
ipi_decode(pipi);
+ }
/*
* The use of the __raw_local restore isn't
* as obviously necessary here as in smtc_ipi_replay(),
@@ -1079,6 +1101,9 @@ static irqreturn_t ipi_interrupt(int irq, void *dev_idm)
* with interrupts off
*/
local_irq_save(flags);
+ if (pipi->type == LINUX_SMP_IPI &&
+ (int)pipi->arg == SMP_RESCHEDULE_YOURSELF)
+ IPIQ[cpu].resched_flag = 0;
ipi_decode(pipi);
local_irq_restore(flags);
}
next prev parent reply other threads:[~2009-07-02 2:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-02 2:39 [PATCH 00/15] Port changes from linux-mti Raghu Gandham
2009-07-02 2:39 ` [PATCH 01/15] Due to some broken bitfiles, we can't trust IntCtl Raghu Gandham
2009-07-02 2:40 ` [PATCH 02/15] Fix absd emulation Raghu Gandham
2009-07-02 2:40 ` [PATCH 03/15] [MTI] Clean up SPRAM support a little Raghu Gandham
2009-07-02 2:40 ` [PATCH 04/15] Fix accesses to device registers on MIPS boards Raghu Gandham
2009-07-02 2:40 ` [PATCH 05/15] [MTI] MIPS secondary cache supports 64 byte line size Raghu Gandham
2009-07-02 2:41 ` [PATCH 06/15] [MTI] Enable PIIX4 PCI2.1 compliancy on Malta Raghu Gandham
2009-07-02 2:41 ` [PATCH 07/15] APRP Patch04: Propagate final value of max_low_pfn to max_pfn Raghu Gandham
2009-07-02 2:41 ` [PATCH 08/15] Fix compiler warning in vpe.c Raghu Gandham
2009-07-02 2:41 ` [PATCH 09/15] Add debug prints during CPU intialization Raghu Gandham
2009-07-02 2:42 ` [PATCH 10/15] Port of GIC related changes from MTI branch Raghu Gandham
2009-07-02 2:42 ` [PATCH 11/15] Add missing memory barriers for correct operation of amon_cpu_start Raghu Gandham
2009-07-02 2:42 ` [PATCH 12/15] Added coherentio command line option for DMA_NONCOHERENT kernel Raghu Gandham
2009-07-02 2:43 ` [PATCH 13/15] Avoid accessing GCMP registers when they are not present Raghu Gandham
2009-07-02 2:43 ` Raghu Gandham [this message]
2009-07-02 2:43 ` [PATCH 15/15] Do not rely on the initial state of TC/VPE bindings when doing cross VPE writes Raghu Gandham
2009-07-02 4:02 ` Kevin D. Kissell
2009-07-02 21:46 ` Gandham, Raghu
2009-07-02 21:46 ` Gandham, Raghu
2009-07-02 22:08 ` Kevin D. Kissell
2009-10-12 16:17 ` Ralf Baechle
2009-10-12 20:20 ` [PATCH 15/15] Do not rely on the initial state of TC/VPEbindings " Gandham, Raghu
2009-10-12 20:20 ` Gandham, Raghu
2009-10-12 20:25 ` Ralf Baechle
2009-07-10 8:47 ` [PATCH 00/15] Port changes from linux-mti Gandham, Raghu
2009-07-10 8:47 ` Gandham, Raghu
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=20090702024315.23268.65987.stgit@linux-raghu \
--to=raghu@mips.com \
--cc=chris@mips.com \
--cc=linux-mips@linux-mips.org \
/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.