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

Re: [PATCH V5] xen/gnttab: Store frame GFN in struct page_info on Arm


  • To: Oleksandr Tyshchenko <Oleksandr_Tyshchenko@xxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Wed, 9 Feb 2022 12:04:29 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; 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:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=9pn1dFbHAgujrZNDuCGd4SWDATTThjNWKJBsmA/6J4Q=; b=hJXfkHo8oa1kk5lSdNsHQDXK36xbwtYTlv3lB+0nV6o2u5D6BXN7vDAAapeH9q2BNL/ZINE7GJesR1MAycppOc8vWwg0xiJ8Qi+U4JlVcMqQ7PmsmEZjXNXbzjggXEVr9ZfKsLPb4nWzYSmUN8fAIvaouQ/5kGEM/MogAvJd2E5QmgY0sOYMofOgRkXia5BXxwWcpb1qYysfU0ochlsmewjLCA5jlnf4z5m2seaW6kgAWLDSSwGPmfJuW3lWxuiyrpB9MYVjJyB0xWMuh/JdE+1DlVq04ICnHrAf5hJaP3E2QZhwTg51fQhd8f/7atEl72Kr0xKzkmUTy4kSmxr5pg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fmFHiYnJkJYzfU43waRzJTu9EUXQmEew85X3/PeA5OBhiuUXqXbhpWmWApkgwbnCcWG9KbCtbe+2MszClBdobt4l532X0pbYBiELr6Ll+LZr4GjQgLR8uMWscXaKvnUJNzAG0f8Um+4p8T8z2KfdhwwBNmXWyXRUQ6Zg0moTCX8TN69kS0rkNhlGwMO3OtlqWHwKzX3y0keMfcpKRNQ3WPm1hWWnngZPLnCCKuOMnGzqhe2tUv+Fsm6VG4On5es/hnbv6cui1odgAxZuK7dGVBuhInIbPvwNahsosR1RjTpa+6Q/D13rA473qtOpM2C/todcfruYG3zhdwFO0QSEeg==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: Oleksandr Tyshchenko <olekstysh@xxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Bob Eshleman <bobbyeshleman@xxxxxxxxx>, Alistair Francis <alistair.francis@xxxxxxx>, Connor Davis <connojdavis@xxxxxxxxx>, Julien Grall <julien@xxxxxxx>
  • Delivery-date: Wed, 09 Feb 2022 11:04:50 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 09.02.2022 11:08, Oleksandr Tyshchenko wrote:
> 
> On 08.02.22 14:47, Jan Beulich wrote:
> 
> 
> Hi Julien, Jan
> 
> 
>> On 08.02.2022 12:58, Julien Grall wrote:
>>> On 07/02/2022 19:56, Oleksandr Tyshchenko wrote:
>>>> On 07.02.22 19:15, Julien Grall wrote:
>>>>> Hi Oleksandr,
>>>>> On 05/01/2022 23:11, Oleksandr Tyshchenko wrote:
>>>>>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>>>>>>
>>>>>> Rework Arm implementation to store grant table frame GFN
>>>>>> in struct page_info directly instead of keeping it in
>>>>>> standalone status/shared arrays. This patch is based on
>>>>>> the assumption that grant table page is the xenheap page.
>>>>> I would write "grant table pages are xenheap pages" or "a grant table
>>>>> page is a xenheap page".
>>>>>
>>>>> [...]
>>>>>
>>>>>> diff --git a/xen/arch/arm/include/asm/grant_table.h
>>>>>> b/xen/arch/arm/include/asm/grant_table.h
>>>>>> index d31a4d6..d6fda31 100644
>>>>>> --- a/xen/arch/arm/include/asm/grant_table.h
>>>>>> +++ b/xen/arch/arm/include/asm/grant_table.h
>>>>>> @@ -11,11 +11,6 @@
>>>>>>     #define INITIAL_NR_GRANT_FRAMES 1U
>>>>>>     #define GNTTAB_MAX_VERSION 1
>>>>>>     -struct grant_table_arch {
>>>>>> -    gfn_t *shared_gfn;
>>>>>> -    gfn_t *status_gfn;
>>>>>> -};
>>>>>> -
>>>>>>     static inline void gnttab_clear_flags(struct domain *d,
>>>>>>                                           unsigned int mask, uint16_t
>>>>>> *addr)
>>>>>>     {
>>>>>> @@ -46,41 +41,12 @@ int replace_grant_host_mapping(unsigned long
>>>>>> gpaddr, mfn_t mfn,
>>>>>>     #define gnttab_dom0_frames() \
>>>>>>         min_t(unsigned int, opt_max_grant_frames, PFN_DOWN(_etext -
>>>>>> _stext))
>>>>>>     -#define gnttab_init_arch(gt) \
>>>>>> -({ \
>>>>>> -    unsigned int ngf_ =
>>>>>> (gt)->max_grant_frames;                          \
>>>>>> -    unsigned int nsf_ =
>>>>>> grant_to_status_frames(ngf_);                    \
>>>>>> - \
>>>>>> -    (gt)->arch.shared_gfn = xmalloc_array(gfn_t,
>>>>>> ngf_);                  \
>>>>>> -    (gt)->arch.status_gfn = xmalloc_array(gfn_t,
>>>>>> nsf_);                  \
>>>>>> -    if ( (gt)->arch.shared_gfn && (gt)->arch.status_gfn
>>>>>> )                \
>>>>>> - { \
>>>>>> -        while ( ngf_--
>>>>>> )                                                 \
>>>>>> -            (gt)->arch.shared_gfn[ngf_] =
>>>>>> INVALID_GFN;                   \
>>>>>> -        while ( nsf_--
>>>>>> )                                                 \
>>>>>> -            (gt)->arch.status_gfn[nsf_] =
>>>>>> INVALID_GFN;                   \
>>>>>> - } \
>>>>>> - else \
>>>>>> - gnttab_destroy_arch(gt); \
>>>>>> -    (gt)->arch.shared_gfn ? 0 :
>>>>>> -ENOMEM;                                 \
>>>>>> -})
>>>>>> -
>>>>>> -#define gnttab_destroy_arch(gt) \
>>>>>> -    do { \
>>>>>> - XFREE((gt)->arch.shared_gfn); \
>>>>>> - XFREE((gt)->arch.status_gfn); \
>>>>>> -    } while ( 0 )
>>>>>> -
>>>>>>     #define gnttab_set_frame_gfn(gt, st, idx, gfn,
>>>>>> mfn)                      \
>>>>>> ({ \
>>>>>> -        int rc_ =
>>>>>> 0;                                                     \
>>>>>>             gfn_t ogfn = gnttab_get_frame_gfn(gt, st,
>>>>>> idx);                  \
>>>>>> -        if ( gfn_eq(ogfn, INVALID_GFN) || gfn_eq(ogfn, gfn)
>>>>>> ||           \
>>>>>> -             (rc_ = guest_physmap_remove_page((gt)->domain, ogfn,
>>>>>> mfn,   \
>>>>>> -                                              0)) == 0
>>>>>> )                 \
>>>>>> -            ((st) ?
>>>>>> (gt)->arch.status_gfn                                \
>>>>>> -                  : (gt)->arch.shared_gfn)[idx] =
>>>>>> (gfn);                 \
>>>>>> - rc_; \
>>>>>> +        (!gfn_eq(ogfn, INVALID_GFN) && !gfn_eq(ogfn,
>>>>>> gfn))               \
>>>>>> +         ? guest_physmap_remove_page((gt)->domain, ogfn, mfn,
>>>>>> 0)         \
>>>>>> +         :
>>>>>> 0;                                                            \
>>>>> Given that we are implementing something similar to an M2P, I was
>>>>> expecting the implementation to be pretty much the same as the x86
>>>>> helper.
>>>>>
>>>>> Would you be able to outline why it is different?
>>>> Being honest, I didn't think about it so far.  But, I agree with the
>>>> question.
>>>>
>>>> It feels to me that Arm variant can now behave as x86 one (as
>>>> xenmem_add_to_physmap_one() now checks for the prior mapping), I mean to
>>>> use INVALID_GFN as an indication to remove a page.
>>>>
>>>> What do you think?
>>> I will defer that to Jan.
>>>
>>> Jan, IIRC you were the one introducing the call to
>>> guest_physmap_remove_page(). Do you remember why the difference between
>>> x86 and Arm were necessary?
>> The code was different before, and Arm's behavior was also different.
>> Hence the two functions couldn't be quite similar. If Arm behavior is
>> now converging with x86'es, the functions becoming more similar is
>> not entirely unexpected.
> 
> If Arm's gnttab_set_frame_gfn appears to be the similar to x86's one, 
> what would be the next step?
> 
> I thought of the following options:
> 
> 1. Leave per-arch helpers as they are
> 2. Move helper to the common grant_table.h
> 3. Remove the helpers, call guest_physmap_remove_page() directly from 
> the common grant_table.c

Well, "similar" is not enough for 2 or 3, but if they end up identical,
then I guess 3 is the way to go unless we foresee e.g. RISC-V wanting
something different. But this would be a separate change, so the
similarity level of the two implementations can actually be easily
seen during review (or later when doing archaeology).

Jan




 


Rackspace

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