Message ID | 20200521090428.11425-1-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86/shadow: Reposition sh_remove_write_access_from_sl1p() | expand |
> -----Original Message----- > From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of Andrew Cooper > Sent: 21 May 2020 10:04 > To: Xen-devel <xen-devel@lists.xenproject.org> > Cc: Andrew Cooper <andrew.cooper3@citrix.com>; Tim Deegan <tim@xen.org>; Wei Liu <wl@xen.org>; Jan > Beulich <JBeulich@suse.com>; Roger Pau Monné <roger.pau@citrix.com> > Subject: [PATCH] x86/shadow: Reposition sh_remove_write_access_from_sl1p() > > When compiling with SHOPT_OUT_OF_SYNC disabled, the build fails with: > > common.c:41:12: error: ‘sh_remove_write_access_from_sl1p’ declared ‘static’ but never defined [- > Werror=unused-function] > static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > due to an unguarded forward declaration. Is this, perhaps, an argument for making SHADOW_OPTIMIZATIONS tunable via Kconfig so that randconfig could catch things like this? Paul > > It turns out there is no need to forward declare > sh_remove_write_access_from_sl1p() to begin with, so move it to just ahead of > its first users, which is within a larger #ifdef'd SHOPT_OUT_OF_SYNC block. > > Fix up for style while moving it. No functional change. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > --- > CC: Jan Beulich <JBeulich@suse.com> > CC: Wei Liu <wl@xen.org> > CC: Roger Pau Monné <roger.pau@citrix.com> > CC: Tim Deegan <tim@xen.org> > --- > xen/arch/x86/mm/shadow/common.c | 56 ++++++++++++++++++----------------------- > 1 file changed, 25 insertions(+), 31 deletions(-) > > diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c > index 0ac3f880e1..6dff240e97 100644 > --- a/xen/arch/x86/mm/shadow/common.c > +++ b/xen/arch/x86/mm/shadow/common.c > @@ -38,9 +38,6 @@ > #include <xen/numa.h> > #include "private.h" > > -static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > - mfn_t smfn, unsigned long offset); > - > DEFINE_PER_CPU(uint32_t,trace_shadow_path_flags); > > static int sh_enable_log_dirty(struct domain *, bool log_global); > @@ -252,6 +249,31 @@ static inline void _sh_resync_l1(struct vcpu *v, mfn_t gmfn, mfn_t snpmfn) > SHADOW_INTERNAL_NAME(sh_resync_l1, 4)(v, gmfn, snpmfn); > } > > +static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > + mfn_t smfn, unsigned long off) > +{ > + struct page_info *sp = mfn_to_page(smfn); > + > + ASSERT(mfn_valid(smfn)); > + ASSERT(mfn_valid(gmfn)); > + > + if ( sp->u.sh.type == SH_type_l1_32_shadow || > + sp->u.sh.type == SH_type_fl1_32_shadow ) > + return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 2) > + (d, gmfn, smfn, off); > + > + if ( sp->u.sh.type == SH_type_l1_pae_shadow || > + sp->u.sh.type == SH_type_fl1_pae_shadow ) > + return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 3) > + (d, gmfn, smfn, off); > + > + if ( sp->u.sh.type == SH_type_l1_64_shadow || > + sp->u.sh.type == SH_type_fl1_64_shadow ) > + return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 4) > + (d, gmfn, smfn, off); > + > + return 0; > +} > > /* > * Fixup arrays: We limit the maximum number of writable mappings to > @@ -2001,34 +2023,6 @@ int sh_remove_write_access(struct domain *d, mfn_t gmfn, > } > #endif /* CONFIG_HVM */ > > -#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC) > -static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > - mfn_t smfn, unsigned long off) > -{ > - struct page_info *sp = mfn_to_page(smfn); > - > - ASSERT(mfn_valid(smfn)); > - ASSERT(mfn_valid(gmfn)); > - > - if ( sp->u.sh.type == SH_type_l1_32_shadow > - || sp->u.sh.type == SH_type_fl1_32_shadow ) > - { > - return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p,2) > - (d, gmfn, smfn, off); > - } > - else if ( sp->u.sh.type == SH_type_l1_pae_shadow > - || sp->u.sh.type == SH_type_fl1_pae_shadow ) > - return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p,3) > - (d, gmfn, smfn, off); > - else if ( sp->u.sh.type == SH_type_l1_64_shadow > - || sp->u.sh.type == SH_type_fl1_64_shadow ) > - return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p,4) > - (d, gmfn, smfn, off); > - > - return 0; > -} > -#endif > - > /**************************************************************************/ > /* Remove all mappings of a guest frame from the shadow tables. > * Returns non-zero if we need to flush TLBs. */ > -- > 2.11.0 >
On 21/05/2020 11:12, Paul Durrant wrote: >> -----Original Message----- >> From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of Andrew Cooper >> Sent: 21 May 2020 10:04 >> To: Xen-devel <xen-devel@lists.xenproject.org> >> Cc: Andrew Cooper <andrew.cooper3@citrix.com>; Tim Deegan <tim@xen.org>; Wei Liu <wl@xen.org>; Jan >> Beulich <JBeulich@suse.com>; Roger Pau Monné <roger.pau@citrix.com> >> Subject: [PATCH] x86/shadow: Reposition sh_remove_write_access_from_sl1p() >> >> When compiling with SHOPT_OUT_OF_SYNC disabled, the build fails with: >> >> common.c:41:12: error: ‘sh_remove_write_access_from_sl1p’ declared ‘static’ but never defined [- >> Werror=unused-function] >> static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> due to an unguarded forward declaration. > Is this, perhaps, an argument for making SHADOW_OPTIMIZATIONS tunable via Kconfig so that randconfig could catch things like this? Given enough TUITS, yes. ~Andrew
On Thu, May 21, 2020 at 10:04:28AM +0100, Andrew Cooper wrote: > When compiling with SHOPT_OUT_OF_SYNC disabled, the build fails with: > > common.c:41:12: error: ‘sh_remove_write_access_from_sl1p’ declared ‘static’ but never defined [-Werror=unused-function] > static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > due to an unguarded forward declaration. > > It turns out there is no need to forward declare > sh_remove_write_access_from_sl1p() to begin with, so move it to just ahead of > its first users, which is within a larger #ifdef'd SHOPT_OUT_OF_SYNC block. > > Fix up for style while moving it. No functional change. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> > --- > CC: Jan Beulich <JBeulich@suse.com> > CC: Wei Liu <wl@xen.org> > CC: Roger Pau Monné <roger.pau@citrix.com> > CC: Tim Deegan <tim@xen.org> > --- > xen/arch/x86/mm/shadow/common.c | 56 ++++++++++++++++++----------------------- > 1 file changed, 25 insertions(+), 31 deletions(-) > > diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c > index 0ac3f880e1..6dff240e97 100644 > --- a/xen/arch/x86/mm/shadow/common.c > +++ b/xen/arch/x86/mm/shadow/common.c > @@ -38,9 +38,6 @@ > #include <xen/numa.h> > #include "private.h" > > -static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > - mfn_t smfn, unsigned long offset); > - > DEFINE_PER_CPU(uint32_t,trace_shadow_path_flags); > > static int sh_enable_log_dirty(struct domain *, bool log_global); > @@ -252,6 +249,31 @@ static inline void _sh_resync_l1(struct vcpu *v, mfn_t gmfn, mfn_t snpmfn) > SHADOW_INTERNAL_NAME(sh_resync_l1, 4)(v, gmfn, snpmfn); > } > > +static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > + mfn_t smfn, unsigned long off) > +{ > + struct page_info *sp = mfn_to_page(smfn); > + > + ASSERT(mfn_valid(smfn)); > + ASSERT(mfn_valid(gmfn)); > + > + if ( sp->u.sh.type == SH_type_l1_32_shadow || > + sp->u.sh.type == SH_type_fl1_32_shadow ) Using a switch would also be nice IMO and would avoid some of the code churn. Thanks, Roger.
On 21/05/2020 11:26, Roger Pau Monné wrote: > On Thu, May 21, 2020 at 10:04:28AM +0100, Andrew Cooper wrote: >> When compiling with SHOPT_OUT_OF_SYNC disabled, the build fails with: >> >> common.c:41:12: error: ‘sh_remove_write_access_from_sl1p’ declared ‘static’ but never defined [-Werror=unused-function] >> static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> due to an unguarded forward declaration. >> >> It turns out there is no need to forward declare >> sh_remove_write_access_from_sl1p() to begin with, so move it to just ahead of >> its first users, which is within a larger #ifdef'd SHOPT_OUT_OF_SYNC block. >> >> Fix up for style while moving it. No functional change. >> >> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> > >> --- >> CC: Jan Beulich <JBeulich@suse.com> >> CC: Wei Liu <wl@xen.org> >> CC: Roger Pau Monné <roger.pau@citrix.com> >> CC: Tim Deegan <tim@xen.org> >> --- >> xen/arch/x86/mm/shadow/common.c | 56 ++++++++++++++++++----------------------- >> 1 file changed, 25 insertions(+), 31 deletions(-) >> >> diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c >> index 0ac3f880e1..6dff240e97 100644 >> --- a/xen/arch/x86/mm/shadow/common.c >> +++ b/xen/arch/x86/mm/shadow/common.c >> @@ -38,9 +38,6 @@ >> #include <xen/numa.h> >> #include "private.h" >> >> -static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, >> - mfn_t smfn, unsigned long offset); >> - >> DEFINE_PER_CPU(uint32_t,trace_shadow_path_flags); >> >> static int sh_enable_log_dirty(struct domain *, bool log_global); >> @@ -252,6 +249,31 @@ static inline void _sh_resync_l1(struct vcpu *v, mfn_t gmfn, mfn_t snpmfn) >> SHADOW_INTERNAL_NAME(sh_resync_l1, 4)(v, gmfn, snpmfn); >> } >> >> +static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, >> + mfn_t smfn, unsigned long off) >> +{ >> + struct page_info *sp = mfn_to_page(smfn); >> + >> + ASSERT(mfn_valid(smfn)); >> + ASSERT(mfn_valid(gmfn)); >> + >> + if ( sp->u.sh.type == SH_type_l1_32_shadow || >> + sp->u.sh.type == SH_type_fl1_32_shadow ) > Using a switch would also be nice IMO and would avoid some of the code > churn. Good point. Happy to do that if Tim agrees (but I won't bother sending a v2 just now). ~Andrew
On Thu, May 21, 2020 at 11:32:04AM +0100, Andrew Cooper wrote: > On 21/05/2020 11:26, Roger Pau Monné wrote: > > On Thu, May 21, 2020 at 10:04:28AM +0100, Andrew Cooper wrote: > >> +static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > >> + mfn_t smfn, unsigned long off) > >> +{ > >> + struct page_info *sp = mfn_to_page(smfn); > >> + > >> + ASSERT(mfn_valid(smfn)); > >> + ASSERT(mfn_valid(gmfn)); > >> + > >> + if ( sp->u.sh.type == SH_type_l1_32_shadow || > >> + sp->u.sh.type == SH_type_fl1_32_shadow ) > > Using a switch would also be nice IMO and would avoid some of the code > > churn. > > Good point. Happy to do that if Tim agrees (but I won't bother sending > a v2 just now). Sure, feel free to keep my RB after that. Roger.
At 10:04 +0100 on 21 May (1590055468), Andrew Cooper wrote: > When compiling with SHOPT_OUT_OF_SYNC disabled, the build fails with: > > common.c:41:12: error: ‘sh_remove_write_access_from_sl1p’ declared ‘static’ but never defined [-Werror=unused-function] > static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > due to an unguarded forward declaration. > > It turns out there is no need to forward declare > sh_remove_write_access_from_sl1p() to begin with, so move it to just ahead of > its first users, which is within a larger #ifdef'd SHOPT_OUT_OF_SYNC block. > > Fix up for style while moving it. No functional change. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Thank you! This is fine, either as-is or with the suggested change to a switch. Reviewed-by: Tim Deegan <tim@xen.org>
diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 0ac3f880e1..6dff240e97 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -38,9 +38,6 @@ #include <xen/numa.h> #include "private.h" -static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, - mfn_t smfn, unsigned long offset); - DEFINE_PER_CPU(uint32_t,trace_shadow_path_flags); static int sh_enable_log_dirty(struct domain *, bool log_global); @@ -252,6 +249,31 @@ static inline void _sh_resync_l1(struct vcpu *v, mfn_t gmfn, mfn_t snpmfn) SHADOW_INTERNAL_NAME(sh_resync_l1, 4)(v, gmfn, snpmfn); } +static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, + mfn_t smfn, unsigned long off) +{ + struct page_info *sp = mfn_to_page(smfn); + + ASSERT(mfn_valid(smfn)); + ASSERT(mfn_valid(gmfn)); + + if ( sp->u.sh.type == SH_type_l1_32_shadow || + sp->u.sh.type == SH_type_fl1_32_shadow ) + return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 2) + (d, gmfn, smfn, off); + + if ( sp->u.sh.type == SH_type_l1_pae_shadow || + sp->u.sh.type == SH_type_fl1_pae_shadow ) + return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 3) + (d, gmfn, smfn, off); + + if ( sp->u.sh.type == SH_type_l1_64_shadow || + sp->u.sh.type == SH_type_fl1_64_shadow ) + return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 4) + (d, gmfn, smfn, off); + + return 0; +} /* * Fixup arrays: We limit the maximum number of writable mappings to @@ -2001,34 +2023,6 @@ int sh_remove_write_access(struct domain *d, mfn_t gmfn, } #endif /* CONFIG_HVM */ -#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC) -static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, - mfn_t smfn, unsigned long off) -{ - struct page_info *sp = mfn_to_page(smfn); - - ASSERT(mfn_valid(smfn)); - ASSERT(mfn_valid(gmfn)); - - if ( sp->u.sh.type == SH_type_l1_32_shadow - || sp->u.sh.type == SH_type_fl1_32_shadow ) - { - return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p,2) - (d, gmfn, smfn, off); - } - else if ( sp->u.sh.type == SH_type_l1_pae_shadow - || sp->u.sh.type == SH_type_fl1_pae_shadow ) - return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p,3) - (d, gmfn, smfn, off); - else if ( sp->u.sh.type == SH_type_l1_64_shadow - || sp->u.sh.type == SH_type_fl1_64_shadow ) - return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p,4) - (d, gmfn, smfn, off); - - return 0; -} -#endif - /**************************************************************************/ /* Remove all mappings of a guest frame from the shadow tables. * Returns non-zero if we need to flush TLBs. */
When compiling with SHOPT_OUT_OF_SYNC disabled, the build fails with: common.c:41:12: error: ‘sh_remove_write_access_from_sl1p’ declared ‘static’ but never defined [-Werror=unused-function] static int sh_remove_write_access_from_sl1p(struct domain *d, mfn_t gmfn, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ due to an unguarded forward declaration. It turns out there is no need to forward declare sh_remove_write_access_from_sl1p() to begin with, so move it to just ahead of its first users, which is within a larger #ifdef'd SHOPT_OUT_OF_SYNC block. Fix up for style while moving it. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Jan Beulich <JBeulich@suse.com> CC: Wei Liu <wl@xen.org> CC: Roger Pau Monné <roger.pau@citrix.com> CC: Tim Deegan <tim@xen.org> --- xen/arch/x86/mm/shadow/common.c | 56 ++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 31 deletions(-)