[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH v7 3/7] xen: introduce mark_page_free


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Penny Zheng <Penny.Zheng@xxxxxxx>
  • Date: Thu, 16 Sep 2021 03:13:40 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=1QavK+Rws1oseC5hjcMFJw17o0Ikj5T9DQ0fG5DM6Lk=; b=ENH/cCDMxaafveVA3gYidBoUS59PrFbFyCwIIQJIMLf82+QB0b4aMc63GbTQRZWLXYhgJhPfQZatO7/lWeBk34oHSmzdjAJ4xrwqQeIxxT0ki8byWFrTzzUnbHR3eJCKP2EHeg0qUyT8IczX0UMkwreHdwuYET7OeiNzYiR8I1gBkMxxTXnpZlU3as3ggaPtD/vmcHgNDTcoTVbyJnsEgx/Pa0LtaL6Ke0ypU0kFlBDnyJI/U94iNRGVwflVfk9pjV0x5zoXXJJWBAwSzz0bOC03pD8Wq+UjmvE4mVHt0LDAclvf+LM9WWvctgNJz17mqcQQgZZijd1hQ5uYH2YaZA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hCH0o4JD9xCUpK/FuVtm4izNKwnyauvDZeH6sybgR0z8W9Y8s575Pt24j7R8GQEWpL5RzSySNxjH5um0ep/0w8QQBpsHOY2UkR7UCmo8rUTiFbMp16p5bp1AiTTwJmaxHagoFXIGO5FHt4wBRQyDcdcACZhRepzB6piB8qS3OhVSD8GZ9D+n4x3Oog5mrZrgua0+j6QxN6CORSsGx9GN2CBOYpVM+JOouTYgPnQPBb+WAsomU0D9SorZ96djukzWX3myoEsmMTpICj7v3OkgFvAG76u1lMVhfQgfiAIYd2Md+Jd8j0c6bG8kYvXLmkYIjAFrtWd7AkqMxHNxWGCIQQ==
  • Authentication-results-original: suse.com; dkim=none (message not signed) header.d=none;suse.com; dmarc=none action=none header.from=arm.com;
  • Cc: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Wei Chen <Wei.Chen@xxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, "sstabellini@xxxxxxxxxx" <sstabellini@xxxxxxxxxx>, "julien@xxxxxxx" <julien@xxxxxxx>
  • Delivery-date: Thu, 16 Sep 2021 03:14:15 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: suse.com; dkim=none (message not signed) header.d=none;suse.com; dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHXqjl0kD+LuGbedUe7fBE0DC0ydaul+Iqg
  • Thread-topic: [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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.