lkml.org 
[lkml]   [2023]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 14/18] x86/sgx: Add helper to grab pages from an arbitrary EPC LRU
    Date
    From: Sean Christopherson <sean.j.christopherson@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.christopherson@intel.com>
    Co-developed-by: Kristen Carlson Accardi <kristen@linux.intel.com>
    Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
    Co-developed-by: Haitao Huang <haitao.huang@linux.intel.com>
    Signed-off-by: Haitao Huang <haitao.huang@linux.intel.com>
    Cc: Sean Christopherson <seanjc@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 4e1a3e038db5..b34ad3574c81 100644
    --- a/arch/x86/kernel/cpu/sgx/main.c
    +++ b/arch/x86/kernel/cpu/sgx/main.c
    @@ -284,6 +284,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)
    LIST_HEAD(iso);
    size_t ret, 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 7e7f1f36d31e..42075762084c 100644
    --- a/arch/x86/kernel/cpu/sgx/sgx.h
    +++ b/arch/x86/kernel/cpu/sgx/sgx.h
    @@ -180,6 +180,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
    \
     
     \ /
      Last update: 2023-09-23 05:09    [W:4.544 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site