Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On Tue, 28 Jul 2015, Julien Grall wrote: > Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN > is meant, I suspect this is because the first support for Xen was for > PV. This brough some misimplementation of helpers on ARM and make the > developper confused the expected behavior. > > For instance, with pfn_to_mfn, we expect to get an MFN based on the name. > Although, if we look at the implementation on x86, it's returning a GFN. > > For clarity and avoid new confusion, replace any reference of mfn into > gnf in any helpers used by PV drivers. > > Take also the opportunity to simplify simple construction such > as pfn_to_mfn(page_to_pfn(page)) into page_to_gfn. More complex clean up > will come in follow-up patches. > > I think it may be possible to do further clean up in the x86 code to > ensure that helpers returning machine address (such as virt_address) is > not used by no auto-translated guests. I will let x86 xen expert doing > it. > > [1] Xen tree: e758ed14f390342513405dd766e874934573e6cb > > Signed-off-by: Julien Grall Aside from the many typos Reviewed-by: Stefano Stabellini > arch/arm/include/asm/xen/page.h | 13 +++-- > arch/x86/include/asm/xen/page.h | 30 -- > arch/x86/xen/enlighten.c| 4 ++-- > arch/x86/xen/mmu.c | 16 > arch/x86/xen/p2m.c | 32 > arch/x86/xen/setup.c| 12 ++-- > arch/x86/xen/smp.c | 4 ++-- > arch/x86/xen/suspend.c | 8 > drivers/block/xen-blkfront.c| 6 +++--- > drivers/input/misc/xen-kbdfront.c | 4 ++-- > drivers/net/xen-netback/netback.c | 4 ++-- > drivers/net/xen-netfront.c | 8 > drivers/scsi/xen-scsifront.c| 8 +++- > drivers/tty/hvc/hvc_xen.c | 5 +++-- > drivers/video/fbdev/xen-fbfront.c | 4 ++-- > drivers/xen/balloon.c | 2 +- > drivers/xen/events/events_base.c| 2 +- > drivers/xen/events/events_fifo.c| 4 ++-- > drivers/xen/gntalloc.c | 3 ++- > drivers/xen/manage.c| 2 +- > drivers/xen/tmem.c | 4 ++-- > drivers/xen/xenbus/xenbus_client.c | 2 +- > drivers/xen/xenbus/xenbus_dev_backend.c | 2 +- > drivers/xen/xenbus/xenbus_probe.c | 8 +++- > include/xen/page.h | 4 ++-- > 25 files changed, 96 insertions(+), 95 deletions(-) > > diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h > index 493471f..f542f68 100644 > --- a/arch/arm/include/asm/xen/page.h > +++ b/arch/arm/include/asm/xen/page.h > @@ -34,14 +34,15 @@ typedef struct xpaddr { > unsigned long __pfn_to_mfn(unsigned long pfn); > extern struct rb_root phys_to_mach; > > -static inline unsigned long pfn_to_mfn(unsigned long pfn) > +/* Pseudo-physical <-> Guest conversion */ > +static inline unsigned long pfn_to_gfn(unsigned long pfn) > { > return pfn; > } > > -static inline unsigned long mfn_to_pfn(unsigned long mfn) > +static inline unsigned long gfn_to_pfn(unsigned long gfn) > { > - return mfn; > + return gfn; > } > > /* Pseudo-physical <-> DMA conversion */ > @@ -65,9 +66,9 @@ static inline unsigned long dfn_to_pfn(unsigned long dfn) > > #define dfn_to_local_pfn(dfn)dfn_to_pfn(dfn) > > -/* VIRT <-> MACHINE conversion */ > -#define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v))) > -#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) > +/* VIRT <-> GUEST conversion */ > +#define virt_to_gfn(v) (pfn_to_gfn(virt_to_pfn(v))) > +#define gfn_to_virt(m) (__va(gfn_to_pfn(m) << PAGE_SHIFT)) > > /* Only used in PV code. However ARM guest is always assimilated as HVM. */ > static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr) > diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h > index 046e91a..72d9f15 100644 > --- a/arch/x86/include/asm/xen/page.h > +++ b/arch/x86/include/asm/xen/page.h > @@ -99,7 +99,7 @@ static inline unsigned long __pfn_to_mfn(unsigned long pfn) > return mfn; > } > > -static inline unsigned long pfn_to_mfn(unsigned long pfn) > +static inline unsigned long pfn_to_gfn(unsigned long pfn) > { > unsigned long mfn; > > @@ -145,23 +145,23 @@ static inline unsigned long > mfn_to_pfn_no_overrides(unsigned long mfn) > return pfn; > } > > -static inline unsigned long mfn_to_pfn(unsigned long mfn) > +static inline unsigned long gfn_to_pfn(unsigned long gfn) > { > unsigned long pfn; > > if (xen_feature(XENFEAT_auto_translated_physmap)) > - return mfn; > + return gfn; > > - pfn = mfn_to_pfn_no_overrides(mfn); > - if (__pfn_to_mfn(pfn) != mfn) > + pfn = mfn_to_pfn_no_overrides(gf
Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 07/29/2015 10:23 AM, Julien Grall wrote: On 29/07/15 15:14, Boris Ostrovsky wrote: static inline unsigned long pfn_to_gfn(unsigned long pfn) { if (xen_feature(XENFEAT_autotranslated_physmap)) return pfn; else return pfn_to_mfn(pfn); } But you'd still say 'op.arg1.mfn = pfn_to_gfn(pfn);' in xen_do_pin() i.e. assign GFN to MFN, right? That's what I was referring to. Well no. I would use op.arg1.mfn = pfn_to_mfn(pfn) given that the code, if I'm right, is only executed for PV. mfn = pfn_to_gfn(...) was valid too because on PV is always an MFN. The suggestion of pfn_to_mfn was just for more readability, Right, and my comments were also not about correctness. (In general, I am not sure a guest should ever use 'mfn' as it is purely a hypervisor construct. Including p2m, which I think should really be p2g as this is what we use to figure out what to stick into page tables) I think avoid to use mfn in the hypervisor interface is out-of-scope for this series. If we ever want to modify the Xen API in Linux, we should do in sync with Xen to avoid inconsistency on naming. Anyway, the oddity of mfn = pfn_to_gfn(...) is mostly contained in the x86 specific code. I don't mind to either add pfn_to_mfn and use it or add a comment /* PV-specific so mfn == gfn */ for every use of mfn = pfn_to_gfn(...). I think the former is better (even thought it adds a test) -boris ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 29/07/15 15:14, Boris Ostrovsky wrote: >> static inline unsigned long pfn_to_gfn(unsigned long pfn) >> { >> if (xen_feature(XENFEAT_autotranslated_physmap)) >> return pfn; >> else >> return pfn_to_mfn(pfn); >> } > > > But you'd still say 'op.arg1.mfn = pfn_to_gfn(pfn);' in xen_do_pin() > i.e. assign GFN to MFN, right? That's what I was referring to. Well no. I would use op.arg1.mfn = pfn_to_mfn(pfn) given that the code, if I'm right, is only executed for PV. mfn = pfn_to_gfn(...) was valid too because on PV is always an MFN. The suggestion of pfn_to_mfn was just for more readability, > (In general, I am not sure a guest should ever use 'mfn' as it is purely > a hypervisor construct. Including p2m, which I think should really be > p2g as this is what we use to figure out what to stick into page tables) I think avoid to use mfn in the hypervisor interface is out-of-scope for this series. If we ever want to modify the Xen API in Linux, we should do in sync with Xen to avoid inconsistency on naming. Anyway, the oddity of mfn = pfn_to_gfn(...) is mostly contained in the x86 specific code. I don't mind to either add pfn_to_mfn and use it or add a comment /* PV-specific so mfn == gfn */ for every use of mfn = pfn_to_gfn(...). Regards, -- Julien Grall ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 07/29/2015 07:25 AM, Julien Grall wrote: Hi Boris, On 28/07/15 20:12, Boris Ostrovsky wrote: On 07/28/2015 11:02 AM, Julien Grall wrote: Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN is meant, I suspect this is because the first support for Xen was for PV. This brough some misimplementation of helpers on ARM and make the developper confused the expected behavior. For instance, with pfn_to_mfn, we expect to get an MFN based on the name. Although, if we look at the implementation on x86, it's returning a GFN. For clarity and avoid new confusion, replace any reference of mfn into gnf in any helpers used by PV drivers. @@ -730,7 +730,7 @@ static void xen_do_pin(unsigned level, unsigned long pfn) struct mmuext_op op; op.cmd = level; -op.arg1.mfn = pfn_to_mfn(pfn); +op.arg1.mfn = pfn_to_gfn(pfn); This looks slightly odd. It is correct but given that purpose of this series is to make things more clear perhaps we can add another union member (gfn) to mmuext_op.arg1? (Of course, the hypervisor will continue referring to mfn which could still be confusing) This operation is only used for PV guests, right? IHMO re-introducing pfn_to_mfn for PV-guests only (i.e with a BUG_ON to ensure no usage for auto-translated guest) would be the best solution. It would avoid to have different name than the hypersivor one in the hypercall interface. It will also make clear that virt_to_machine & co is only PV specific. I though doing this but I preferred to defer it to x86 expert as my knowledge for x86 Xen is very limited. I don't know where it's more suitable to use MFN or GFN. I guess this file (mmu.c) is mostly PV specific? Would something like below fine for you? static inline unsigned long pfn_to_mfn(unsigned long pfn) { unsigned long mfn; BUG_ON(xen_feature(XENFEAT_auto_translated_physmap)); mfn = __pfn_to_mfn(pfn); if (mfn != INVALID_P2M_ENTRY) mfn &= ~(FOREIGN_FRAME_BIT | IDENTITY_FRAME_BIT); return mfn; } static inline unsigned long pfn_to_gfn(unsigned long pfn) { if (xen_feature(XENFEAT_autotranslated_physmap)) return pfn; else return pfn_to_mfn(pfn); } But you'd still say 'op.arg1.mfn = pfn_to_gfn(pfn);' in xen_do_pin() i.e. assign GFN to MFN, right? That's what I was referring to. (In general, I am not sure a guest should ever use 'mfn' as it is purely a hypervisor construct. Including p2m, which I think should really be p2g as this is what we use to figure out what to stick into page tables) -boris Similar splitting would be done for gfn_to_pfn and mfn_to_pfn. Regards, ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On Wed, Jul 29, 2015 at 12:35:54PM +0100, Julien Grall wrote: > Hi Wei, > > On 29/07/15 11:13, Wei Liu wrote: > > On Tue, Jul 28, 2015 at 04:02:45PM +0100, Julien Grall wrote: > > [...] > >> diff --git a/drivers/net/xen-netback/netback.c > >> b/drivers/net/xen-netback/netback.c > >> index 7d50711..3b7b7c3 100644 > >> --- a/drivers/net/xen-netback/netback.c > >> +++ b/drivers/net/xen-netback/netback.c > >> @@ -314,7 +314,7 @@ static void xenvif_gop_frag_copy(struct xenvif_queue > >> *queue, struct sk_buff *skb > >>} else { > >>copy_gop->source.domid = DOMID_SELF; > >>copy_gop->source.u.gmfn = > >> - virt_to_mfn(page_address(page)); > >> + virt_to_gfn(page_address(page)); > >>} > >>copy_gop->source.offset = offset; > >> > >> @@ -1284,7 +1284,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue > >> *queue, > >>queue->tx_copy_ops[*copy_ops].source.offset = txreq.offset; > >> > >>queue->tx_copy_ops[*copy_ops].dest.u.gmfn = > >> - virt_to_mfn(skb->data); > >> + virt_to_gfn(skb->data); > >>queue->tx_copy_ops[*copy_ops].dest.domid = DOMID_SELF; > >>queue->tx_copy_ops[*copy_ops].dest.offset = > >>offset_in_page(skb->data); > > > > Reviewed-by: Wei Liu > > > > One possible improvement is to change gmfn in copy_gop to gfn as well. > > But that's outside of netback code. > > The structure gnttab_copy is part of the hypervisor interface. Is it > fine to differ on the naming between Xen and Linux? > > Or maybe we could do the change in the public headers in Xen repo too. > Is it fine to do field renaming in public headers? > Oh well. Never mind then. I mistook that structure as internal to Linux. Wei. > Regards, > > -- > Julien Grall ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On Tue, Jul 28, 2015 at 04:02:45PM +0100, Julien Grall wrote: [...] > diff --git a/drivers/net/xen-netback/netback.c > b/drivers/net/xen-netback/netback.c > index 7d50711..3b7b7c3 100644 > --- a/drivers/net/xen-netback/netback.c > +++ b/drivers/net/xen-netback/netback.c > @@ -314,7 +314,7 @@ static void xenvif_gop_frag_copy(struct xenvif_queue > *queue, struct sk_buff *skb > } else { > copy_gop->source.domid = DOMID_SELF; > copy_gop->source.u.gmfn = > - virt_to_mfn(page_address(page)); > + virt_to_gfn(page_address(page)); > } > copy_gop->source.offset = offset; > > @@ -1284,7 +1284,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue > *queue, > queue->tx_copy_ops[*copy_ops].source.offset = txreq.offset; > > queue->tx_copy_ops[*copy_ops].dest.u.gmfn = > - virt_to_mfn(skb->data); > + virt_to_gfn(skb->data); > queue->tx_copy_ops[*copy_ops].dest.domid = DOMID_SELF; > queue->tx_copy_ops[*copy_ops].dest.offset = > offset_in_page(skb->data); Reviewed-by: Wei Liu One possible improvement is to change gmfn in copy_gop to gfn as well. But that's outside of netback code. Wei. ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 29/07/15 12:35, Julien Grall wrote: > Hi Wei, > > On 29/07/15 11:13, Wei Liu wrote: >> On Tue, Jul 28, 2015 at 04:02:45PM +0100, Julien Grall wrote: >> [...] >>> diff --git a/drivers/net/xen-netback/netback.c >>> b/drivers/net/xen-netback/netback.c >>> index 7d50711..3b7b7c3 100644 >>> --- a/drivers/net/xen-netback/netback.c >>> +++ b/drivers/net/xen-netback/netback.c >>> @@ -314,7 +314,7 @@ static void xenvif_gop_frag_copy(struct xenvif_queue >>> *queue, struct sk_buff *skb >>> } else { >>> copy_gop->source.domid = DOMID_SELF; >>> copy_gop->source.u.gmfn = >>> - virt_to_mfn(page_address(page)); >>> + virt_to_gfn(page_address(page)); >>> } >>> copy_gop->source.offset = offset; >>> >>> @@ -1284,7 +1284,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue >>> *queue, >>> queue->tx_copy_ops[*copy_ops].source.offset = txreq.offset; >>> >>> queue->tx_copy_ops[*copy_ops].dest.u.gmfn = >>> - virt_to_mfn(skb->data); >>> + virt_to_gfn(skb->data); >>> queue->tx_copy_ops[*copy_ops].dest.domid = DOMID_SELF; >>> queue->tx_copy_ops[*copy_ops].dest.offset = >>> offset_in_page(skb->data); >> >> Reviewed-by: Wei Liu >> >> One possible improvement is to change gmfn in copy_gop to gfn as well. >> But that's outside of netback code. > > The structure gnttab_copy is part of the hypervisor interface. Is it > fine to differ on the naming between Xen and Linux? > > Or maybe we could do the change in the public headers in Xen repo too. > Is it fine to do field renaming in public headers? I think this series should not alter than Xen API. David ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
Hi Wei, On 29/07/15 11:13, Wei Liu wrote: > On Tue, Jul 28, 2015 at 04:02:45PM +0100, Julien Grall wrote: > [...] >> diff --git a/drivers/net/xen-netback/netback.c >> b/drivers/net/xen-netback/netback.c >> index 7d50711..3b7b7c3 100644 >> --- a/drivers/net/xen-netback/netback.c >> +++ b/drivers/net/xen-netback/netback.c >> @@ -314,7 +314,7 @@ static void xenvif_gop_frag_copy(struct xenvif_queue >> *queue, struct sk_buff *skb >> } else { >> copy_gop->source.domid = DOMID_SELF; >> copy_gop->source.u.gmfn = >> -virt_to_mfn(page_address(page)); >> +virt_to_gfn(page_address(page)); >> } >> copy_gop->source.offset = offset; >> >> @@ -1284,7 +1284,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue >> *queue, >> queue->tx_copy_ops[*copy_ops].source.offset = txreq.offset; >> >> queue->tx_copy_ops[*copy_ops].dest.u.gmfn = >> -virt_to_mfn(skb->data); >> +virt_to_gfn(skb->data); >> queue->tx_copy_ops[*copy_ops].dest.domid = DOMID_SELF; >> queue->tx_copy_ops[*copy_ops].dest.offset = >> offset_in_page(skb->data); > > Reviewed-by: Wei Liu > > One possible improvement is to change gmfn in copy_gop to gfn as well. > But that's outside of netback code. The structure gnttab_copy is part of the hypervisor interface. Is it fine to differ on the naming between Xen and Linux? Or maybe we could do the change in the public headers in Xen repo too. Is it fine to do field renaming in public headers? Regards, -- Julien Grall ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
Hi Chris, On 28/07/15 20:39, Chris (Christopher) Brand wrote: >> Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN is >> meant, >> I suspect this is because the first support for Xen was for PV. This brough >> some > Typo : "brought" > Perhaps "resulted in" would be better ? > >> misimplementation of helpers on ARM and make the developper confused the >> expected behavior. > Typo: "developer". > I'd also suggest "...and confused developers about the...". > > [...] > >> For clarity and avoid new confusion, replace any reference of mfn into gnf >> in any helpers used by PV drivers. > Typo : "gfn" > I'd suggest "...replace any reference to mfn with gfn..." > > [...] Thanks for telling me the typoes. I will fix it in the next version of this series. Regards, -- Julien Grall ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
Hi Boris, On 28/07/15 20:12, Boris Ostrovsky wrote: > On 07/28/2015 11:02 AM, Julien Grall wrote: >> Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN >> is meant, I suspect this is because the first support for Xen was for >> PV. This brough some misimplementation of helpers on ARM and make the >> developper confused the expected behavior. >> >> For instance, with pfn_to_mfn, we expect to get an MFN based on the name. >> Although, if we look at the implementation on x86, it's returning a GFN. >> >> For clarity and avoid new confusion, replace any reference of mfn into >> gnf in any helpers used by PV drivers. > > > > >> @@ -730,7 +730,7 @@ static void xen_do_pin(unsigned level, unsigned >> long pfn) >> struct mmuext_op op; >> >> op.cmd = level; >> -op.arg1.mfn = pfn_to_mfn(pfn); >> +op.arg1.mfn = pfn_to_gfn(pfn); > > > This looks slightly odd. It is correct but given that purpose of this > series is to make things more clear perhaps we can add another union > member (gfn) to mmuext_op.arg1? > > (Of course, the hypervisor will continue referring to mfn which could > still be confusing) This operation is only used for PV guests, right? IHMO re-introducing pfn_to_mfn for PV-guests only (i.e with a BUG_ON to ensure no usage for auto-translated guest) would be the best solution. It would avoid to have different name than the hypersivor one in the hypercall interface. It will also make clear that virt_to_machine & co is only PV specific. I though doing this but I preferred to defer it to x86 expert as my knowledge for x86 Xen is very limited. I don't know where it's more suitable to use MFN or GFN. I guess this file (mmu.c) is mostly PV specific? Would something like below fine for you? static inline unsigned long pfn_to_mfn(unsigned long pfn) { unsigned long mfn; BUG_ON(xen_feature(XENFEAT_auto_translated_physmap)); mfn = __pfn_to_mfn(pfn); if (mfn != INVALID_P2M_ENTRY) mfn &= ~(FOREIGN_FRAME_BIT | IDENTITY_FRAME_BIT); return mfn; } static inline unsigned long pfn_to_gfn(unsigned long pfn) { if (xen_feature(XENFEAT_autotranslated_physmap)) return pfn; else return pfn_to_mfn(pfn); } Similar splitting would be done for gfn_to_pfn and mfn_to_pfn. Regards, -- Julien Grall ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 28/07/15 18:16, David Vrabel wrote: > On 28/07/15 16:02, Julien Grall wrote: >> Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN >> is meant, I suspect this is because the first support for Xen was for >> PV. This brough some misimplementation of helpers on ARM and make the >> developper confused the expected behavior. > > For the benefit of other subsystem maintainers, this is a purely > mechanical change in Xen-specific terminology. It doesn't need reviews > or acks from non-Xen people (IMO). > >> For instance, with pfn_to_mfn, we expect to get an MFN based on the name. >> Although, if we look at the implementation on x86, it's returning a GFN. >> >> For clarity and avoid new confusion, replace any reference of mfn into >> gnf in any helpers used by PV drivers. >> >> Take also the opportunity to simplify simple construction such >> as pfn_to_mfn(page_to_pfn(page)) into page_to_gfn. More complex clean up >> will come in follow-up patches. >> >> I think it may be possible to do further clean up in the x86 code to >> ensure that helpers returning machine address (such as virt_address) is >> not used by no auto-translated guests. I will let x86 xen expert doing >> it. > > Reviewed-by: David Vrabel > > It looks a bit odd to use GFN in some of the PV code where the > hypervisor API uses MFN but overall I think using the correct > terminology where possible is best. But I'd like to have Boris's or > Konrad's opinion on this. I was thinking to introduce mfn_to_pfn & co which would be used only for PV-guest (a BUG_ON would be here to ensure it) and hypercall related. I didn't do it as I haven't much knowledge on x86 Xen and was able to decide where I have to use pfn_to_mfn. Regards, -- Julien Grall ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
RE: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
> Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN is > meant, > I suspect this is because the first support for Xen was for PV. This brough > some Typo : "brought" Perhaps "resulted in" would be better ? > misimplementation of helpers on ARM and make the developper confused the > expected behavior. Typo: "developer". I'd also suggest "...and confused developers about the...". [...] > For clarity and avoid new confusion, replace any reference of mfn into gnf in > any helpers used by PV drivers. Typo : "gfn" I'd suggest "...replace any reference to mfn with gfn..." [...] Chris ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 07/28/2015 11:02 AM, Julien Grall wrote: Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN is meant, I suspect this is because the first support for Xen was for PV. This brough some misimplementation of helpers on ARM and make the developper confused the expected behavior. For instance, with pfn_to_mfn, we expect to get an MFN based on the name. Although, if we look at the implementation on x86, it's returning a GFN. For clarity and avoid new confusion, replace any reference of mfn into gnf in any helpers used by PV drivers. @@ -730,7 +730,7 @@ static void xen_do_pin(unsigned level, unsigned long pfn) struct mmuext_op op; op.cmd = level; - op.arg1.mfn = pfn_to_mfn(pfn); + op.arg1.mfn = pfn_to_gfn(pfn); This looks slightly odd. It is correct but given that purpose of this series is to make things more clear perhaps we can add another union member (gfn) to mmuext_op.arg1? (Of course, the hypervisor will continue referring to mfn which could still be confusing) xen_extend_mmuext_op(&op); } @@ -1323,7 +1323,7 @@ static void __xen_write_cr3(bool kernel, unsigned long cr3) trace_xen_mmu_write_cr3(kernel, cr3); if (cr3) - mfn = pfn_to_mfn(PFN_DOWN(cr3)); + mfn = pfn_to_gfn(PFN_DOWN(cr3)); Here too. And further down, thoughout this patch. -boris ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [Xen-devel] [PATCH 4/8] xen: Use the correctly the Xen memory terminologies
On 28/07/15 16:02, Julien Grall wrote: > Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN > is meant, I suspect this is because the first support for Xen was for > PV. This brough some misimplementation of helpers on ARM and make the > developper confused the expected behavior. For the benefit of other subsystem maintainers, this is a purely mechanical change in Xen-specific terminology. It doesn't need reviews or acks from non-Xen people (IMO). > For instance, with pfn_to_mfn, we expect to get an MFN based on the name. > Although, if we look at the implementation on x86, it's returning a GFN. > > For clarity and avoid new confusion, replace any reference of mfn into > gnf in any helpers used by PV drivers. > > Take also the opportunity to simplify simple construction such > as pfn_to_mfn(page_to_pfn(page)) into page_to_gfn. More complex clean up > will come in follow-up patches. > > I think it may be possible to do further clean up in the x86 code to > ensure that helpers returning machine address (such as virt_address) is > not used by no auto-translated guests. I will let x86 xen expert doing > it. Reviewed-by: David Vrabel It looks a bit odd to use GFN in some of the PV code where the hypervisor API uses MFN but overall I think using the correct terminology where possible is best. But I'd like to have Boris's or Konrad's opinion on this. David ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[PATCH 4/8] xen: Use the correctly the Xen memory terminologies
Based on include/xen/mm.h [1], Linux is mistakenly using MFN when GFN is meant, I suspect this is because the first support for Xen was for PV. This brough some misimplementation of helpers on ARM and make the developper confused the expected behavior. For instance, with pfn_to_mfn, we expect to get an MFN based on the name. Although, if we look at the implementation on x86, it's returning a GFN. For clarity and avoid new confusion, replace any reference of mfn into gnf in any helpers used by PV drivers. Take also the opportunity to simplify simple construction such as pfn_to_mfn(page_to_pfn(page)) into page_to_gfn. More complex clean up will come in follow-up patches. I think it may be possible to do further clean up in the x86 code to ensure that helpers returning machine address (such as virt_address) is not used by no auto-translated guests. I will let x86 xen expert doing it. [1] Xen tree: e758ed14f390342513405dd766e874934573e6cb Signed-off-by: Julien Grall Cc: Stefano Stabellini Cc: Russell King Cc: Konrad Rzeszutek Wilk Cc: Boris Ostrovsky Cc: David Vrabel Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: x...@kernel.org Cc: "Roger Pau Monné" Cc: Dmitry Torokhov Cc: Ian Campbell Cc: Wei Liu Cc: Juergen Gross Cc: "James E.J. Bottomley" Cc: Greg Kroah-Hartman Cc: Jiri Slaby Cc: Jean-Christophe Plagniol-Villard Cc: Tomi Valkeinen Cc: linux-in...@vger.kernel.org Cc: net...@vger.kernel.org Cc: linux-s...@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-fb...@vger.kernel.org Cc: linux-arm-ker...@lists.infradead.org --- arch/arm/include/asm/xen/page.h | 13 +++-- arch/x86/include/asm/xen/page.h | 30 -- arch/x86/xen/enlighten.c| 4 ++-- arch/x86/xen/mmu.c | 16 arch/x86/xen/p2m.c | 32 arch/x86/xen/setup.c| 12 ++-- arch/x86/xen/smp.c | 4 ++-- arch/x86/xen/suspend.c | 8 drivers/block/xen-blkfront.c| 6 +++--- drivers/input/misc/xen-kbdfront.c | 4 ++-- drivers/net/xen-netback/netback.c | 4 ++-- drivers/net/xen-netfront.c | 8 drivers/scsi/xen-scsifront.c| 8 +++- drivers/tty/hvc/hvc_xen.c | 5 +++-- drivers/video/fbdev/xen-fbfront.c | 4 ++-- drivers/xen/balloon.c | 2 +- drivers/xen/events/events_base.c| 2 +- drivers/xen/events/events_fifo.c| 4 ++-- drivers/xen/gntalloc.c | 3 ++- drivers/xen/manage.c| 2 +- drivers/xen/tmem.c | 4 ++-- drivers/xen/xenbus/xenbus_client.c | 2 +- drivers/xen/xenbus/xenbus_dev_backend.c | 2 +- drivers/xen/xenbus/xenbus_probe.c | 8 +++- include/xen/page.h | 4 ++-- 25 files changed, 96 insertions(+), 95 deletions(-) diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h index 493471f..f542f68 100644 --- a/arch/arm/include/asm/xen/page.h +++ b/arch/arm/include/asm/xen/page.h @@ -34,14 +34,15 @@ typedef struct xpaddr { unsigned long __pfn_to_mfn(unsigned long pfn); extern struct rb_root phys_to_mach; -static inline unsigned long pfn_to_mfn(unsigned long pfn) +/* Pseudo-physical <-> Guest conversion */ +static inline unsigned long pfn_to_gfn(unsigned long pfn) { return pfn; } -static inline unsigned long mfn_to_pfn(unsigned long mfn) +static inline unsigned long gfn_to_pfn(unsigned long gfn) { - return mfn; + return gfn; } /* Pseudo-physical <-> DMA conversion */ @@ -65,9 +66,9 @@ static inline unsigned long dfn_to_pfn(unsigned long dfn) #define dfn_to_local_pfn(dfn) dfn_to_pfn(dfn) -/* VIRT <-> MACHINE conversion */ -#define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v))) -#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) +/* VIRT <-> GUEST conversion */ +#define virt_to_gfn(v) (pfn_to_gfn(virt_to_pfn(v))) +#define gfn_to_virt(m) (__va(gfn_to_pfn(m) << PAGE_SHIFT)) /* Only used in PV code. However ARM guest is always assimilated as HVM. */ static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr) diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 046e91a..72d9f15 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h @@ -99,7 +99,7 @@ static inline unsigned long __pfn_to_mfn(unsigned long pfn) return mfn; } -static inline unsigned long pfn_to_mfn(unsigned long pfn) +static inline unsigned long pfn_to_gfn(unsigned long pfn) { unsigned long mfn; @@ -145,23 +145,23 @@ static inline unsigned long mfn_to_pfn_no_overrides(unsigned long mfn) return pfn; } -static inline unsigned long mfn_to_pfn(unsigned long mfn) +static inline unsigned long gfn_to_pfn(unsigned long gfn)