* [PATCH v5 0/2] powerpc rng cleanups
@ 2022-07-11 23:24 Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 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-07-11 23:24 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp, linux-kernel; +Cc: Jason A. Donenfeld
These are two small cleanups for -next. This v5 rebases on the latest
git master, as some whitespace was added that made v4 no longer apply.
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 | 66 ++++++++++-----------------
drivers/char/hw_random/powernv-rng.c | 2 +-
4 files changed, 30 insertions(+), 52 deletions(-)
--
2.35.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_
2022-07-11 23:24 [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
@ 2022-07-11 23:24 ` Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 2/2] powerpc/kvm: don't crash on missing rng, and use darn Jason A. Donenfeld
2022-07-18 13:09 ` [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
2 siblings, 0 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-07-11 23:24 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp, linux-kernel; +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>
Tested-by: Sachin Sant <sachinp@linux.ibm.com>
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 3805ad13b8f3..b5cd82eab9b3 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;
}
@@ -208,7 +208,7 @@ static int __init pnv_rng_late_init(void)
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 v5 2/2] powerpc/kvm: don't crash on missing rng, and use darn
2022-07-11 23:24 [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
@ 2022-07-11 23:24 ` Jason A. Donenfeld
2022-07-18 13:09 ` [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
2 siblings, 0 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-07-11 23:24 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp, linux-kernel; +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>
Tested-by: Sachin Sant <sachinp@linux.ibm.com>
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 | 34 +++++++--------------------
3 files changed, 12 insertions(+), 34 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 b5cd82eab9b3..196aa70fe043 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,12 +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 = get_cpu_var(pnv_rng);
+ *v = rng_whiten(rng, in_be64(rng->regs));
+ put_cpu_var(rng);
+ } else {
+ rng = raw_cpu_read(pnv_rng);
+ *v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
+ }
return 1;
}
EXPORT_SYMBOL_GPL(pnv_get_random_long);
--
2.35.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v5 0/2] powerpc rng cleanups
2022-07-11 23:24 [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 2/2] powerpc/kvm: don't crash on missing rng, and use darn Jason A. Donenfeld
@ 2022-07-18 13:09 ` Jason A. Donenfeld
2022-07-27 1:36 ` Jason A. Donenfeld
2 siblings, 1 reply; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-07-18 13:09 UTC (permalink / raw)
To: linuxppc-dev, mpe, sachinp, linux-kernel
Hey again,
On Tue, Jul 12, 2022 at 01:24:46AM +0200, Jason A. Donenfeld wrote:
> These are two small cleanups for -next. This v5 rebases on the latest
> git master, as some whitespace was added that made v4 no longer apply.
>
> 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 | 66 ++++++++++-----------------
> drivers/char/hw_random/powernv-rng.c | 2 +-
> 4 files changed, 30 insertions(+), 52 deletions(-)
I think v5 has reached a completion point. Could you queue these up in
some PPC tree for 5.20?
Thanks,
Jason
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 0/2] powerpc rng cleanups
2022-07-18 13:09 ` [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
@ 2022-07-27 1:36 ` Jason A. Donenfeld
2022-07-27 3:54 ` Michael Ellerman
0 siblings, 1 reply; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-07-27 1:36 UTC (permalink / raw)
To: PowerPC, Michael Ellerman, Sachin Sant, LKML
Hi Michael,
On Mon, Jul 18, 2022 at 3:09 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
>
> Hey again,
>
> On Tue, Jul 12, 2022 at 01:24:46AM +0200, Jason A. Donenfeld wrote:
> > These are two small cleanups for -next. This v5 rebases on the latest
> > git master, as some whitespace was added that made v4 no longer apply.
> >
> > 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 | 66 ++++++++++-----------------
> > drivers/char/hw_random/powernv-rng.c | 2 +-
> > 4 files changed, 30 insertions(+), 52 deletions(-)
>
> I think v5 has reached a completion point. Could you queue these up in
> some PPC tree for 5.20?
Just paging again. Do you think you could queue these up for 5.20?
This trivial series is over a month old now.
Thanks,
Jason
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 0/2] powerpc rng cleanups
2022-07-27 1:36 ` Jason A. Donenfeld
@ 2022-07-27 3:54 ` Michael Ellerman
2022-07-27 11:52 ` Jason A. Donenfeld
0 siblings, 1 reply; 7+ messages in thread
From: Michael Ellerman @ 2022-07-27 3:54 UTC (permalink / raw)
To: Jason A. Donenfeld, PowerPC, Sachin Sant, LKML
"Jason A. Donenfeld" <Jason@zx2c4.com> writes:
> On Mon, Jul 18, 2022 at 3:09 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
>> On Tue, Jul 12, 2022 at 01:24:46AM +0200, Jason A. Donenfeld wrote:
>> > These are two small cleanups for -next. This v5 rebases on the latest
>> > git master, as some whitespace was added that made v4 no longer apply.
>> >
>> > 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 | 66 ++++++++++-----------------
>> > drivers/char/hw_random/powernv-rng.c | 2 +-
>> > 4 files changed, 30 insertions(+), 52 deletions(-)
>>
>> I think v5 has reached a completion point. Could you queue these up in
>> some PPC tree for 5.20?
>
> Just paging again. Do you think you could queue these up for 5.20?
> This trivial series is over a month old now.
It can't claim to fix a guest-triggerable hypervisor crash and also be
"trivial" :)
But yes I plan to queue it for v5.20.
cheers
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 0/2] powerpc rng cleanups
2022-07-27 3:54 ` Michael Ellerman
@ 2022-07-27 11:52 ` Jason A. Donenfeld
0 siblings, 0 replies; 7+ messages in thread
From: Jason A. Donenfeld @ 2022-07-27 11:52 UTC (permalink / raw)
To: Michael Ellerman; +Cc: PowerPC, Sachin Sant, LKML
Hi Michael,
On Wed, Jul 27, 2022 at 01:54:07PM +1000, Michael Ellerman wrote:
> "Jason A. Donenfeld" <Jason@zx2c4.com> writes:
> > On Mon, Jul 18, 2022 at 3:09 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> >> On Tue, Jul 12, 2022 at 01:24:46AM +0200, Jason A. Donenfeld wrote:
> >> > These are two small cleanups for -next. This v5 rebases on the latest
> >> > git master, as some whitespace was added that made v4 no longer apply.
> >> >
> >> > 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 | 66 ++++++++++-----------------
> >> > drivers/char/hw_random/powernv-rng.c | 2 +-
> >> > 4 files changed, 30 insertions(+), 52 deletions(-)
> >>
> >> I think v5 has reached a completion point. Could you queue these up in
> >> some PPC tree for 5.20?
> >
> > Just paging again. Do you think you could queue these up for 5.20?
> > This trivial series is over a month old now.
>
> It can't claim to fix a guest-triggerable hypervisor crash and also be
> "trivial" :)
:)
>
> But yes I plan to queue it for v5.20.
Okay great. Would be nice to see this in -next sooner rather than later.
Jason
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-07-27 11:53 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-11 23:24 [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 1/2] powerpc/powernv: rename remaining rng powernv_ functions to pnv_ Jason A. Donenfeld
2022-07-11 23:24 ` [PATCH v5 2/2] powerpc/kvm: don't crash on missing rng, and use darn Jason A. Donenfeld
2022-07-18 13:09 ` [PATCH v5 0/2] powerpc rng cleanups Jason A. Donenfeld
2022-07-27 1:36 ` Jason A. Donenfeld
2022-07-27 3:54 ` Michael Ellerman
2022-07-27 11:52 ` 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).