* [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
@ 2021-01-27 2:08 Stephen Zhang
2021-01-27 10:54 ` Paolo Bonzini
0 siblings, 1 reply; 7+ messages in thread
From: Stephen Zhang @ 2021-01-27 2:08 UTC (permalink / raw)
To: pbonzini, seanjc, vkuznets, wanpengli, jmattson, joro, tglx,
mingo, bp, x86, hpa
Cc: kvm, linux-kernel, Stephen Zhang
Given the common pattern:
rmap_printk("%s:"..., __func__,...)
we could improve this by adding '__func__' in rmap_printk().
Signed-off-by: Stephen Zhang <stephenzhangzsd@gmail.com>
---
arch/x86/kvm/mmu/mmu.c | 20 ++++++++++----------
arch/x86/kvm/mmu/mmu_internal.h | 2 +-
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 6d16481..1460705 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -844,17 +844,17 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
int i, count = 0;
if (!rmap_head->val) {
- rmap_printk("pte_list_add: %p %llx 0->1\n", spte, *spte);
+ rmap_printk("%p %llx 0->1\n", spte, *spte);
rmap_head->val = (unsigned long)spte;
} else if (!(rmap_head->val & 1)) {
- rmap_printk("pte_list_add: %p %llx 1->many\n", spte, *spte);
+ rmap_printk("%p %llx 1->many\n", spte, *spte);
desc = mmu_alloc_pte_list_desc(vcpu);
desc->sptes[0] = (u64 *)rmap_head->val;
desc->sptes[1] = spte;
rmap_head->val = (unsigned long)desc | 1;
++count;
} else {
- rmap_printk("pte_list_add: %p %llx many->many\n", spte, *spte);
+ rmap_printk("%p %llx many->many\n", spte, *spte);
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
while (desc->sptes[PTE_LIST_EXT-1]) {
count += PTE_LIST_EXT;
@@ -906,14 +906,14 @@ static void __pte_list_remove(u64 *spte, struct kvm_rmap_head *rmap_head)
pr_err("%s: %p 0->BUG\n", __func__, spte);
BUG();
} else if (!(rmap_head->val & 1)) {
- rmap_printk("%s: %p 1->0\n", __func__, spte);
+ rmap_printk("%p 1->0\n", spte);
if ((u64 *)rmap_head->val != spte) {
pr_err("%s: %p 1->BUG\n", __func__, spte);
BUG();
}
rmap_head->val = 0;
} else {
- rmap_printk("%s: %p many->many\n", __func__, spte);
+ rmap_printk("%p many->many\n", spte);
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
prev_desc = NULL;
while (desc) {
@@ -1115,7 +1115,7 @@ static bool spte_write_protect(u64 *sptep, bool pt_protect)
!(pt_protect && spte_can_locklessly_be_made_writable(spte)))
return false;
- rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep);
+ rmap_printk("spte %p %llx\n", sptep, *sptep);
if (pt_protect)
spte &= ~SPTE_MMU_WRITEABLE;
@@ -1142,7 +1142,7 @@ static bool spte_clear_dirty(u64 *sptep)
{
u64 spte = *sptep;
- rmap_printk("rmap_clear_dirty: spte %p %llx\n", sptep, *sptep);
+ rmap_printk("spte %p %llx\n", sptep, *sptep);
MMU_WARN_ON(!spte_ad_enabled(spte));
spte &= ~shadow_dirty_mask;
@@ -1184,7 +1184,7 @@ static bool spte_set_dirty(u64 *sptep)
{
u64 spte = *sptep;
- rmap_printk("rmap_set_dirty: spte %p %llx\n", sptep, *sptep);
+ rmap_printk("spte %p %llx\n", sptep, *sptep);
/*
* Similar to the !kvm_x86_ops.slot_disable_log_dirty case,
@@ -1331,7 +1331,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head)
bool flush = false;
while ((sptep = rmap_get_first(rmap_head, &iter))) {
- rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep);
+ rmap_printk("spte %p %llx.\n", sptep, *sptep);
pte_list_remove(rmap_head, sptep);
flush = true;
@@ -1363,7 +1363,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head,
restart:
for_each_rmap_spte(rmap_head, &iter, sptep) {
- rmap_printk("kvm_set_pte_rmapp: spte %p %llx gfn %llx (%d)\n",
+ rmap_printk("spte %p %llx gfn %llx (%d)\n",
sptep, *sptep, gfn, level);
need_flush = 1;
diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h
index bfc6389..5ec15e4 100644
--- a/arch/x86/kvm/mmu/mmu_internal.h
+++ b/arch/x86/kvm/mmu/mmu_internal.h
@@ -12,7 +12,7 @@
extern bool dbg;
#define pgprintk(x...) do { if (dbg) printk(x); } while (0)
-#define rmap_printk(x...) do { if (dbg) printk(x); } while (0)
+#define rmap_printk(fmt, args...) do { if (dbg) printk("%s: " fmt, __func__, ## args); } while (0)
#define MMU_WARN_ON(x) WARN_ON(x)
#else
#define pgprintk(x...) do { } while (0)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
2021-01-27 2:08 [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk() Stephen Zhang
@ 2021-01-27 10:54 ` Paolo Bonzini
2021-01-27 17:25 ` Joe Perches
0 siblings, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2021-01-27 10:54 UTC (permalink / raw)
To: Stephen Zhang, seanjc, vkuznets, wanpengli, jmattson, joro, tglx,
mingo, bp, x86, hpa
Cc: kvm, linux-kernel
On 27/01/21 03:08, Stephen Zhang wrote:
> Given the common pattern:
>
> rmap_printk("%s:"..., __func__,...)
>
> we could improve this by adding '__func__' in rmap_printk().
>
> Signed-off-by: Stephen Zhang <stephenzhangzsd@gmail.com>
> ---
> arch/x86/kvm/mmu/mmu.c | 20 ++++++++++----------
> arch/x86/kvm/mmu/mmu_internal.h | 2 +-
> 2 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 6d16481..1460705 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -844,17 +844,17 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
> int i, count = 0;
>
> if (!rmap_head->val) {
> - rmap_printk("pte_list_add: %p %llx 0->1\n", spte, *spte);
> + rmap_printk("%p %llx 0->1\n", spte, *spte);
> rmap_head->val = (unsigned long)spte;
> } else if (!(rmap_head->val & 1)) {
> - rmap_printk("pte_list_add: %p %llx 1->many\n", spte, *spte);
> + rmap_printk("%p %llx 1->many\n", spte, *spte);
> desc = mmu_alloc_pte_list_desc(vcpu);
> desc->sptes[0] = (u64 *)rmap_head->val;
> desc->sptes[1] = spte;
> rmap_head->val = (unsigned long)desc | 1;
> ++count;
> } else {
> - rmap_printk("pte_list_add: %p %llx many->many\n", spte, *spte);
> + rmap_printk("%p %llx many->many\n", spte, *spte);
> desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
> while (desc->sptes[PTE_LIST_EXT-1]) {
> count += PTE_LIST_EXT;
> @@ -906,14 +906,14 @@ static void __pte_list_remove(u64 *spte, struct kvm_rmap_head *rmap_head)
> pr_err("%s: %p 0->BUG\n", __func__, spte);
> BUG();
> } else if (!(rmap_head->val & 1)) {
> - rmap_printk("%s: %p 1->0\n", __func__, spte);
> + rmap_printk("%p 1->0\n", spte);
> if ((u64 *)rmap_head->val != spte) {
> pr_err("%s: %p 1->BUG\n", __func__, spte);
> BUG();
> }
> rmap_head->val = 0;
> } else {
> - rmap_printk("%s: %p many->many\n", __func__, spte);
> + rmap_printk("%p many->many\n", spte);
> desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
> prev_desc = NULL;
> while (desc) {
> @@ -1115,7 +1115,7 @@ static bool spte_write_protect(u64 *sptep, bool pt_protect)
> !(pt_protect && spte_can_locklessly_be_made_writable(spte)))
> return false;
>
> - rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep);
> + rmap_printk("spte %p %llx\n", sptep, *sptep);
>
> if (pt_protect)
> spte &= ~SPTE_MMU_WRITEABLE;
> @@ -1142,7 +1142,7 @@ static bool spte_clear_dirty(u64 *sptep)
> {
> u64 spte = *sptep;
>
> - rmap_printk("rmap_clear_dirty: spte %p %llx\n", sptep, *sptep);
> + rmap_printk("spte %p %llx\n", sptep, *sptep);
>
> MMU_WARN_ON(!spte_ad_enabled(spte));
> spte &= ~shadow_dirty_mask;
> @@ -1184,7 +1184,7 @@ static bool spte_set_dirty(u64 *sptep)
> {
> u64 spte = *sptep;
>
> - rmap_printk("rmap_set_dirty: spte %p %llx\n", sptep, *sptep);
> + rmap_printk("spte %p %llx\n", sptep, *sptep);
>
> /*
> * Similar to the !kvm_x86_ops.slot_disable_log_dirty case,
> @@ -1331,7 +1331,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head)
> bool flush = false;
>
> while ((sptep = rmap_get_first(rmap_head, &iter))) {
> - rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep);
> + rmap_printk("spte %p %llx.\n", sptep, *sptep);
>
> pte_list_remove(rmap_head, sptep);
> flush = true;
> @@ -1363,7 +1363,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head,
>
> restart:
> for_each_rmap_spte(rmap_head, &iter, sptep) {
> - rmap_printk("kvm_set_pte_rmapp: spte %p %llx gfn %llx (%d)\n",
> + rmap_printk("spte %p %llx gfn %llx (%d)\n",
> sptep, *sptep, gfn, level);
>
> need_flush = 1;
> diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h
> index bfc6389..5ec15e4 100644
> --- a/arch/x86/kvm/mmu/mmu_internal.h
> +++ b/arch/x86/kvm/mmu/mmu_internal.h
> @@ -12,7 +12,7 @@
> extern bool dbg;
>
> #define pgprintk(x...) do { if (dbg) printk(x); } while (0)
> -#define rmap_printk(x...) do { if (dbg) printk(x); } while (0)
> +#define rmap_printk(fmt, args...) do { if (dbg) printk("%s: " fmt, __func__, ## args); } while (0)
> #define MMU_WARN_ON(x) WARN_ON(x)
> #else
> #define pgprintk(x...) do { } while (0)
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
2021-01-27 10:54 ` Paolo Bonzini
@ 2021-01-27 17:25 ` Joe Perches
2021-01-27 18:23 ` Paolo Bonzini
2021-02-02 16:07 ` Paolo Bonzini
0 siblings, 2 replies; 7+ messages in thread
From: Joe Perches @ 2021-01-27 17:25 UTC (permalink / raw)
To: Paolo Bonzini, Stephen Zhang, seanjc, vkuznets, wanpengli,
jmattson, joro, tglx, mingo, bp, x86, hpa
Cc: kvm, linux-kernel
On Wed, 2021-01-27 at 11:54 +0100, Paolo Bonzini wrote:
> On 27/01/21 03:08, Stephen Zhang wrote:
> > Given the common pattern:
> >
> > rmap_printk("%s:"..., __func__,...)
> >
> > we could improve this by adding '__func__' in rmap_printk().
Currently, the MMU_DEBUG control is not defined so this isn't used.
Another improvement would be to remove the macro altogether and
rename the uses to the more standard style using pr_debug.
arch/x86/kvm/mmu/mmu_internal.h-#undef MMU_DEBUG
arch/x86/kvm/mmu/mmu_internal.h-
arch/x86/kvm/mmu/mmu_internal.h-#ifdef MMU_DEBUG
arch/x86/kvm/mmu/mmu_internal.h-extern bool dbg;
arch/x86/kvm/mmu/mmu_internal.h-
arch/x86/kvm/mmu/mmu_internal.h-#define pgprintk(x...) do { if (dbg) printk(x); } while (0)
arch/x86/kvm/mmu/mmu_internal.h:#define rmap_printk(x...) do { if (dbg) printk(x); } while (0)
arch/x86/kvm/mmu/mmu_internal.h-#define MMU_WARN_ON(x) WARN_ON(x)
arch/x86/kvm/mmu/mmu_internal.h-#else
arch/x86/kvm/mmu/mmu_internal.h-#define pgprintk(x...) do { } while (0)
arch/x86/kvm/mmu/mmu_internal.h:#define rmap_printk(x...) do { } while (0)
arch/x86/kvm/mmu/mmu_internal.h-#define MMU_WARN_ON(x) do { } while (0)
arch/x86/kvm/mmu/mmu_internal.h-#endif
arch/x86/kvm/mmu/mmu_internal.h-
Also this define hasn't been set in quite awhile as there are
format/argument mismatches in the code that use gpa_t that need
to be converted from %lx to %llx with a cast to (u64)
So I think this would be better as:
---
arch/x86/kvm/mmu/mmu.c | 47 ++++++++++++++++++-----------------------
arch/x86/kvm/mmu/mmu_internal.h | 10 +--------
arch/x86/kvm/mmu/paging_tmpl.h | 10 ++++-----
arch/x86/kvm/mmu/spte.c | 4 ++--
4 files changed, 28 insertions(+), 43 deletions(-)
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 6d16481aa29d..54987bd64647 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -105,11 +105,6 @@ enum {
AUDIT_POST_SYNC
};
-#ifdef MMU_DEBUG
-bool dbg = 0;
-module_param(dbg, bool, 0644);
-#endif
-
#define PTE_PREFETCH_NUM 8
#define PT32_LEVEL_BITS 10
@@ -844,17 +839,17 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
int i, count = 0;
if (!rmap_head->val) {
- rmap_printk("pte_list_add: %p %llx 0->1\n", spte, *spte);
+ pr_debug("%p %llx 0->1\n", spte, *spte);
rmap_head->val = (unsigned long)spte;
} else if (!(rmap_head->val & 1)) {
- rmap_printk("pte_list_add: %p %llx 1->many\n", spte, *spte);
+ pr_debug("%p %llx 1->many\n", spte, *spte);
desc = mmu_alloc_pte_list_desc(vcpu);
desc->sptes[0] = (u64 *)rmap_head->val;
desc->sptes[1] = spte;
rmap_head->val = (unsigned long)desc | 1;
++count;
} else {
- rmap_printk("pte_list_add: %p %llx many->many\n", spte, *spte);
+ pr_debug("%p %llx many->many\n", spte, *spte);
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
while (desc->sptes[PTE_LIST_EXT-1]) {
count += PTE_LIST_EXT;
@@ -906,14 +901,14 @@ static void __pte_list_remove(u64 *spte, struct kvm_rmap_head *rmap_head)
pr_err("%s: %p 0->BUG\n", __func__, spte);
BUG();
} else if (!(rmap_head->val & 1)) {
- rmap_printk("%s: %p 1->0\n", __func__, spte);
+ pr_debug("%p 1->0\n", spte);
if ((u64 *)rmap_head->val != spte) {
pr_err("%s: %p 1->BUG\n", __func__, spte);
BUG();
}
rmap_head->val = 0;
} else {
- rmap_printk("%s: %p many->many\n", __func__, spte);
+ pr_debug("%p many->many\n", spte);
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
prev_desc = NULL;
while (desc) {
@@ -1115,7 +1110,7 @@ static bool spte_write_protect(u64 *sptep, bool pt_protect)
!(pt_protect && spte_can_locklessly_be_made_writable(spte)))
return false;
- rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep);
+ pr_debug("spte %p %llx\n", sptep, *sptep);
if (pt_protect)
spte &= ~SPTE_MMU_WRITEABLE;
@@ -1142,7 +1137,7 @@ static bool spte_clear_dirty(u64 *sptep)
{
u64 spte = *sptep;
- rmap_printk("rmap_clear_dirty: spte %p %llx\n", sptep, *sptep);
+ pr_debug("spte %p %llx\n", sptep, *sptep);
MMU_WARN_ON(!spte_ad_enabled(spte));
spte &= ~shadow_dirty_mask;
@@ -1184,7 +1179,7 @@ static bool spte_set_dirty(u64 *sptep)
{
u64 spte = *sptep;
- rmap_printk("rmap_set_dirty: spte %p %llx\n", sptep, *sptep);
+ pr_debug("spte %p %llx\n", sptep, *sptep);
/*
* Similar to the !kvm_x86_ops.slot_disable_log_dirty case,
@@ -1331,7 +1326,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head)
bool flush = false;
while ((sptep = rmap_get_first(rmap_head, &iter))) {
- rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep);
+ pr_debug("spte %p %llx.\n", sptep, *sptep);
pte_list_remove(rmap_head, sptep);
flush = true;
@@ -1363,8 +1358,8 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head,
restart:
for_each_rmap_spte(rmap_head, &iter, sptep) {
- rmap_printk("kvm_set_pte_rmapp: spte %p %llx gfn %llx (%d)\n",
- sptep, *sptep, gfn, level);
+ pr_debug("spte %p %llx gfn %llx (%d)\n",
+ sptep, *sptep, gfn, level);
need_flush = 1;
@@ -1605,7 +1600,7 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva)
return young;
}
-#ifdef MMU_DEBUG
+#ifdef DEBUG
static int is_empty_shadow_page(u64 *spt)
{
u64 *pos;
@@ -2490,12 +2485,11 @@ int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn)
LIST_HEAD(invalid_list);
int r;
- pgprintk("%s: looking for gfn %llx\n", __func__, gfn);
+ pr_debug("looking for gfn %llx\n", gfn);
r = 0;
spin_lock(&kvm->mmu_lock);
for_each_gfn_indirect_valid_sp(kvm, sp, gfn) {
- pgprintk("%s: gfn %llx role %x\n", __func__, gfn,
- sp->role.word);
+ pr_debug("gfn %llx role %x\n", gfn, sp->role.word);
r = 1;
kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list);
}
@@ -2614,7 +2608,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
int ret = RET_PF_FIXED;
bool flush = false;
- pgprintk("%s: spte %llx write_fault %d gfn %llx\n", __func__,
+ pr_debug("spte %llx write_fault %d gfn %llx\n",
*sptep, write_fault, gfn);
if (is_shadow_present_pte(*sptep)) {
@@ -2630,7 +2624,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
drop_parent_pte(child, sptep);
flush = true;
} else if (pfn != spte_to_pfn(*sptep)) {
- pgprintk("hfn old %llx new %llx\n",
+ pr_debug("hfn old %llx new %llx\n",
spte_to_pfn(*sptep), pfn);
drop_spte(vcpu->kvm, sptep);
flush = true;
@@ -2662,7 +2656,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
return RET_PF_SPURIOUS;
}
- pgprintk("%s: setting spte %llx\n", __func__, *sptep);
+ pr_debug("setting spte %llx\n", *sptep);
trace_kvm_mmu_set_spte(level, gfn, sptep);
if (!was_rmapped && is_large_pte(*sptep))
++vcpu->kvm->stat.lpages;
@@ -3747,7 +3741,7 @@ static int direct_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code,
static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa,
u32 error_code, bool prefault)
{
- pgprintk("%s: gva %lx error %x\n", __func__, gpa, error_code);
+ pr_debug("gva %llx error %x\n", (u64)gpa, error_code);
/* This path builds a PAE pagetable, we can map 2mb pages at maximum. */
return direct_page_fault(vcpu, gpa & PAGE_MASK, error_code, prefault,
@@ -4904,8 +4898,7 @@ static bool detect_write_misaligned(struct kvm_mmu_page *sp, gpa_t gpa,
{
unsigned offset, pte_size, misaligned;
- pgprintk("misaligned: gpa %llx bytes %d role %x\n",
- gpa, bytes, sp->role.word);
+ pr_debug("gpa %llx bytes %d role %x\n", gpa, bytes, sp->role.word);
offset = offset_in_page(gpa);
pte_size = sp->role.gpte_is_8_bytes ? 8 : 4;
@@ -4990,7 +4983,7 @@ static void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
remote_flush = local_flush = false;
- pgprintk("%s: gpa %llx bytes %d\n", __func__, gpa, bytes);
+ pr_debug("gpa %llx bytes %d\n", gpa, bytes);
/*
* No need to care whether allocation memory is successful
diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h
index bfc6389edc28..095bdef63a03 100644
--- a/arch/x86/kvm/mmu/mmu_internal.h
+++ b/arch/x86/kvm/mmu/mmu_internal.h
@@ -6,17 +6,9 @@
#include <linux/kvm_host.h>
#include <asm/kvm_host.h>
-#undef MMU_DEBUG
-
-#ifdef MMU_DEBUG
-extern bool dbg;
-
-#define pgprintk(x...) do { if (dbg) printk(x); } while (0)
-#define rmap_printk(x...) do { if (dbg) printk(x); } while (0)
+#ifdef DEBUG
#define MMU_WARN_ON(x) WARN_ON(x)
#else
-#define pgprintk(x...) do { } while (0)
-#define rmap_printk(x...) do { } while (0)
#define MMU_WARN_ON(x) do { } while (0)
#endif
diff --git a/arch/x86/kvm/mmu/paging_tmpl.h b/arch/x86/kvm/mmu/paging_tmpl.h
index 50e268eb8e1a..ecbb4e469c1e 100644
--- a/arch/x86/kvm/mmu/paging_tmpl.h
+++ b/arch/x86/kvm/mmu/paging_tmpl.h
@@ -462,8 +462,8 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
goto retry_walk;
}
- pgprintk("%s: pte %llx pte_access %x pt_access %x\n",
- __func__, (u64)pte, walker->pte_access, walker->pt_access);
+ pr_debug("pte %llx pte_access %x pt_access %x\n",
+ (u64)pte, walker->pte_access, walker->pt_access);
return 1;
error:
@@ -536,7 +536,7 @@ FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
if (FNAME(prefetch_invalid_gpte)(vcpu, sp, spte, gpte))
return false;
- pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte);
+ pr_debug("gpte %llx spte %p\n", (u64)gpte, spte);
gfn = gpte_to_gfn(gpte);
pte_access = sp->role.access & FNAME(gpte_access)(gpte);
@@ -794,7 +794,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code,
bool map_writable, is_self_change_mapping;
int max_level;
- pgprintk("%s: addr %lx err %x\n", __func__, addr, error_code);
+ pr_debug("addr %llx err %x\n", (u64)addr, error_code);
/*
* If PFEC.RSVD is set, this is a shadow page fault.
@@ -811,7 +811,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code,
* The page is not mapped by the guest. Let the guest handle it.
*/
if (!r) {
- pgprintk("%s: guest page fault\n", __func__);
+ pr_debug("guest page fault\n");
if (!prefault)
kvm_inject_emulated_page_fault(vcpu, &walker.fault);
diff --git a/arch/x86/kvm/mmu/spte.c b/arch/x86/kvm/mmu/spte.c
index c51ad544f25b..23adcb93f6cc 100644
--- a/arch/x86/kvm/mmu/spte.c
+++ b/arch/x86/kvm/mmu/spte.c
@@ -146,8 +146,8 @@ int make_spte(struct kvm_vcpu *vcpu, unsigned int pte_access, int level,
goto out;
if (mmu_need_write_protect(vcpu, gfn, can_unsync)) {
- pgprintk("%s: found shadow page for %llx, marking ro\n",
- __func__, gfn);
+ pr_debug("found shadow page for %llx, marking ro\n",
+ gfn);
ret |= SET_SPTE_WRITE_PROTECTED_PT;
pte_access &= ~ACC_WRITE_MASK;
spte &= ~(PT_WRITABLE_MASK | SPTE_MMU_WRITEABLE);
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
2021-01-27 17:25 ` Joe Perches
@ 2021-01-27 18:23 ` Paolo Bonzini
2021-01-27 18:28 ` Joe Perches
2021-02-02 16:07 ` Paolo Bonzini
1 sibling, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2021-01-27 18:23 UTC (permalink / raw)
To: Joe Perches, Stephen Zhang, seanjc, vkuznets, wanpengli,
jmattson, joro, tglx, mingo, bp, x86, hpa
Cc: kvm, linux-kernel
On 27/01/21 18:25, Joe Perches wrote:
>
> -#ifdef MMU_DEBUG
> -bool dbg = 0;
> -module_param(dbg, bool, 0644);
> -#endif
> -
> #define PTE_PREFETCH_NUM 8
>
> #define PT32_LEVEL_BITS 10
> @@ -844,17 +839,17 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
> int i, count = 0;
>
> if (!rmap_head->val) {
> - rmap_printk("pte_list_add: %p %llx 0->1\n", spte, *spte);
> + pr_debug("%p %llx 0->1\n", spte, *spte);
> rmap_head->val = (unsigned long)spte;
> } else if (!(rmap_head->val & 1)) {
> - rmap_printk("pte_list_add: %p %llx 1->many\n", spte, *spte);
> + pr_debug("%p %llx 1->many\n", spte, *spte);
> desc = mmu_alloc_pte_list_desc(vcpu);
This would be extremely slow. These messages are even too verbose for
tracepoints.
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
2021-01-27 18:23 ` Paolo Bonzini
@ 2021-01-27 18:28 ` Joe Perches
2021-01-28 8:24 ` Paolo Bonzini
0 siblings, 1 reply; 7+ messages in thread
From: Joe Perches @ 2021-01-27 18:28 UTC (permalink / raw)
To: Paolo Bonzini, Stephen Zhang, seanjc, vkuznets, wanpengli,
jmattson, joro, tglx, mingo, bp, x86, hpa
Cc: kvm, linux-kernel
On Wed, 2021-01-27 at 19:23 +0100, Paolo Bonzini wrote:
> On 27/01/21 18:25, Joe Perches wrote:
> >
> > -#ifdef MMU_DEBUG
> > -bool dbg = 0;
> > -module_param(dbg, bool, 0644);
> > -#endif
> > -
> > #define PTE_PREFETCH_NUM 8
> >
> >
> > #define PT32_LEVEL_BITS 10
> > @@ -844,17 +839,17 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
> > int i, count = 0;
> >
> >
> > if (!rmap_head->val) {
> > - rmap_printk("pte_list_add: %p %llx 0->1\n", spte, *spte);
> > + pr_debug("%p %llx 0->1\n", spte, *spte);
> > rmap_head->val = (unsigned long)spte;
> > } else if (!(rmap_head->val & 1)) {
> > - rmap_printk("pte_list_add: %p %llx 1->many\n", spte, *spte);
> > + pr_debug("%p %llx 1->many\n", spte, *spte);
> > desc = mmu_alloc_pte_list_desc(vcpu);
>
> This would be extremely slow. These messages are even too verbose for
> tracepoints.
There's no real object change.
It's not enabled unless DEBUG is defined (and it's not enabled by default)
or CONFIG_DYNAMIC_DEBUG is enabled and then dynamic_debug jump points are
used when not enabled so I think any slowdown, even when dynamic_debug is
enabled is trivial.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
2021-01-27 18:28 ` Joe Perches
@ 2021-01-28 8:24 ` Paolo Bonzini
0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2021-01-28 8:24 UTC (permalink / raw)
To: Joe Perches, Stephen Zhang, seanjc, vkuznets, wanpengli,
jmattson, joro, tglx, mingo, bp, x86, hpa
Cc: kvm, linux-kernel
On 27/01/21 19:28, Joe Perches wrote:
> It's not enabled unless DEBUG is defined (and it's not enabled by default)
> or CONFIG_DYNAMIC_DEBUG is enabled and then dynamic_debug jump points are
> used when not enabled so I think any slowdown, even when dynamic_debug is
> enabled is trivial.
Ah, I confused DEBUG with CONFIG_DEBUG_KERNEL. I'll post a patch, thanks!
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk()
2021-01-27 17:25 ` Joe Perches
2021-01-27 18:23 ` Paolo Bonzini
@ 2021-02-02 16:07 ` Paolo Bonzini
1 sibling, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2021-02-02 16:07 UTC (permalink / raw)
To: Joe Perches, Stephen Zhang, seanjc, vkuznets, wanpengli,
jmattson, joro, tglx, mingo, bp, x86, hpa
Cc: kvm, linux-kernel
On 27/01/21 18:25, Joe Perches wrote:
> On Wed, 2021-01-27 at 11:54 +0100, Paolo Bonzini wrote:
>> On 27/01/21 03:08, Stephen Zhang wrote:
>>> Given the common pattern:
>>>
>>> rmap_printk("%s:"..., __func__,...)
>>>
>>> we could improve this by adding '__func__' in rmap_printk().
>
> Currently, the MMU_DEBUG control is not defined so this isn't used.
>
> Another improvement would be to remove the macro altogether and
> rename the uses to the more standard style using pr_debug.
>
> arch/x86/kvm/mmu/mmu_internal.h-#undef MMU_DEBUG
> arch/x86/kvm/mmu/mmu_internal.h-
> arch/x86/kvm/mmu/mmu_internal.h-#ifdef MMU_DEBUG
> arch/x86/kvm/mmu/mmu_internal.h-extern bool dbg;
> arch/x86/kvm/mmu/mmu_internal.h-
> arch/x86/kvm/mmu/mmu_internal.h-#define pgprintk(x...) do { if (dbg) printk(x); } while (0)
> arch/x86/kvm/mmu/mmu_internal.h:#define rmap_printk(x...) do { if (dbg) printk(x); } while (0)
> arch/x86/kvm/mmu/mmu_internal.h-#define MMU_WARN_ON(x) WARN_ON(x)
> arch/x86/kvm/mmu/mmu_internal.h-#else
> arch/x86/kvm/mmu/mmu_internal.h-#define pgprintk(x...) do { } while (0)
> arch/x86/kvm/mmu/mmu_internal.h:#define rmap_printk(x...) do { } while (0)
> arch/x86/kvm/mmu/mmu_internal.h-#define MMU_WARN_ON(x) do { } while (0)
> arch/x86/kvm/mmu/mmu_internal.h-#endif
> arch/x86/kvm/mmu/mmu_internal.h-
>
> Also this define hasn't been set in quite awhile as there are
> format/argument mismatches in the code that use gpa_t that need
> to be converted from %lx to %llx with a cast to (u64)
>
> So I think this would be better as:
Joe, would you mind sending this out as a full patch with Signed-off-by?
Thanks,
Paolo
> ---
> arch/x86/kvm/mmu/mmu.c | 47 ++++++++++++++++++-----------------------
> arch/x86/kvm/mmu/mmu_internal.h | 10 +--------
> arch/x86/kvm/mmu/paging_tmpl.h | 10 ++++-----
> arch/x86/kvm/mmu/spte.c | 4 ++--
> 4 files changed, 28 insertions(+), 43 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 6d16481aa29d..54987bd64647 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -105,11 +105,6 @@ enum {
> AUDIT_POST_SYNC
> };
>
> -#ifdef MMU_DEBUG
> -bool dbg = 0;
> -module_param(dbg, bool, 0644);
> -#endif
> -
> #define PTE_PREFETCH_NUM 8
>
> #define PT32_LEVEL_BITS 10
> @@ -844,17 +839,17 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
> int i, count = 0;
>
> if (!rmap_head->val) {
> - rmap_printk("pte_list_add: %p %llx 0->1\n", spte, *spte);
> + pr_debug("%p %llx 0->1\n", spte, *spte);
> rmap_head->val = (unsigned long)spte;
> } else if (!(rmap_head->val & 1)) {
> - rmap_printk("pte_list_add: %p %llx 1->many\n", spte, *spte);
> + pr_debug("%p %llx 1->many\n", spte, *spte);
> desc = mmu_alloc_pte_list_desc(vcpu);
> desc->sptes[0] = (u64 *)rmap_head->val;
> desc->sptes[1] = spte;
> rmap_head->val = (unsigned long)desc | 1;
> ++count;
> } else {
> - rmap_printk("pte_list_add: %p %llx many->many\n", spte, *spte);
> + pr_debug("%p %llx many->many\n", spte, *spte);
> desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
> while (desc->sptes[PTE_LIST_EXT-1]) {
> count += PTE_LIST_EXT;
> @@ -906,14 +901,14 @@ static void __pte_list_remove(u64 *spte, struct kvm_rmap_head *rmap_head)
> pr_err("%s: %p 0->BUG\n", __func__, spte);
> BUG();
> } else if (!(rmap_head->val & 1)) {
> - rmap_printk("%s: %p 1->0\n", __func__, spte);
> + pr_debug("%p 1->0\n", spte);
> if ((u64 *)rmap_head->val != spte) {
> pr_err("%s: %p 1->BUG\n", __func__, spte);
> BUG();
> }
> rmap_head->val = 0;
> } else {
> - rmap_printk("%s: %p many->many\n", __func__, spte);
> + pr_debug("%p many->many\n", spte);
> desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
> prev_desc = NULL;
> while (desc) {
> @@ -1115,7 +1110,7 @@ static bool spte_write_protect(u64 *sptep, bool pt_protect)
> !(pt_protect && spte_can_locklessly_be_made_writable(spte)))
> return false;
>
> - rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep);
> + pr_debug("spte %p %llx\n", sptep, *sptep);
>
> if (pt_protect)
> spte &= ~SPTE_MMU_WRITEABLE;
> @@ -1142,7 +1137,7 @@ static bool spte_clear_dirty(u64 *sptep)
> {
> u64 spte = *sptep;
>
> - rmap_printk("rmap_clear_dirty: spte %p %llx\n", sptep, *sptep);
> + pr_debug("spte %p %llx\n", sptep, *sptep);
>
> MMU_WARN_ON(!spte_ad_enabled(spte));
> spte &= ~shadow_dirty_mask;
> @@ -1184,7 +1179,7 @@ static bool spte_set_dirty(u64 *sptep)
> {
> u64 spte = *sptep;
>
> - rmap_printk("rmap_set_dirty: spte %p %llx\n", sptep, *sptep);
> + pr_debug("spte %p %llx\n", sptep, *sptep);
>
> /*
> * Similar to the !kvm_x86_ops.slot_disable_log_dirty case,
> @@ -1331,7 +1326,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head)
> bool flush = false;
>
> while ((sptep = rmap_get_first(rmap_head, &iter))) {
> - rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep);
> + pr_debug("spte %p %llx.\n", sptep, *sptep);
>
> pte_list_remove(rmap_head, sptep);
> flush = true;
> @@ -1363,8 +1358,8 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head,
>
> restart:
> for_each_rmap_spte(rmap_head, &iter, sptep) {
> - rmap_printk("kvm_set_pte_rmapp: spte %p %llx gfn %llx (%d)\n",
> - sptep, *sptep, gfn, level);
> + pr_debug("spte %p %llx gfn %llx (%d)\n",
> + sptep, *sptep, gfn, level);
>
> need_flush = 1;
>
> @@ -1605,7 +1600,7 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva)
> return young;
> }
>
> -#ifdef MMU_DEBUG
> +#ifdef DEBUG
> static int is_empty_shadow_page(u64 *spt)
> {
> u64 *pos;
> @@ -2490,12 +2485,11 @@ int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn)
> LIST_HEAD(invalid_list);
> int r;
>
> - pgprintk("%s: looking for gfn %llx\n", __func__, gfn);
> + pr_debug("looking for gfn %llx\n", gfn);
> r = 0;
> spin_lock(&kvm->mmu_lock);
> for_each_gfn_indirect_valid_sp(kvm, sp, gfn) {
> - pgprintk("%s: gfn %llx role %x\n", __func__, gfn,
> - sp->role.word);
> + pr_debug("gfn %llx role %x\n", gfn, sp->role.word);
> r = 1;
> kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list);
> }
> @@ -2614,7 +2608,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
> int ret = RET_PF_FIXED;
> bool flush = false;
>
> - pgprintk("%s: spte %llx write_fault %d gfn %llx\n", __func__,
> + pr_debug("spte %llx write_fault %d gfn %llx\n",
> *sptep, write_fault, gfn);
>
> if (is_shadow_present_pte(*sptep)) {
> @@ -2630,7 +2624,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
> drop_parent_pte(child, sptep);
> flush = true;
> } else if (pfn != spte_to_pfn(*sptep)) {
> - pgprintk("hfn old %llx new %llx\n",
> + pr_debug("hfn old %llx new %llx\n",
> spte_to_pfn(*sptep), pfn);
> drop_spte(vcpu->kvm, sptep);
> flush = true;
> @@ -2662,7 +2656,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
> return RET_PF_SPURIOUS;
> }
>
> - pgprintk("%s: setting spte %llx\n", __func__, *sptep);
> + pr_debug("setting spte %llx\n", *sptep);
> trace_kvm_mmu_set_spte(level, gfn, sptep);
> if (!was_rmapped && is_large_pte(*sptep))
> ++vcpu->kvm->stat.lpages;
> @@ -3747,7 +3741,7 @@ static int direct_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code,
> static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa,
> u32 error_code, bool prefault)
> {
> - pgprintk("%s: gva %lx error %x\n", __func__, gpa, error_code);
> + pr_debug("gva %llx error %x\n", (u64)gpa, error_code);
>
> /* This path builds a PAE pagetable, we can map 2mb pages at maximum. */
> return direct_page_fault(vcpu, gpa & PAGE_MASK, error_code, prefault,
> @@ -4904,8 +4898,7 @@ static bool detect_write_misaligned(struct kvm_mmu_page *sp, gpa_t gpa,
> {
> unsigned offset, pte_size, misaligned;
>
> - pgprintk("misaligned: gpa %llx bytes %d role %x\n",
> - gpa, bytes, sp->role.word);
> + pr_debug("gpa %llx bytes %d role %x\n", gpa, bytes, sp->role.word);
>
> offset = offset_in_page(gpa);
> pte_size = sp->role.gpte_is_8_bytes ? 8 : 4;
> @@ -4990,7 +4983,7 @@ static void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
>
> remote_flush = local_flush = false;
>
> - pgprintk("%s: gpa %llx bytes %d\n", __func__, gpa, bytes);
> + pr_debug("gpa %llx bytes %d\n", gpa, bytes);
>
> /*
> * No need to care whether allocation memory is successful
> diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h
> index bfc6389edc28..095bdef63a03 100644
> --- a/arch/x86/kvm/mmu/mmu_internal.h
> +++ b/arch/x86/kvm/mmu/mmu_internal.h
> @@ -6,17 +6,9 @@
> #include <linux/kvm_host.h>
> #include <asm/kvm_host.h>
>
> -#undef MMU_DEBUG
> -
> -#ifdef MMU_DEBUG
> -extern bool dbg;
> -
> -#define pgprintk(x...) do { if (dbg) printk(x); } while (0)
> -#define rmap_printk(x...) do { if (dbg) printk(x); } while (0)
> +#ifdef DEBUG
> #define MMU_WARN_ON(x) WARN_ON(x)
> #else
> -#define pgprintk(x...) do { } while (0)
> -#define rmap_printk(x...) do { } while (0)
> #define MMU_WARN_ON(x) do { } while (0)
> #endif
>
> diff --git a/arch/x86/kvm/mmu/paging_tmpl.h b/arch/x86/kvm/mmu/paging_tmpl.h
> index 50e268eb8e1a..ecbb4e469c1e 100644
> --- a/arch/x86/kvm/mmu/paging_tmpl.h
> +++ b/arch/x86/kvm/mmu/paging_tmpl.h
> @@ -462,8 +462,8 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
> goto retry_walk;
> }
>
> - pgprintk("%s: pte %llx pte_access %x pt_access %x\n",
> - __func__, (u64)pte, walker->pte_access, walker->pt_access);
> + pr_debug("pte %llx pte_access %x pt_access %x\n",
> + (u64)pte, walker->pte_access, walker->pt_access);
> return 1;
>
> error:
> @@ -536,7 +536,7 @@ FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
> if (FNAME(prefetch_invalid_gpte)(vcpu, sp, spte, gpte))
> return false;
>
> - pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte);
> + pr_debug("gpte %llx spte %p\n", (u64)gpte, spte);
>
> gfn = gpte_to_gfn(gpte);
> pte_access = sp->role.access & FNAME(gpte_access)(gpte);
> @@ -794,7 +794,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code,
> bool map_writable, is_self_change_mapping;
> int max_level;
>
> - pgprintk("%s: addr %lx err %x\n", __func__, addr, error_code);
> + pr_debug("addr %llx err %x\n", (u64)addr, error_code);
>
> /*
> * If PFEC.RSVD is set, this is a shadow page fault.
> @@ -811,7 +811,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code,
> * The page is not mapped by the guest. Let the guest handle it.
> */
> if (!r) {
> - pgprintk("%s: guest page fault\n", __func__);
> + pr_debug("guest page fault\n");
> if (!prefault)
> kvm_inject_emulated_page_fault(vcpu, &walker.fault);
>
> diff --git a/arch/x86/kvm/mmu/spte.c b/arch/x86/kvm/mmu/spte.c
> index c51ad544f25b..23adcb93f6cc 100644
> --- a/arch/x86/kvm/mmu/spte.c
> +++ b/arch/x86/kvm/mmu/spte.c
> @@ -146,8 +146,8 @@ int make_spte(struct kvm_vcpu *vcpu, unsigned int pte_access, int level,
> goto out;
>
> if (mmu_need_write_protect(vcpu, gfn, can_unsync)) {
> - pgprintk("%s: found shadow page for %llx, marking ro\n",
> - __func__, gfn);
> + pr_debug("found shadow page for %llx, marking ro\n",
> + gfn);
> ret |= SET_SPTE_WRITE_PROTECTED_PT;
> pte_access &= ~ACC_WRITE_MASK;
> spte &= ~(PT_WRITABLE_MASK | SPTE_MMU_WRITEABLE);
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-02-02 16:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-27 2:08 [PATCH] KVM: x86/mmu: Add '__func__' in rmap_printk() Stephen Zhang
2021-01-27 10:54 ` Paolo Bonzini
2021-01-27 17:25 ` Joe Perches
2021-01-27 18:23 ` Paolo Bonzini
2021-01-27 18:28 ` Joe Perches
2021-01-28 8:24 ` Paolo Bonzini
2021-02-02 16:07 ` Paolo Bonzini
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).