From: Sean Christopherson <sean.j.christopher...@intel.com>

Move the isolation loop into a helper, sgx_isolate_pages(), in
preparation for existence of multiple LRUs. Expose the helper to other
SGX code so that it can be called from the EPC cgroup code, e.g., to
isolate pages from a single cgroup LRU. Exposing the isolation loop
allows the cgroup iteration logic to be wholly encapsulated within the
cgroup code.

Signed-off-by: Sean Christopherson <sean.j.christopher...@intel.com>
Signed-off-by: Kristen Carlson Accardi <kris...@linux.intel.com>
Signed-off-by: Haitao Huang <haitao.hu...@linux.intel.com>
Cc: Sean Christopherson <sea...@google.com>
---
V4:
- No changes other than reordering the patches
---
 arch/x86/kernel/cpu/sgx/main.c | 57 +++++++++++++++++++++-------------
 arch/x86/kernel/cpu/sgx/sgx.h  |  2 ++
 2 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
index e1dde431a400..ce316bd5e5bb 100644
--- a/arch/x86/kernel/cpu/sgx/main.c
+++ b/arch/x86/kernel/cpu/sgx/main.c
@@ -283,6 +283,40 @@ static void sgx_reclaimer_write(struct sgx_epc_page 
*epc_page,
        mutex_unlock(&encl->lock);
 }
 
+/**
+ * sgx_isolate_epc_pages() - Isolate pages from an LRU for reclaim
+ * @lru:       LRU from which to reclaim
+ * @nr_to_scan:        Number of pages to scan for reclaim
+ * @dst:       Destination list to hold the isolated pages
+ */
+void sgx_isolate_epc_pages(struct sgx_epc_lru_lists *lru, size_t nr_to_scan,
+                          struct list_head *dst)
+{
+       struct sgx_encl_page *encl_page;
+       struct sgx_epc_page *epc_page;
+
+       spin_lock(&lru->lock);
+       for (; nr_to_scan > 0; --nr_to_scan) {
+               epc_page = list_first_entry_or_null(&lru->reclaimable, struct 
sgx_epc_page, list);
+               if (!epc_page)
+                       break;
+
+               encl_page = epc_page->encl_page;
+
+               if (kref_get_unless_zero(&encl_page->encl->refcount)) {
+                       sgx_epc_page_set_state(epc_page, 
SGX_EPC_PAGE_RECLAIM_IN_PROGRESS);
+                       list_move_tail(&epc_page->list, dst);
+               } else {
+                       /* The owner is freeing the page, remove it from the
+                        * LRU list
+                        */
+                       sgx_epc_page_reset_state(epc_page);
+                       list_del_init(&epc_page->list);
+               }
+       }
+       spin_unlock(&lru->lock);
+}
+
 /**
  * sgx_reclaim_epc_pages() - Reclaim EPC pages from the consumers
  * @nr_to_scan:                 Number of EPC pages to scan for reclaim
@@ -310,28 +344,7 @@ size_t sgx_reclaim_epc_pages(size_t nr_to_scan, bool 
ignore_age)
        size_t ret;
        size_t i;
 
-       spin_lock(&sgx_global_lru.lock);
-       for (i = 0; i < SGX_NR_TO_SCAN; i++) {
-               epc_page = list_first_entry_or_null(&sgx_global_lru.reclaimable,
-                                                   struct sgx_epc_page, list);
-               if (!epc_page)
-                       break;
-
-               list_del_init(&epc_page->list);
-               encl_page = epc_page->encl_page;
-
-               if (kref_get_unless_zero(&encl_page->encl->refcount) != 0) {
-                       sgx_epc_page_set_state(epc_page, 
SGX_EPC_PAGE_RECLAIM_IN_PROGRESS);
-                       list_move_tail(&epc_page->list, &iso);
-               } else {
-                       /* The owner is freeing the page, remove it from the
-                        * LRU list
-                        */
-                       sgx_epc_page_reset_state(epc_page);
-                       list_del_init(&epc_page->list);
-               }
-       }
-       spin_unlock(&sgx_global_lru.lock);
+       sgx_isolate_epc_pages(&sgx_global_lru, nr_to_scan, &iso);
 
        if (list_empty(&iso))
                return 0;
diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h
index aa4ec2c0ce96..7e21192b87a8 100644
--- a/arch/x86/kernel/cpu/sgx/sgx.h
+++ b/arch/x86/kernel/cpu/sgx/sgx.h
@@ -178,6 +178,8 @@ int sgx_drop_epc_page(struct sgx_epc_page *page);
 struct sgx_epc_page *sgx_alloc_epc_page(void *owner, bool reclaim);
 bool sgx_epc_oom(struct sgx_epc_lru_lists *lrus);
 size_t sgx_reclaim_epc_pages(size_t nr_to_scan, bool ignore_age);
+void sgx_isolate_epc_pages(struct sgx_epc_lru_lists *lrus, size_t nr_to_scan,
+                          struct list_head *dst);
 
 void sgx_ipi_cb(void *info);
 
-- 
2.25.1

Reply via email to