linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Mohan Kumar M <mohan@in.ibm.com>
To: linuxppc-dev@ozlabs.org, fastboot@lists.osdl.org
Cc: paulus@samba.org, anton@samba.org
Subject: [PATCH] Avoid hypervisor statistics calculation in real mode
Date: Tue, 20 Mar 2007 19:05:47 +0530	[thread overview]
Message-ID: <20070320133547.GA4191@in.ibm.com> (raw)

kexec invokes plpar_hcall hypervisor call in real mode. plpar_hcall
refers per cpu variable for accounting hypervisor statistics. These
variables may not be present in the RMO region. So it results in
0x300 exception.

The following patch fixes this problem by using raw hypervisor call
which does not update the hypervisor call statistics. Thanks to Anton
for suggesting this idea.

Cc: Anton Blanchard <anton@samba.org>
Signed-off-by: Mohan Kumar M <mohan@in.ibm.com>
---
 arch/powerpc/platforms/pseries/hvCall.S         |   34 ++++++++++++++++++++++++
 arch/powerpc/platforms/pseries/lpar.c           |    2 -
 arch/powerpc/platforms/pseries/plpar_wrappers.h |   19 +++++++++++++
 include/asm-powerpc/hvcall.h                    |   15 ++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

Index: linux-2.6.21-rc4/arch/powerpc/platforms/pseries/hvCall.S
===================================================================
--- linux-2.6.21-rc4.orig/arch/powerpc/platforms/pseries/hvCall.S
+++ linux-2.6.21-rc4/arch/powerpc/platforms/pseries/hvCall.S
@@ -123,6 +123,40 @@ _GLOBAL(plpar_hcall)
 
 	blr				/* return r3 = status */
 
+
+/* plpar_hcall_raw can be called in real mode. kexec/kdump need some
+ * hypervisor calls to be executed in real mode. So plpar_hcall_raw
+ * does not access the per cpu hypervisor call statistics variables,
+ * since these variables may not be present in the RMO region.
+ */
+_GLOBAL(plpar_hcall_raw)
+	HMT_MEDIUM
+
+	mfcr	r0
+	stw	r0,8(r1)
+
+	std     r4,STK_PARM(r4)(r1)     /* Save ret buffer */
+
+	mr	r4,r5
+	mr	r5,r6
+	mr	r6,r7
+	mr	r7,r8
+	mr	r8,r9
+	mr	r9,r10
+
+	HVSC				/* invoke the hypervisor */
+
+	ld	r12,STK_PARM(r4)(r1)
+	std	r4,  0(r12)
+	std	r5,  8(r12)
+	std	r6, 16(r12)
+	std	r7, 24(r12)
+
+	lwz	r0,8(r1)
+	mtcrf	0xff,r0
+
+	blr				/* return r3 = status */
+
 _GLOBAL(plpar_hcall9)
 	HMT_MEDIUM
 
Index: linux-2.6.21-rc4/arch/powerpc/platforms/pseries/lpar.c
===================================================================
--- linux-2.6.21-rc4.orig/arch/powerpc/platforms/pseries/lpar.c
+++ linux-2.6.21-rc4/arch/powerpc/platforms/pseries/lpar.c
@@ -378,7 +378,7 @@ static void pSeries_lpar_hptab_clear(voi
 
 	/* TODO: Use bulk call */
 	for (i = 0; i < hpte_count; i++)
-		plpar_pte_remove(0, i, 0, &dummy1, &dummy2);
+		plpar_pte_remove_raw(0, i, 0, &dummy1, &dummy2);
 }
 
 /*
Index: linux-2.6.21-rc4/arch/powerpc/platforms/pseries/plpar_wrappers.h
===================================================================
--- linux-2.6.21-rc4.orig/arch/powerpc/platforms/pseries/plpar_wrappers.h
+++ linux-2.6.21-rc4/arch/powerpc/platforms/pseries/plpar_wrappers.h
@@ -78,6 +78,25 @@ static inline long plpar_pte_remove(unsi
 	return rc;
 }
 
+
+/* plpar_pte_remove_raw can be called in real mode.
+ * It calls plpar_hcall_raw.
+ */
+static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,
+		unsigned long avpn, unsigned long *old_pteh_ret,
+		unsigned long *old_ptel_ret)
+{
+	long rc;
+	unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+	rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);
+
+	*old_pteh_ret = retbuf[0];
+	*old_ptel_ret = retbuf[1];
+
+	return rc;
+}
+
 static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
 		unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
 {
Index: linux-2.6.21-rc4/include/asm-powerpc/hvcall.h
===================================================================
--- linux-2.6.21-rc4.orig/include/asm-powerpc/hvcall.h
+++ linux-2.6.21-rc4/include/asm-powerpc/hvcall.h
@@ -237,6 +237,21 @@ long plpar_hcall_norets(unsigned long op
 long plpar_hcall(unsigned long opcode, unsigned long *retbuf, ...);
 
 /**
+ * plpar_hcall_raw: - Make a pseries hypervisor call, but don't calculate
+ * hypervisor call statistics.
+ * @opcode: The hypervisor call to make.
+ * @retbuf: Buffer to store up to 4 return arguments in.
+ *
+ * This call supports up to 6 arguments and 4 return arguments. Use
+ * PLPAR_HCALL_BUFSIZE to size the return argument buffer.
+ *
+ * Used when phyp interface needs to be called in real mode. Similar to
+ * plpar_hcall, but plpar_hcall_raw works in real mode and does not
+ * calculate hypervisor call statistics.
+ */
+long plpar_hcall_raw(unsigned long opcode, unsigned long *retbuf, ...);
+
+/**
  * plpar_hcall9: - Make a pseries hypervisor call with up to 9 return arguments
  * @opcode: The hypervisor call to make.
  * @retbuf: Buffer to store up to 9 return arguments in.

             reply	other threads:[~2007-03-20 13:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-20 13:35 Mohan Kumar M [this message]
2007-03-20 22:37 ` [Fastboot] [PATCH] Avoid hypervisor statistics calculation in real mode Randy Dunlap
2007-03-21  5:51   ` Mohan Kumar M
2007-03-21 15:30     ` Randy Dunlap
2007-03-23  6:18     ` Horms

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=20070320133547.GA4191@in.ibm.com \
    --to=mohan@in.ibm.com \
    --cc=anton@samba.org \
    --cc=fastboot@lists.osdl.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=paulus@samba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).