[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v7 3/7] xen: introduce mark_page_free
Hi Jan Sorry for the broken. > -----Original Message----- > From: Jan Beulich <jbeulich@xxxxxxxx> > Sent: Wednesday, September 15, 2021 9:56 PM > To: Penny Zheng <Penny.Zheng@xxxxxxx> > Cc: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>; Wei Chen > <Wei.Chen@xxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx; > sstabellini@xxxxxxxxxx; julien@xxxxxxx > Subject: Re: [PATCH v7 3/7] xen: introduce mark_page_free > > On 10.09.2021 04:52, Penny Zheng wrote: > > This commit defines a new helper mark_page_free to extract common > > code, like following the same cache/TLB coherency policy, between > > free_heap_pages and the new function free_staticmem_pages, which will be > introduced later. > > > > The PDX compression makes that conversion between the MFN and the page > > can be potentially non-trivial. As the function is internal, pass the > > MFN and the page. They are both expected to match. > > > > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx> > > Acked-by: Jan Beulich <jbeulich@xxxxxxxx> > > Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx> > > --- > > xen/common/page_alloc.c | 89 > > ++++++++++++++++++++++------------------- > > 1 file changed, 48 insertions(+), 41 deletions(-) > > > > diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index > > 958ba0cd92..a3ee5eca9e 100644 > > --- a/xen/common/page_alloc.c > > +++ b/xen/common/page_alloc.c > > @@ -1376,6 +1376,53 @@ bool scrub_free_pages(void) > > return node_to_scrub(false) != NUMA_NO_NODE; } > > > > +static void mark_page_free(struct page_info *pg, mfn_t mfn) { > > + ASSERT(mfn_x(mfn) == mfn_x(page_to_mfn(pg))); > > + > > + /* > > + * Cannot assume that count_info == 0, as there are some corner cases > > + * where it isn't the case and yet it isn't a bug: > > + * 1. page_get_owner() is NULL > > + * 2. page_get_owner() is a domain that was never accessible by > > + * its domid (e.g., failed to fully construct the domain). > > + * 3. page was never addressable by the guest (e.g., it's an > > + * auto-translate-physmap guest and the page was never included > > + * in its pseudophysical address space). > > + * In all the above cases there can be no guest mappings of this page. > > + */ > > + switch ( pg->count_info & PGC_state ) > > + { > > + case PGC_state_inuse: > > + BUG_ON(pg->count_info & PGC_broken); > > + pg->count_info = PGC_state_free; > > + break; > > + > > + case PGC_state_offlining: > > + pg->count_info = (pg->count_info & PGC_broken) | > > + PGC_state_offlined; > > + tainted = 1; > > You've broken two things at the same time here: You write to the global > variable of this name now, while ... > > > @@ -1392,47 +1439,7 @@ static void free_heap_pages( > > > > for ( i = 0; i < (1 << order); i++ ) > > { > > - /* > > - * Cannot assume that count_info == 0, as there are some corner > > cases > > - * where it isn't the case and yet it isn't a bug: > > - * 1. page_get_owner() is NULL > > - * 2. page_get_owner() is a domain that was never accessible by > > - * its domid (e.g., failed to fully construct the domain). > > - * 3. page was never addressable by the guest (e.g., it's an > > - * auto-translate-physmap guest and the page was never included > > - * in its pseudophysical address space). > > - * In all the above cases there can be no guest mappings of this > > page. > > - */ > > - switch ( pg[i].count_info & PGC_state ) > > - { > > - case PGC_state_inuse: > > - BUG_ON(pg[i].count_info & PGC_broken); > > - pg[i].count_info = PGC_state_free; > > - break; > > - > > - case PGC_state_offlining: > > - pg[i].count_info = (pg[i].count_info & PGC_broken) | > > - PGC_state_offlined; > > - tainted = 1; > > ... the local variable here doesn't get written anymore. Which Coverity was > kind enough to point out - please reference Coverity ID 1491872 in the fix > that > I hope you will be able to provide quickly. (The easiest change would seem to > be to make mark_page_free() return bool, and set "tainted" to 1 here > accordingly.) > Sure. I'll fix it today and let mark_page_free() return the status of "tainted". > I understand that the two variables having the same name isn't very helpful. I > certainly wouldn't mind if you renamed the local one suitably. > I'll rename the local one to "pg_tainted" to tell the difference. > Jan Penny
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |