|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 7/8] xen/riscv: page table handling
On 25.09.2024 16:50, oleksii.kurochko@xxxxxxxxx wrote:
> On Wed, 2024-09-25 at 16:22 +0200, Jan Beulich wrote:
>> On 25.09.2024 12:07, oleksii.kurochko@xxxxxxxxx wrote:
>>> On Tue, 2024-09-24 at 15:31 +0200, Jan Beulich wrote:
>>>> On 24.09.2024 13:30, oleksii.kurochko@xxxxxxxxx wrote:
>>>>> On Tue, 2024-09-24 at 12:49 +0200, Jan Beulich wrote:
>>>>>> On 13.09.2024 17:57, Oleksii Kurochko wrote:
>>>>>>> +static int pt_next_level(bool alloc_tbl, pte_t **table,
>>>>>>> unsigned
>>>>>>> int offset)
>>>>>>> +{
>>>>>>> + pte_t *entry;
>>>>>>> + mfn_t mfn;
>>>>>>> +
>>>>>>> + entry = *table + offset;
>>>>>>> +
>>>>>>> + if ( !pte_is_valid(*entry) )
>>>>>>> + {
>>>>>>> + if ( !alloc_tbl )
>>>>>>> + return XEN_TABLE_MAP_FAILED;
>>>>>>> +
>>>>>>> + if ( create_table(entry) )
>>>>>>> + return XEN_TABLE_MAP_FAILED;
>>>>>>
>>>>>> You're still losing the -ENOMEM here.
>>>>> Agree, I will save the return value of create_table and return
>>>>> it.
>>>>
>>>> That won't work very well, will it?
>>> I think it will work, just will be needed another one check in
>>> pt_update_entry() where pt_next_level() is called:
>>> if ( (rc == XEN_TABLE_MAP_FAILED) || (rc == -ENOMEM) )
>>> ...
>>
>> Yet that's precisely why I said "won't work very well": You're now
>> having
>> rc in two entirely distinct number spaces (XEN_TABLE_MAP_* and -E*).
>> That's imo just calling for trouble down the road. Unless you
>> emphasized
>> this aspect pretty well in a comment.
>>
>>>> Imo you need a new XEN_TABLE_MAP_NOMEM.
>>>> (And then XEN_TABLE_MAP_FAILED may want renaming to e.g.
>>>> XEN_TABLE_MAP_NONE).
>>> I am still curious if we really need this separation. If to in this
>>> way
>>> then it should be updated the check in pt_update_entry():
>>> --- a/xen/arch/riscv/pt.c
>>> +++ b/xen/arch/riscv/pt.c
>>> @@ -165,10 +165,10 @@ static int pt_next_level(bool alloc_tbl,
>>> pte_t
>>> **table, unsigned int offset)
>>> if ( !pte_is_valid(*entry) )
>>> {
>>> if ( !alloc_tbl )
>>> - return XEN_TABLE_MAP_FAILED;
>>> + return XEN_TABLE_MAP_NONE;
>>>
>>> if ( create_table(entry) )
>>> - return XEN_TABLE_MAP_FAILED;
>>> + return XEN_TABLE_MAP_NOMEM;
>>> }
>>>
>>> if ( pte_is_mapping(*entry) )
>>> @@ -209,7 +209,7 @@ static int pt_update_entry(mfn_t root,
>>> unsigned
>>> long virt,
>>> for ( ; level > target; level-- )
>>> {
>>> rc = pt_next_level(alloc_tbl, &table, offsets[level]);
>>> - if ( rc == XEN_TABLE_MAP_FAILED )
>>> + if ( (rc == XEN_TABLE_MAP_NONE) && (rc ==
>>> XEN_TABLE_MAP_NOMEM)
>>> )
>>> {
>>> rc = 0;
>>> But the handling of XEN_TABLE_MAP_NONE and XEN_TABLE_MAP_NOMEM
>>> seems to
>>> me should be left the same as this one part of the code actually
>>> catching the case when create_table() returns -ENOMEM:
>>> pt_next_level()
>>> {
>>> ...
>>> if ( flags & (PTE_VALID | PTE_POPULATE) )
>>> {
>>> dprintk(XENLOG_ERR,
>>> "%s: Unable to map level %u\n",
>>> __func__,
>>> level);
>>> rc = -ENOMEM;
>>> }
>>
>> Except that you want to avoid "inventing" an error code when you were
>> handed one. Just consider what happens to this code if another -E...
>> could also come back from the helper.
> I think we can drop the usage of -ENOMEM in the helper create_table()
> by returning XEN_TABLE_MAP_FAILED in case of failure, with a
> redefinition of XEN_TABLE_MAP_FAILED = 1, XEN_TABLE_SUPER_PAGE = 2, and
> XEN_TABLE_NORMAL = 3, as value 0 is used to indicate that everything is
> okay.
>
> We can leave the pt_update() code as it is now:
> ...
> if ( flags & (PTE_VALID | PTE_POPULATE) )
> {
> dprintk(XENLOG_ERR,
> "%s: Unable to map level %u\n", __func__, level);
> rc = -ENOMEM;
> }
> ...
>
> Because for the end user, it's better to receive the error code from
> xen/errno.h rather than a custom error code introduced nearby the
> helper.
>
> Does it make sense?
While I think I see where you're coming from, I still don't agree. And
I never suggested to bubble up some custom error indication. Up the call
chain it wants to be -ENOMEM, sure. Yet keying its generation to
flags & (PTE_VALID | PTE_POPULATE) is both less obvious and more fragile
(towards future code changes) than keying it to rc == XEN_TABLE_MAP_NOMEM.
If I can't convince you, then so be it. Yet then I'm also not very likely
to ack this patch of yours (which of course won't mean I wouldn't further
look at other aspects of the change, hopefully at least making it easier
for someone else to ack it).
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |