On Wed Sep 13, 2023 at 7:06 AM EEST, Haitao Huang wrote: > From: Kristen Carlson Accardi <kristen@xxxxxxxxxxxxxxx> > > Introduce a data structure to wrap the existing reclaimable list and its > spinlock. Each cgroup later will have one instance of this structure to > track EPC pages allocated for processes associated with the same cgroup. > Just like the global SGX reclaimer (ksgxd), an EPC cgroup reclaims pages > from the reclaimable list in this structure when its usage reaches near > its limit. > > Currently, ksgxd does not track the VA, SECS pages. They are considered > as 'unreclaimable' pages that are only deallocated when their respective > owning enclaves are destroyed and all associated resources released. > > When an EPC cgroup can not reclaim any more reclaimable EPC pages to > reduce its usage below its limit, the cgroup must also reclaim those > unreclaimables by killing their owning enclaves. The VA and SECS pages > later are also tracked in an 'unreclaimable' list added to this structure > to support this OOM killing of enclaves. > > Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > Signed-off-by: Kristen Carlson Accardi <kristen@xxxxxxxxxxxxxxx> > Signed-off-by: Haitao Huang <haitao.huang@xxxxxxxxxxxxxxx> > Cc: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > V4: > - Removed unneeded comments for the spinlock and the non-reclaimables. > (Kai, Jarkko) > - Revised the commit to add introduction comments for unreclaimables and > multiple LRU lists.(Kai) > - Reordered the patches: delay all changes for unreclaimables to > later, and this one becomes the first change in the SGX subsystem. > > V3: > - Removed the helper functions and revised commit messages. > --- > arch/x86/kernel/cpu/sgx/sgx.h | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h > index d2dad21259a8..018414b2abe8 100644 > --- a/arch/x86/kernel/cpu/sgx/sgx.h > +++ b/arch/x86/kernel/cpu/sgx/sgx.h > @@ -83,6 +83,20 @@ static inline void *sgx_get_epc_virt_addr(struct sgx_epc_page *page) > return section->virt_addr + index * PAGE_SIZE; > } > > +/* > + * Tracks EPC pages reclaimable by the reclaimer (ksgxd). > + */ > +struct sgx_epc_lru_lists { > + spinlock_t lock; > + struct list_head reclaimable; > +}; > + > +static inline void sgx_lru_init(struct sgx_epc_lru_lists *lrus) > +{ > + spin_lock_init(&lrus->lock); > + INIT_LIST_HEAD(&lrus->reclaimable); > +} > + > struct sgx_epc_page *__sgx_alloc_epc_page(void); > void sgx_free_epc_page(struct sgx_epc_page *page); > > -- > 2.25.1 > Looks good but not yet time for ack'ing. BR, Jarkko