Message ID | 20250321123938.802763-2-elena.reshetova@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Enable automatic SVN updates for SGX enclaves | expand |
On Fri, Mar 21, 2025 at 02:34:40PM +0200, Elena Reshetova wrote: > In order to successfully execute ENCLS[EUPDATESVN], EPC must be empty. > SGX already has a variable sgx_nr_free_pages that tracks free > EPC pages. Add a new variable, sgx_nr_total_pages, that will keep > track of total number of EPC pages. It will be used in subsequent > patch to change the sgx_nr_free_pages into sgx_nr_used_pages and > allow an easy check for an empty EPC. First off, remove "in subsequent patch". What does "change sgx_nr_free_pages into sgx_nr_used_pages" mean? > > Note: The serialization for sgx_nr_total_pages is not needed because > the variable is only updated during the initialization and there's no > concurrent access. > > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> > --- > arch/x86/kernel/cpu/sgx/main.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c > index 8ce352fc72ac..d5df67dab247 100644 > --- a/arch/x86/kernel/cpu/sgx/main.c > +++ b/arch/x86/kernel/cpu/sgx/main.c > @@ -33,6 +33,7 @@ static LIST_HEAD(sgx_active_page_list); > static DEFINE_SPINLOCK(sgx_reclaimer_lock); > > static atomic_long_t sgx_nr_free_pages = ATOMIC_LONG_INIT(0); > +static unsigned long sgx_nr_total_pages; > > /* Nodes with one or more EPC sections. */ > static nodemask_t sgx_numa_mask; > @@ -648,6 +649,8 @@ static bool __init sgx_setup_epc_section(u64 phys_addr, u64 size, > list_add_tail(§ion->pages[i].list, &sgx_dirty_page_list); > } > > + sgx_nr_total_pages += nr_pages; > + > return true; > } > > -- > 2.45.2 > BR, Jarkko
> On Fri, Mar 21, 2025 at 02:34:40PM +0200, Elena Reshetova wrote: > > In order to successfully execute ENCLS[EUPDATESVN], EPC must be empty. > > SGX already has a variable sgx_nr_free_pages that tracks free > > EPC pages. Add a new variable, sgx_nr_total_pages, that will keep > > track of total number of EPC pages. It will be used in subsequent > > patch to change the sgx_nr_free_pages into sgx_nr_used_pages and > > allow an easy check for an empty EPC. > > First off, remove "in subsequent patch". Ok > > What does "change sgx_nr_free_pages into sgx_nr_used_pages" mean? As you can see from patch 2/4, I had to turn around the meaning of the existing sgx_nr_free_pages atomic counter not to count the # of free pages in EPC, but to count the # of used EPC pages (hence the change of name to sgx_nr_used_pages). The reason for doing this is only apparent in patch 4/4 because by having a counter sgx_nr_used_pages incremented in the atomic_long_inc_not_zero, there is a fast path that avoids taking any locks in cases when the EPC page is not the first one to be created (most of cases). I originally created a version with just using sgx_nr_free_pages, but could not avoided taking a lock in each case and it did look much less pretty than this version. The credit for the idea btw goes to Kirill who kindly reviewed my patches before. Best Regards, Elena.
diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c index 8ce352fc72ac..d5df67dab247 100644 --- a/arch/x86/kernel/cpu/sgx/main.c +++ b/arch/x86/kernel/cpu/sgx/main.c @@ -33,6 +33,7 @@ static LIST_HEAD(sgx_active_page_list); static DEFINE_SPINLOCK(sgx_reclaimer_lock); static atomic_long_t sgx_nr_free_pages = ATOMIC_LONG_INIT(0); +static unsigned long sgx_nr_total_pages; /* Nodes with one or more EPC sections. */ static nodemask_t sgx_numa_mask; @@ -648,6 +649,8 @@ static bool __init sgx_setup_epc_section(u64 phys_addr, u64 size, list_add_tail(§ion->pages[i].list, &sgx_dirty_page_list); } + sgx_nr_total_pages += nr_pages; + return true; }
In order to successfully execute ENCLS[EUPDATESVN], EPC must be empty. SGX already has a variable sgx_nr_free_pages that tracks free EPC pages. Add a new variable, sgx_nr_total_pages, that will keep track of total number of EPC pages. It will be used in subsequent patch to change the sgx_nr_free_pages into sgx_nr_used_pages and allow an easy check for an empty EPC. Note: The serialization for sgx_nr_total_pages is not needed because the variable is only updated during the initialization and there's no concurrent access. Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> --- arch/x86/kernel/cpu/sgx/main.c | 3 +++ 1 file changed, 3 insertions(+)