lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <55dba278-b4a8-4b5a-d5c6-feba81e5d5d4@arm.com>
Date:   Thu, 24 Aug 2023 17:54:28 +0100
From:   James Morse <james.morse@....com>
To:     Fenghua Yu <fenghua.yu@...el.com>, x86@...nel.org,
        linux-kernel@...r.kernel.org
Cc:     Reinette Chatre <reinette.chatre@...el.com>,
        Thomas Gleixner <tglx@...utronix.de>,
        Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
        H Peter Anvin <hpa@...or.com>,
        Babu Moger <Babu.Moger@....com>,
        shameerali.kolothum.thodi@...wei.com,
        D Scott Phillips OS <scott@...amperecomputing.com>,
        carl@...amperecomputing.com, lcherian@...vell.com,
        bobo.shaobowang@...wei.com, tan.shaopeng@...itsu.com,
        xingxin.hx@...nanolis.org, baolin.wang@...ux.alibaba.com,
        Jamie Iles <quic_jiles@...cinc.com>,
        Xin Hao <xhao@...ux.alibaba.com>, peternewman@...gle.com,
        dfustini@...libre.com
Subject: Re: [PATCH v5 08/24] x86/resctrl: Allocate the cleanest CLOSID by
 searching closid_num_dirty_rmid

Hi Fenghua,

On 15/08/2023 03:59, Fenghua Yu wrote:
> On 7/28/23 09:42, James Morse wrote:
>> MPAM's PMG bits extend its PARTID space, meaning the same PMG value can be
>> used for different control groups.
>>
>> This means once a CLOSID is allocated, all its monitoring ids may still be
>> dirty, and held in limbo.
>>
>> Instead of allocating the first free CLOSID, on architectures where
>> CONFIG_RESCTRL_RMID_DEPENDS_ON_COSID is enabled, search
>> closid_num_dirty_rmid[] to find the cleanest CLOSID.
>>
>> The CLOSID found is returned to closid_alloc() for the free list
>> to be updated.


>> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
>> index 44addc0126fc..c268aa5925c7 100644
>> --- a/arch/x86/kernel/cpu/resctrl/monitor.c
>> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c
>> @@ -379,6 +379,48 @@ static struct rmid_entry *resctrl_find_free_rmid(u32 closid)
>>       return ERR_PTR(-ENOSPC);
>>   }
>>   +/**
>> + * resctrl_find_cleanest_closid() - Find a CLOSID where all the associated
>> + *                                  RMID are clean, or the CLOSID that has
>> + *                                  the most clean RMID.
>> + *
>> + * MPAM's equivalent of RMID are per-CLOSID, meaning a freshly allocated CLOSID
>> + * may not be able to allocate clean RMID. To avoid this the allocator will
>> + * choose the CLOSID with the most clean RMID.
>> + *
>> + * When the CLOSID and RMID are independent numbers, the first free CLOSID will
>> + * be returned.
>> + */
>> +int resctrl_find_cleanest_closid(void)
>> +{
>> +    u32 cleanest_closid = ~0, iter_num_dirty;
>> +    int i = 0;
>> +
>> +    lockdep_assert_held(&rdtgroup_mutex);
>> +
>> +    if (!IS_ENABLED(CONFIG_RESCTRL_RMID_DEPENDS_ON_CLOSID))
>> +        return -EIO;
>> +
>> +    for (i = 0; i < closids_supported(); i++) {
>> +        if (closid_allocated(i))
>> +            continue;
>> +
>> +        iter_num_dirty = closid_num_dirty_rmid[i];
>> +        if (iter_num_dirty == 0)
>> +            return i;
>> +
>> +        if (cleanest_closid == ~0)
>> +            cleanest_closid = i;
>> +
>> +        if (iter_num_dirty < closid_num_dirty_rmid[cleanest_closid])
>> +            cleanest_closid = i;
>> +    }
>> +
>> +    if (cleanest_closid == ~0)
>> +        return -ENOSPC;
>> +    return cleanest_closid;
>> +}
>> +
> 
> resctrl_find_cleanest_closid() is not empty on x86 after compiled although it's very
> short. After all, the function is irrelevant to x86 and could be completely empty on x86.
> 
> If put the function in
> #ifdef CONFIG_RESCTRL_RMID_DEPENDS_ON_CLOSID
> resctrl_find_cleanest_closid()
> ...
> #else
> resctrl_find_cleanest_closid() {}
> #endif
> 
> It's fully empty on x86.

I think you forgot the return type. You'd still need to return an error in the stub -
which is what the existing function will be reduced to by the compilers dead code elimination.

Here is the existing function on x86:
| 0000000000000680 <resctrl_find_cleanest_closid>:
|  680:   f3 0f 1e fa             endbr64
|  684:   b8 fb ff ff ff          mov    $0xfffffffb,%eax
|  689:   e9 00 00 00 00          jmp    68e <resctrl_find_cleanest_closid+0xe>
|  68e:   66 90                   xchg   %ax,%ax
|  690:   90                      nop
|  691:   90                      nop
[and quite a few more nops]

and here is the stub you propose:
| int resctrl_find_cleanest_closid_as_a_stub(void)
| {
| 	return -EIO;
| }

which builds as:
| 00000000000006a0 <resctrl_find_cleanest_closid_as_a_stub>:
|  6a0:   f3 0f 1e fa             endbr64
|  6a4:   b8 fb ff ff ff          mov    $0xfffffffb,%eax
|  6a9:   e9 00 00 00 00          jmp    6ae <resctrl_find_cleanest_closid_as_a_s>
|  6ae:   66 90                   xchg   %ax,%ax
|  6b0:   90                      nop
|  6b1:   90                      nop
[and quite a few more nops]

The only difference is the #ifdeffery makes this hard to read, and means CI systems need
extra Kconfig files to get good coverage of this code.

It's not the 90s anymore: we no-one wants to see an #ifdef!


James

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ