* [PATCH v3 0/2] powerpc rng cleanups
@ 2022-06-30 14:01 Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-06-30 14:01 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp; +Cc: Jason A. Donenfeld
These are two small cleanups for -next.
I'm sending this v3 because very likely
https://lore.kernel.org/all/20220630121654.1939181-1-Jason@zx2c4.com/
will land first, in which case this needs a small adjustment.
Jason A. Donenfeld (2):
powerpc/powernv: rename remaining rng powernv_ functions to pnv_
powerpc/kvm: don't crash on missing rng, and use darn
arch/powerpc/include/asm/archrandom.h | 7 +--
arch/powerpc/kvm/book3s_hv_builtin.c | 7 +--
arch/powerpc/platforms/powernv/rng.c | 65 ++++++++++-----------------
drivers/char/hw_random/powernv-rng.c | 2 +-
4 files changed, 30 insertions(+), 51 deletions(-)
--
2.35.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_
2022-06-30 14:01 [PATCH v3 0/2] powerpc rng cleanups Jason A. Donenfeld
@ 2022-06-30 14:01 ` Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 2/2] powerpc/kvm: don't crash on missing rng, and use darn Jason A. Donenfeld
2022-06-30 16:11 ` [PATCH v3 0/2] powerpc rng cleanups Sachin Sant
2 siblings, 0 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-06-30 14:01 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp; +Cc: Jason A. Donenfeld
The preferred nomenclature is pnv_, not powernv_, but rng.c used
powernv_ for some reason, which isn't consistent with the rest. A recent
commit added a few pnv_ functions to rng.c, making the file a bit of a
mishmash. This commit just replaces the rest of them.
Cc: Michael Ellerman <mpe@ellerman.id.au>
Fixes: f3eac426657 ("powerpc/powernv: wire up rng during setup_arch")
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
---
arch/powerpc/include/asm/archrandom.h | 10 +++---
arch/powerpc/kvm/book3s_hv_builtin.c | 4 +--
arch/powerpc/platforms/powernv/rng.c | 44 +++++++++++++--------------
drivers/char/hw_random/powernv-rng.c | 2 +-
4 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h
index 9a53e29680f4..11d4815841ab 100644
--- a/arch/powerpc/include/asm/archrandom.h
+++ b/arch/powerpc/include/asm/archrandom.h
@@ -38,12 +38,12 @@ static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
#endif /* CONFIG_ARCH_RANDOM */
#ifdef CONFIG_PPC_POWERNV
-int powernv_hwrng_present(void);
-int powernv_get_random_long(unsigned long *v);
-int powernv_get_random_real_mode(unsigned long *v);
+int pnv_hwrng_present(void);
+int pnv_get_random_long(unsigned long *v);
+int pnv_get_random_real_mode(unsigned long *v);
#else
-static inline int powernv_hwrng_present(void) { return 0; }
-static inline int powernv_get_random_real_mode(unsigned long *v) { return 0; }
+static inline int pnv_hwrng_present(void) { return 0; }
+static inline int pnv_get_random_real_mode(unsigned long *v) { return 0; }
#endif
#endif /* _ASM_POWERPC_ARCHRANDOM_H */
diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c
index 88a8f6473c4e..799d40c2ab4f 100644
--- a/arch/powerpc/kvm/book3s_hv_builtin.c
+++ b/arch/powerpc/kvm/book3s_hv_builtin.c
@@ -176,13 +176,13 @@ EXPORT_SYMBOL_GPL(kvmppc_hcall_impl_hv_realmode);
int kvmppc_hwrng_present(void)
{
- return powernv_hwrng_present();
+ return pnv_hwrng_present();
}
EXPORT_SYMBOL_GPL(kvmppc_hwrng_present);
long kvmppc_rm_h_random(struct kvm_vcpu *vcpu)
{
- if (powernv_get_random_real_mode(&vcpu->arch.regs.gpr[4]))
+ if (pnv_get_random_real_mode(&vcpu->arch.regs.gpr[4]))
return H_SUCCESS;
return H_HARDWARE;
diff --git a/arch/powerpc/platforms/powernv/rng.c b/arch/powerpc/platforms/powernv/rng.c
index bd5ad5f351c2..386b44660e76 100644
--- a/arch/powerpc/platforms/powernv/rng.c
+++ b/arch/powerpc/platforms/powernv/rng.c
@@ -21,24 +21,24 @@
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
-struct powernv_rng {
+struct pnv_rng {
void __iomem *regs;
void __iomem *regs_real;
unsigned long mask;
};
-static DEFINE_PER_CPU(struct powernv_rng *, powernv_rng);
+static DEFINE_PER_CPU(struct pnv_rng *, pnv_rng);
-int powernv_hwrng_present(void)
+int pnv_hwrng_present(void)
{
- struct powernv_rng *rng;
+ struct pnv_rng *rng;
- rng = get_cpu_var(powernv_rng);
+ rng = get_cpu_var(pnv_rng);
put_cpu_var(rng);
return rng != NULL;
}
-static unsigned long rng_whiten(struct powernv_rng *rng, unsigned long val)
+static unsigned long rng_whiten(struct pnv_rng *rng, unsigned long val)
{
unsigned long parity;
@@ -58,18 +58,18 @@ static unsigned long rng_whiten(struct powernv_rng *rng, unsigned long val)
return val;
}
-int powernv_get_random_real_mode(unsigned long *v)
+int pnv_get_random_real_mode(unsigned long *v)
{
- struct powernv_rng *rng;
+ struct pnv_rng *rng;
- rng = raw_cpu_read(powernv_rng);
+ rng = raw_cpu_read(pnv_rng);
*v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
return 1;
}
-static int powernv_get_random_darn(unsigned long *v)
+static int pnv_get_random_darn(unsigned long *v)
{
unsigned long val;
@@ -93,19 +93,19 @@ static int __init initialise_darn(void)
return -ENODEV;
for (i = 0; i < 10; i++) {
- if (powernv_get_random_darn(&val)) {
- ppc_md.get_random_seed = powernv_get_random_darn;
+ if (pnv_get_random_darn(&val)) {
+ ppc_md.get_random_seed = pnv_get_random_darn;
return 0;
}
}
return -EIO;
}
-int powernv_get_random_long(unsigned long *v)
+int pnv_get_random_long(unsigned long *v)
{
- struct powernv_rng *rng;
+ struct pnv_rng *rng;
- rng = get_cpu_var(powernv_rng);
+ rng = get_cpu_var(pnv_rng);
*v = rng_whiten(rng, in_be64(rng->regs));
@@ -113,9 +113,9 @@ int powernv_get_random_long(unsigned long *v)
return 1;
}
-EXPORT_SYMBOL_GPL(powernv_get_random_long);
+EXPORT_SYMBOL_GPL(pnv_get_random_long);
-static __init void rng_init_per_cpu(struct powernv_rng *rng,
+static __init void rng_init_per_cpu(struct pnv_rng *rng,
struct device_node *dn)
{
int chip_id, cpu;
@@ -125,16 +125,16 @@ static __init void rng_init_per_cpu(struct powernv_rng *rng,
pr_warn("No ibm,chip-id found for %pOF.\n", dn);
for_each_possible_cpu(cpu) {
- if (per_cpu(powernv_rng, cpu) == NULL ||
+ if (per_cpu(pnv_rng, cpu) == NULL ||
cpu_to_chip_id(cpu) == chip_id) {
- per_cpu(powernv_rng, cpu) = rng;
+ per_cpu(pnv_rng, cpu) = rng;
}
}
}
static __init int rng_create(struct device_node *dn)
{
- struct powernv_rng *rng;
+ struct pnv_rng *rng;
struct resource res;
unsigned long val;
@@ -160,7 +160,7 @@ static __init int rng_create(struct device_node *dn)
rng_init_per_cpu(rng, dn);
- ppc_md.get_random_seed = powernv_get_random_long;
+ ppc_md.get_random_seed = pnv_get_random_long;
return 0;
}
@@ -207,7 +207,7 @@ static int __init pnv_rng_late_init(void)
/* In case it wasn't called during init for some other reason. */
if (ppc_md.get_random_seed == pnv_get_random_long_early)
pnv_get_random_long_early(&v);
- if (ppc_md.get_random_seed == powernv_get_random_long) {
+ if (ppc_md.get_random_seed == pnv_get_random_long) {
for_each_compatible_node(dn, NULL, "ibm,power-rng")
of_platform_device_create(dn, NULL, NULL);
}
diff --git a/drivers/char/hw_random/powernv-rng.c b/drivers/char/hw_random/powernv-rng.c
index 8da1d7917bdc..429e956f34e1 100644
--- a/drivers/char/hw_random/powernv-rng.c
+++ b/drivers/char/hw_random/powernv-rng.c
@@ -23,7 +23,7 @@ static int powernv_rng_read(struct hwrng *rng, void *data, size_t max, bool wait
buf = (unsigned long *)data;
for (i = 0; i < len; i++)
- powernv_get_random_long(buf++);
+ pnv_get_random_long(buf++);
return len * sizeof(unsigned long);
}
--
2.35.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/2] powerpc/kvm: don't crash on missing rng, and use darn
2022-06-30 14:01 [PATCH v3 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
@ 2022-06-30 14:01 ` Jason A. Donenfeld
2022-06-30 16:11 ` [PATCH v3 0/2] powerpc rng cleanups Sachin Sant
2 siblings, 0 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-06-30 14:01 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp; +Cc: Jason A. Donenfeld, stable
On POWER8 systems that don't have ibm,power-rng available, a guest that
ignores the KVM_CAP_PPC_HWRNG flag and calls H_RANDOM anyway will
dereference a NULL pointer. And on machines with darn instead of
ibm,power-rng, H_RANDOM won't work at all.
This patch kills two birds with one stone, by routing H_RANDOM calls to
ppc_md.get_random_seed, and doing the real mode check inside of it.
Cc: stable@vger.kernel.org # v4.1+
Cc: Michael Ellerman <mpe@ellerman.id.au>
Fixes: e928e9cb3601 ("KVM: PPC: Book3S HV: Add fast real-mode H_RANDOM implementation.")
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
---
arch/powerpc/include/asm/archrandom.h | 5 ----
arch/powerpc/kvm/book3s_hv_builtin.c | 7 +++---
arch/powerpc/platforms/powernv/rng.c | 33 +++++++--------------------
3 files changed, 12 insertions(+), 33 deletions(-)
diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h
index 11d4815841ab..3af27bb84a3d 100644
--- a/arch/powerpc/include/asm/archrandom.h
+++ b/arch/powerpc/include/asm/archrandom.h
@@ -38,12 +38,7 @@ static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
#endif /* CONFIG_ARCH_RANDOM */
#ifdef CONFIG_PPC_POWERNV
-int pnv_hwrng_present(void);
int pnv_get_random_long(unsigned long *v);
-int pnv_get_random_real_mode(unsigned long *v);
-#else
-static inline int pnv_hwrng_present(void) { return 0; }
-static inline int pnv_get_random_real_mode(unsigned long *v) { return 0; }
#endif
#endif /* _ASM_POWERPC_ARCHRANDOM_H */
diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c
index 799d40c2ab4f..3abaef5f9ac2 100644
--- a/arch/powerpc/kvm/book3s_hv_builtin.c
+++ b/arch/powerpc/kvm/book3s_hv_builtin.c
@@ -19,7 +19,7 @@
#include <asm/interrupt.h>
#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>
-#include <asm/archrandom.h>
+#include <asm/machdep.h>
#include <asm/xics.h>
#include <asm/xive.h>
#include <asm/dbell.h>
@@ -176,13 +176,14 @@ EXPORT_SYMBOL_GPL(kvmppc_hcall_impl_hv_realmode);
int kvmppc_hwrng_present(void)
{
- return pnv_hwrng_present();
+ return ppc_md.get_random_seed != NULL;
}
EXPORT_SYMBOL_GPL(kvmppc_hwrng_present);
long kvmppc_rm_h_random(struct kvm_vcpu *vcpu)
{
- if (pnv_get_random_real_mode(&vcpu->arch.regs.gpr[4]))
+ if (ppc_md.get_random_seed &&
+ ppc_md.get_random_seed(&vcpu->arch.regs.gpr[4]))
return H_SUCCESS;
return H_HARDWARE;
diff --git a/arch/powerpc/platforms/powernv/rng.c b/arch/powerpc/platforms/powernv/rng.c
index 386b44660e76..4a48566528c0 100644
--- a/arch/powerpc/platforms/powernv/rng.c
+++ b/arch/powerpc/platforms/powernv/rng.c
@@ -29,15 +29,6 @@ struct pnv_rng {
static DEFINE_PER_CPU(struct pnv_rng *, pnv_rng);
-int pnv_hwrng_present(void)
-{
- struct pnv_rng *rng;
-
- rng = get_cpu_var(pnv_rng);
- put_cpu_var(rng);
- return rng != NULL;
-}
-
static unsigned long rng_whiten(struct pnv_rng *rng, unsigned long val)
{
unsigned long parity;
@@ -58,17 +49,6 @@ static unsigned long rng_whiten(struct pnv_rng *rng, unsigned long val)
return val;
}
-int pnv_get_random_real_mode(unsigned long *v)
-{
- struct pnv_rng *rng;
-
- rng = raw_cpu_read(pnv_rng);
-
- *v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
-
- return 1;
-}
-
static int pnv_get_random_darn(unsigned long *v)
{
unsigned long val;
@@ -105,11 +85,14 @@ int pnv_get_random_long(unsigned long *v)
{
struct pnv_rng *rng;
- rng = get_cpu_var(pnv_rng);
-
- *v = rng_whiten(rng, in_be64(rng->regs));
-
- put_cpu_var(rng);
+ if (mfmsr() & MSR_DR) {
+ rng = raw_cpu_read(pnv_rng);
+ *v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
+ } else {
+ rng = get_cpu_var(pnv_rng);
+ *v = rng_whiten(rng, in_be64(rng->regs));
+ put_cpu_var(rng);
+ }
return 1;
}
--
2.35.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/2] powerpc rng cleanups
2022-06-30 14:01 [PATCH v3 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 2/2] powerpc/kvm: don't crash on missing rng, and use darn Jason A. Donenfeld
@ 2022-06-30 16:11 ` Sachin Sant
2022-06-30 16:46 ` Jason A. Donenfeld
2 siblings, 1 reply; 7+ messages in thread
From: Sachin Sant @ 2022-06-30 16:11 UTC (permalink / raw)
To: Jason A. Donenfeld; +Cc: linuxppc-dev
> On 30-Jun-2022, at 7:31 PM, Jason A. Donenfeld <Jason@zx2c4.com> wrote:
>
> These are two small cleanups for -next.
>
> I'm sending this v3 because very likely
> https://lore.kernel.org/all/20220630121654.1939181-1-Jason@zx2c4.com/
> will land first, in which case this needs a small adjustment.
>
> Jason A. Donenfeld (2):
> powerpc/powernv: rename remaining rng powernv_ functions to pnv_
> powerpc/kvm: don't crash on missing rng, and use darn
>
> arch/powerpc/include/asm/archrandom.h | 7 +--
> arch/powerpc/kvm/book3s_hv_builtin.c | 7 +--
> arch/powerpc/platforms/powernv/rng.c | 65 ++++++++++-----------------
> drivers/char/hw_random/powernv-rng.c | 2 +-
> 4 files changed, 30 insertions(+), 51 deletions(-)
>
I tried these 2 patches + previous one (to fix kobject warning) on
top of 5.19.0-rc4-next-20220630 next on a Power8 server.
5.19.0-rc4-next-20220630 +
powerpc/powernv: delay rng of node creation until later in boot +
powerpc/powernv: rename remaining rng powernv_ functions to pnv_ +
powerpc/kvm: don't crash on missing rng, and use darn
Unfortunately it fails to boot with following crash
[ 0.000000] ftrace: allocated 13 pages with 3 groups
[ 0.000000] trace event string verifier disabled
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=2048 to nr_cpu_ids=80.
[ 0.000000] Rude variant of Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=80
[ 0.000000] NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16
[ 0.000000] ICS OPAL backend registered
[ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.000001] clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x761537d007, max_idle_ns: 440795202126 ns
[ 0.000182] clocksource: timebase mult[1f40000] shift[24] registered
[ 0.001905] BUG: Unable to handle kernel data access on read at 0x3ffff40000000
[ 0.002032] Faulting instruction address: 0xc0000000000d7990
[ 0.002132] Oops: Kernel access of bad area, sig: 7 [#1]
[ 0.002226] LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA PowerNV
[ 0.002338] Modules linked in:
[ 0.002396] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.19.0-rc4-next-20220630-dirty #20
[ 0.002539] NIP: c0000000000d7990 LR: c00000000201fa74 CTR: c0000000000d7960
[ 0.002663] REGS: c000000002a0fa60 TRAP: 0300 Not tainted (5.19.0-rc4-next-20220630-dirty)
[ 0.002812] MSR: 9000000002001033 <SF,HV,VEC,ME,IR,DR,RI,LE> CR: 44000228 XER: 20000000
[ 0.002979] CFAR: c00000000201fa70 DAR: 0003ffff40000000 DSISR: 00000002 IRQMASK: 1
[ 0.002979] GPR00: c00000000201fa74 c000000002a0fd00 c000000002a12000 c000000002a0fe90
[ 0.002979] GPR04: 0000000000000001 0000000000000000 c000000000deb578 000000000000006f
[ 0.002979] GPR08: 0000000000000000 0003ffff40000000 c000000007040080 0000000000000000
[ 0.002979] GPR12: c0000000000d7960 c000000002d00000 0000000000000003 0000000000000000
[ 0.002979] GPR16: 0000000000000000 0000000000000000 0000000000000278 c000000002a4dfe0
[ 0.002979] GPR20: c000000002a52238 c000000002a52820 c0000000000d7960 c000000000fe6c50
[ 0.002979] GPR24: 0000000000000001 c000000002a0fe90 c000000000fe6c40 c000000002141ff8
[ 0.002979] GPR28: 0000000000000800 c0000000070400a0 c000000002ab0150 0000000000000000
[ 0.004279] NIP [c0000000000d7990] pnv_get_random_long+0x30/0xd0
[ 0.004390] LR [c00000000201fa74] pnv_get_random_long_early+0x268/0x2d0
[ 0.004509] Call Trace:
[ 0.004553] [c000000002a0fd00] [c00000000201fa4c] pnv_get_random_long_early+0x240/0x2d0 (unreliable)
[ 0.004718] [c000000002a0fe20] [c000000002060d5c] random_init+0xc0/0x214
[ 0.004844] [c000000002a0fec0] [c0000000020048c0] start_kernel+0x990/0xbf8
[ 0.004972] [c000000002a0ff90] [c00000000000d878] start_here_common+0x1c/0x24
[ 0.005102] Instruction dump:
[ 0.005156] 3c4c0294 3842a6a0 7c0802a6 60000000 7d2000a6 71290010 41820048 e94d0030
[ 0.005309] 3d22ff73 3929fff8 7d4a482a e92a0008 <7d204eea> e8ea0010 7d2803f4 7ce94a78
[ 0.005465] ---[ end trace 0000000000000000 ]---
[ 0.005545]
[ 1.005574] Kernel panic - not syncing: Fatal exception
[ 1.005671] Rebooting in 10 seconds..
Reverting powerpc/kvm: don't crash on missing rng, and use darn helps to boot
the server successfully.
Thanks
-Sachin
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/2] powerpc rng cleanups
2022-06-30 16:11 ` [PATCH v3 0/2] powerpc rng cleanups Sachin Sant
@ 2022-06-30 16:46 ` Jason A. Donenfeld
2022-07-01 7:24 ` Christophe Leroy
0 siblings, 1 reply; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-06-30 16:46 UTC (permalink / raw)
To: Sachin Sant; +Cc: linuxppc-dev
Hi Sachin, Michael,
On Thu, Jun 30, 2022 at 6:12 PM Sachin Sant <sachinp@linux.ibm.com> wrote:
> > On 30-Jun-2022, at 7:31 PM, Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> >
> > These are two small cleanups for -next.
> >
> > I'm sending this v3 because very likely
> > https://lore.kernel.org/all/20220630121654.1939181-1-Jason@zx2c4.com/
> > will land first, in which case this needs a small adjustment.
> >
> > Jason A. Donenfeld (2):
> > powerpc/powernv: rename remaining rng powernv_ functions to pnv_
> > powerpc/kvm: don't crash on missing rng, and use darn
> >
> > arch/powerpc/include/asm/archrandom.h | 7 +--
> > arch/powerpc/kvm/book3s_hv_builtin.c | 7 +--
> > arch/powerpc/platforms/powernv/rng.c | 65 ++++++++++-----------------
> > drivers/char/hw_random/powernv-rng.c | 2 +-
> > 4 files changed, 30 insertions(+), 51 deletions(-)
> >
>
> I tried these 2 patches + previous one (to fix kobject warning) on
> top of 5.19.0-rc4-next-20220630 next on a Power8 server.
>
> 5.19.0-rc4-next-20220630 +
> powerpc/powernv: delay rng of node creation until later in boot +
> powerpc/powernv: rename remaining rng powernv_ functions to pnv_ +
> powerpc/kvm: don't crash on missing rng, and use darn
>
> Unfortunately it fails to boot with following crash
>
> [ 0.000000] ftrace: allocated 13 pages with 3 groups
> [ 0.000000] trace event string verifier disabled
> [ 0.000000] rcu: Hierarchical RCU implementation.
> [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=2048 to nr_cpu_ids=80.
> [ 0.000000] Rude variant of Tasks RCU enabled.
> [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
> [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=80
> [ 0.000000] NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16
> [ 0.000000] ICS OPAL backend registered
> [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
> [ 0.000001] clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x761537d007, max_idle_ns: 440795202126 ns
> [ 0.000182] clocksource: timebase mult[1f40000] shift[24] registered
> [ 0.001905] BUG: Unable to handle kernel data access on read at 0x3ffff40000000
> [ 0.002032] Faulting instruction address: 0xc0000000000d7990
> [ 0.002132] Oops: Kernel access of bad area, sig: 7 [#1]
> [ 0.002226] LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA PowerNV
> [ 0.002338] Modules linked in:
> [ 0.002396] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.19.0-rc4-next-20220630-dirty #20
> [ 0.002539] NIP: c0000000000d7990 LR: c00000000201fa74 CTR: c0000000000d7960
> [ 0.002663] REGS: c000000002a0fa60 TRAP: 0300 Not tainted (5.19.0-rc4-next-20220630-dirty)
> [ 0.002812] MSR: 9000000002001033 <SF,HV,VEC,ME,IR,DR,RI,LE> CR: 44000228 XER: 20000000
> [ 0.002979] CFAR: c00000000201fa70 DAR: 0003ffff40000000 DSISR: 00000002 IRQMASK: 1
> [ 0.002979] GPR00: c00000000201fa74 c000000002a0fd00 c000000002a12000 c000000002a0fe90
> [ 0.002979] GPR04: 0000000000000001 0000000000000000 c000000000deb578 000000000000006f
> [ 0.002979] GPR08: 0000000000000000 0003ffff40000000 c000000007040080 0000000000000000
> [ 0.002979] GPR12: c0000000000d7960 c000000002d00000 0000000000000003 0000000000000000
> [ 0.002979] GPR16: 0000000000000000 0000000000000000 0000000000000278 c000000002a4dfe0
> [ 0.002979] GPR20: c000000002a52238 c000000002a52820 c0000000000d7960 c000000000fe6c50
> [ 0.002979] GPR24: 0000000000000001 c000000002a0fe90 c000000000fe6c40 c000000002141ff8
> [ 0.002979] GPR28: 0000000000000800 c0000000070400a0 c000000002ab0150 0000000000000000
> [ 0.004279] NIP [c0000000000d7990] pnv_get_random_long+0x30/0xd0
> [ 0.004390] LR [c00000000201fa74] pnv_get_random_long_early+0x268/0x2d0
> [ 0.004509] Call Trace:
> [ 0.004553] [c000000002a0fd00] [c00000000201fa4c] pnv_get_random_long_early+0x240/0x2d0 (unreliable)
> [ 0.004718] [c000000002a0fe20] [c000000002060d5c] random_init+0xc0/0x214
> [ 0.004844] [c000000002a0fec0] [c0000000020048c0] start_kernel+0x990/0xbf8
> [ 0.004972] [c000000002a0ff90] [c00000000000d878] start_here_common+0x1c/0x24
> [ 0.005102] Instruction dump:
> [ 0.005156] 3c4c0294 3842a6a0 7c0802a6 60000000 7d2000a6 71290010 41820048 e94d0030
> [ 0.005309] 3d22ff73 3929fff8 7d4a482a e92a0008 <7d204eea> e8ea0010 7d2803f4 7ce94a78
> [ 0.005465] ---[ end trace 0000000000000000 ]---
> [ 0.005545]
> [ 1.005574] Kernel panic - not syncing: Fatal exception
> [ 1.005671] Rebooting in 10 seconds..
>
> Reverting powerpc/kvm: don't crash on missing rng, and use darn helps to boot
> the server successfully.
Huh! Thanks for testing that so fast.
That commit has this block in it:
+ if (mfmsr() & MSR_DR) {
+ rng = raw_cpu_read(pnv_rng);
+ *v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
The idea was that `mfmsr() & MSR_DR` would be true if we're in real
mode. But I don't actually know what that's doing; mpe suggested it to
me. Is it possible the condition is inverted and I should have done
`!(mfmsr() & MSR_DR)`? Or maybe there's a better flag to check than
the DR one?
Jason
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/2] powerpc rng cleanups
2022-06-30 16:46 ` Jason A. Donenfeld
@ 2022-07-01 7:24 ` Christophe Leroy
2022-07-01 8:36 ` Jason A. Donenfeld
0 siblings, 1 reply; 7+ messages in thread
From: Christophe Leroy @ 2022-07-01 7:24 UTC (permalink / raw)
To: Jason A. Donenfeld, Sachin Sant; +Cc: linuxppc-dev
Le 30/06/2022 à 18:46, Jason A. Donenfeld a écrit :
> Hi Sachin, Michael,
>
> On Thu, Jun 30, 2022 at 6:12 PM Sachin Sant <sachinp@linux.ibm.com> wrote:
>>> On 30-Jun-2022, at 7:31 PM, Jason A. Donenfeld <Jason@zx2c4.com> wrote:
>>>
>>> These are two small cleanups for -next.
>>>
>>> I'm sending this v3 because very likely
>>> https://lore.kernel.org/all/20220630121654.1939181-1-Jason@zx2c4.com/
>>> will land first, in which case this needs a small adjustment.
>>>
>>> Jason A. Donenfeld (2):
>>> powerpc/powernv: rename remaining rng powernv_ functions to pnv_
>>> powerpc/kvm: don't crash on missing rng, and use darn
>>>
>>> arch/powerpc/include/asm/archrandom.h | 7 +--
>>> arch/powerpc/kvm/book3s_hv_builtin.c | 7 +--
>>> arch/powerpc/platforms/powernv/rng.c | 65 ++++++++++-----------------
>>> drivers/char/hw_random/powernv-rng.c | 2 +-
>>> 4 files changed, 30 insertions(+), 51 deletions(-)
>>>
>>
>> I tried these 2 patches + previous one (to fix kobject warning) on
>> top of 5.19.0-rc4-next-20220630 next on a Power8 server.
>>
>> 5.19.0-rc4-next-20220630 +
>> powerpc/powernv: delay rng of node creation until later in boot +
>> powerpc/powernv: rename remaining rng powernv_ functions to pnv_ +
>> powerpc/kvm: don't crash on missing rng, and use darn
>>
>> Unfortunately it fails to boot with following crash
>>
>> [ 0.000000] ftrace: allocated 13 pages with 3 groups
>> [ 0.000000] trace event string verifier disabled
>> [ 0.000000] rcu: Hierarchical RCU implementation.
>> [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=2048 to nr_cpu_ids=80.
>> [ 0.000000] Rude variant of Tasks RCU enabled.
>> [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
>> [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=80
>> [ 0.000000] NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16
>> [ 0.000000] ICS OPAL backend registered
>> [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
>> [ 0.000001] clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x761537d007, max_idle_ns: 440795202126 ns
>> [ 0.000182] clocksource: timebase mult[1f40000] shift[24] registered
>> [ 0.001905] BUG: Unable to handle kernel data access on read at 0x3ffff40000000
>> [ 0.002032] Faulting instruction address: 0xc0000000000d7990
>> [ 0.002132] Oops: Kernel access of bad area, sig: 7 [#1]
>> [ 0.002226] LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA PowerNV
>> [ 0.002338] Modules linked in:
>> [ 0.002396] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.19.0-rc4-next-20220630-dirty #20
>> [ 0.002539] NIP: c0000000000d7990 LR: c00000000201fa74 CTR: c0000000000d7960
>> [ 0.002663] REGS: c000000002a0fa60 TRAP: 0300 Not tainted (5.19.0-rc4-next-20220630-dirty)
>> [ 0.002812] MSR: 9000000002001033 <SF,HV,VEC,ME,IR,DR,RI,LE> CR: 44000228 XER: 20000000
>> [ 0.002979] CFAR: c00000000201fa70 DAR: 0003ffff40000000 DSISR: 00000002 IRQMASK: 1
>> [ 0.002979] GPR00: c00000000201fa74 c000000002a0fd00 c000000002a12000 c000000002a0fe90
>> [ 0.002979] GPR04: 0000000000000001 0000000000000000 c000000000deb578 000000000000006f
>> [ 0.002979] GPR08: 0000000000000000 0003ffff40000000 c000000007040080 0000000000000000
>> [ 0.002979] GPR12: c0000000000d7960 c000000002d00000 0000000000000003 0000000000000000
>> [ 0.002979] GPR16: 0000000000000000 0000000000000000 0000000000000278 c000000002a4dfe0
>> [ 0.002979] GPR20: c000000002a52238 c000000002a52820 c0000000000d7960 c000000000fe6c50
>> [ 0.002979] GPR24: 0000000000000001 c000000002a0fe90 c000000000fe6c40 c000000002141ff8
>> [ 0.002979] GPR28: 0000000000000800 c0000000070400a0 c000000002ab0150 0000000000000000
>> [ 0.004279] NIP [c0000000000d7990] pnv_get_random_long+0x30/0xd0
>> [ 0.004390] LR [c00000000201fa74] pnv_get_random_long_early+0x268/0x2d0
>> [ 0.004509] Call Trace:
>> [ 0.004553] [c000000002a0fd00] [c00000000201fa4c] pnv_get_random_long_early+0x240/0x2d0 (unreliable)
>> [ 0.004718] [c000000002a0fe20] [c000000002060d5c] random_init+0xc0/0x214
>> [ 0.004844] [c000000002a0fec0] [c0000000020048c0] start_kernel+0x990/0xbf8
>> [ 0.004972] [c000000002a0ff90] [c00000000000d878] start_here_common+0x1c/0x24
>> [ 0.005102] Instruction dump:
>> [ 0.005156] 3c4c0294 3842a6a0 7c0802a6 60000000 7d2000a6 71290010 41820048 e94d0030
>> [ 0.005309] 3d22ff73 3929fff8 7d4a482a e92a0008 <7d204eea> e8ea0010 7d2803f4 7ce94a78
>> [ 0.005465] ---[ end trace 0000000000000000 ]---
>> [ 0.005545]
>> [ 1.005574] Kernel panic - not syncing: Fatal exception
>> [ 1.005671] Rebooting in 10 seconds..
>>
>> Reverting powerpc/kvm: don't crash on missing rng, and use darn helps to boot
>> the server successfully.
>
> Huh! Thanks for testing that so fast.
>
> That commit has this block in it:
>
> + if (mfmsr() & MSR_DR) {
> + rng = raw_cpu_read(pnv_rng);
> + *v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
>
> The idea was that `mfmsr() & MSR_DR` would be true if we're in real
> mode. But I don't actually know what that's doing; mpe suggested it to
> me. Is it possible the condition is inverted and I should have done
> `!(mfmsr() & MSR_DR)`? Or maybe there's a better flag to check than
> the DR one?
When DR is set you are in virtual mode
When DR is unset you are in real mode
Extract from documentation:
DR Data address translation
0 Data address translation is disabled.
1 Data address translation is enabled.
Christophe
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/2] powerpc rng cleanups
2022-07-01 7:24 ` Christophe Leroy
@ 2022-07-01 8:36 ` Jason A. Donenfeld
0 siblings, 0 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-07-01 8:36 UTC (permalink / raw)
To: Christophe Leroy; +Cc: linuxppc-dev, Sachin Sant
On Fri, Jul 01, 2022 at 07:24:42AM +0000, Christophe Leroy wrote:
> When DR is set you are in virtual mode
> When DR is unset you are in real mode
>
> Extract from documentation:
>
> DR Data address translation
> 0 Data address translation is disabled.
> 1 Data address translation is enabled.
Thanks! So I just had it backwards, no wonder.
Jason
>
>
> Christophe
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-07-01 8:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-30 14:01 [PATCH v3 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
2022-06-30 14:01 ` [PATCH v3 2/2] powerpc/kvm: don't crash on missing rng, and use darn Jason A. Donenfeld
2022-06-30 16:11 ` [PATCH v3 0/2] powerpc rng cleanups Sachin Sant
2022-06-30 16:46 ` Jason A. Donenfeld
2022-07-01 7:24 ` Christophe Leroy
2022-07-01 8:36 ` Jason A. Donenfeld
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).