Message ID | 20221202183655.3767674-4-kristen@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add Cgroup support for SGX EPC memory | expand |
On 12/2/22 10:36, Kristen Carlson Accardi wrote: > Introduce a data structure to wrap the existing reclaimable list > and its spinlock in a struct to minimize the code changes needed > to handle multiple LRUs as well as reclaimable and non-reclaimable > lists, both of which will be introduced and used by SGX EPC cgroups. > > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > Cc: Sean Christopherson <seanjc@google.com> Tiny nits: Let's also allude to the fact that this doesn't do anything with the new helpers or structures for now. I also think it's probably a sane idea to mention that the core VM also has parallel LRU lists for cgroups. > +static inline struct sgx_epc_page * > +sgx_epc_pop_reclaimable(struct sgx_epc_lru_lists *lrus) > +{ > + return __sgx_epc_page_list_pop(&(lrus)->reclaimable); > +} Are those '(lrus)' parenthesis doing anything useful?
On Fri, Dec 02, 2022 at 10:36:39AM -0800, Kristen Carlson Accardi wrote: > Introduce a data structure to wrap the existing reclaimable list > and its spinlock in a struct to minimize the code changes needed > to handle multiple LRUs as well as reclaimable and non-reclaimable > lists, both of which will be introduced and used by SGX EPC cgroups. > > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > Cc: Sean Christopherson <seanjc@google.com> > --- > arch/x86/kernel/cpu/sgx/sgx.h | 65 +++++++++++++++++++++++++++++++++++ > 1 file changed, 65 insertions(+) > > diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h > index 39cb15a8abcb..5e6d88438fae 100644 > --- a/arch/x86/kernel/cpu/sgx/sgx.h > +++ b/arch/x86/kernel/cpu/sgx/sgx.h > @@ -90,6 +90,71 @@ static inline void *sgx_get_epc_virt_addr(struct sgx_epc_page *page) > return section->virt_addr + index * PAGE_SIZE; > } > > +/* > + * This data structure wraps a list of reclaimable EPC pages, and a list of > + * non-reclaimable EPC pages and is used to implement a LRU policy during > + * reclamation. > + */ > +struct sgx_epc_lru_lists { > + spinlock_t lock; > + struct list_head reclaimable; > + struct list_head unreclaimable; > +}; Why this is named like this, and not sgx_epc_global_rcu? Are there any other use cases? BR, Jarkko
On Thu, 2022-12-08 at 15:31 +0000, Jarkko Sakkinen wrote: > On Fri, Dec 02, 2022 at 10:36:39AM -0800, Kristen Carlson Accardi > wrote: > > Introduce a data structure to wrap the existing reclaimable list > > and its spinlock in a struct to minimize the code changes needed > > to handle multiple LRUs as well as reclaimable and non-reclaimable > > lists, both of which will be introduced and used by SGX EPC > > cgroups. > > > > Signed-off-by: Sean Christopherson > > <sean.j.christopherson@intel.com> > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > > Cc: Sean Christopherson <seanjc@google.com> > > --- > > arch/x86/kernel/cpu/sgx/sgx.h | 65 > > +++++++++++++++++++++++++++++++++++ > > 1 file changed, 65 insertions(+) > > > > diff --git a/arch/x86/kernel/cpu/sgx/sgx.h > > b/arch/x86/kernel/cpu/sgx/sgx.h > > index 39cb15a8abcb..5e6d88438fae 100644 > > --- a/arch/x86/kernel/cpu/sgx/sgx.h > > +++ b/arch/x86/kernel/cpu/sgx/sgx.h > > @@ -90,6 +90,71 @@ static inline void *sgx_get_epc_virt_addr(struct > > sgx_epc_page *page) > > return section->virt_addr + index * PAGE_SIZE; > > } > > > > +/* > > + * This data structure wraps a list of reclaimable EPC pages, and > > a list of > > + * non-reclaimable EPC pages and is used to implement a LRU policy > > during > > + * reclamation. > > + */ > > +struct sgx_epc_lru_lists { > > + spinlock_t lock; > > + struct list_head reclaimable; > > + struct list_head unreclaimable; > > +}; > > Why this is named like this, and not sgx_epc_global_rcu? Are there > any other use cases? > > BR, Jarkko Yes, there are other use cases that are introduced in the other patches. This structure is used to in the cgroup struct to hold cgroup specific LRUs.
diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h index 39cb15a8abcb..5e6d88438fae 100644 --- a/arch/x86/kernel/cpu/sgx/sgx.h +++ b/arch/x86/kernel/cpu/sgx/sgx.h @@ -90,6 +90,71 @@ static inline void *sgx_get_epc_virt_addr(struct sgx_epc_page *page) return section->virt_addr + index * PAGE_SIZE; } +/* + * This data structure wraps a list of reclaimable EPC pages, and a list of + * non-reclaimable EPC pages and is used to implement a LRU policy during + * reclamation. + */ +struct sgx_epc_lru_lists { + spinlock_t lock; + struct list_head reclaimable; + struct list_head unreclaimable; +}; + +static inline void sgx_lru_init(struct sgx_epc_lru_lists *lrus) +{ + spin_lock_init(&lrus->lock); + INIT_LIST_HEAD(&lrus->reclaimable); + INIT_LIST_HEAD(&lrus->unreclaimable); +} + +/* + * Must be called with queue lock acquired + */ +static inline void __sgx_epc_page_list_push(struct list_head *list, struct sgx_epc_page *page) +{ + list_add_tail(&page->list, list); +} + +/* + * Must be called with queue lock acquired + */ +static inline struct sgx_epc_page * __sgx_epc_page_list_pop(struct list_head *list) +{ + struct sgx_epc_page *epc_page; + + if (list_empty(list)) + return NULL; + + epc_page = list_first_entry(list, struct sgx_epc_page, list); + list_del_init(&epc_page->list); + return epc_page; +} + +static inline struct sgx_epc_page * +sgx_epc_pop_reclaimable(struct sgx_epc_lru_lists *lrus) +{ + return __sgx_epc_page_list_pop(&(lrus)->reclaimable); +} + +static inline void sgx_epc_push_reclaimable(struct sgx_epc_lru_lists *lrus, + struct sgx_epc_page *page) +{ + __sgx_epc_page_list_push(&(lrus)->reclaimable, page); +} + +static inline struct sgx_epc_page * +sgx_epc_pop_unreclaimable(struct sgx_epc_lru_lists *lrus) +{ + return __sgx_epc_page_list_pop(&(lrus)->unreclaimable); +} + +static inline void sgx_epc_push_unreclaimable(struct sgx_epc_lru_lists *lrus, + struct sgx_epc_page *page) +{ + __sgx_epc_page_list_push(&(lrus)->unreclaimable, page); +} + struct sgx_epc_page *__sgx_alloc_epc_page(void); void sgx_free_epc_page(struct sgx_epc_page *page);