Commit d6d261bd authored by Tony Luck's avatar Tony Luck Committed by Dave Hansen

x86/sgx: Add new sgx_epc_page flag bit to mark free pages

SGX EPC pages go through the following life cycle:

        DIRTY ---> FREE ---> IN-USE --\
                    ^                 |
                    \-----------------/

Recovery action for poison for a DIRTY or FREE page is simple. Just
make sure never to allocate the page. IN-USE pages need some extra
handling.

Add a new flag bit SGX_EPC_PAGE_IS_FREE that is set when a page
is added to a free list and cleared when the page is allocated.

Notes:

1) These transitions are made while holding the node->lock so that
   future code that checks the flags while holding the node->lock
   can be sure that if the SGX_EPC_PAGE_IS_FREE bit is set, then the
   page is on the free list.

2) Initially while the pages are on the dirty list the
   SGX_EPC_PAGE_IS_FREE bit is cleared.
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Tested-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Link: https://lkml.kernel.org/r/20211026220050.697075-2-tony.luck@intel.com
parent fa55b7dc
...@@ -472,6 +472,7 @@ static struct sgx_epc_page *__sgx_alloc_epc_page_from_node(int nid) ...@@ -472,6 +472,7 @@ static struct sgx_epc_page *__sgx_alloc_epc_page_from_node(int nid)
page = list_first_entry(&node->free_page_list, struct sgx_epc_page, list); page = list_first_entry(&node->free_page_list, struct sgx_epc_page, list);
list_del_init(&page->list); list_del_init(&page->list);
sgx_nr_free_pages--; sgx_nr_free_pages--;
page->flags = 0;
spin_unlock(&node->lock); spin_unlock(&node->lock);
...@@ -626,6 +627,7 @@ void sgx_free_epc_page(struct sgx_epc_page *page) ...@@ -626,6 +627,7 @@ void sgx_free_epc_page(struct sgx_epc_page *page)
list_add_tail(&page->list, &node->free_page_list); list_add_tail(&page->list, &node->free_page_list);
sgx_nr_free_pages++; sgx_nr_free_pages++;
page->flags = SGX_EPC_PAGE_IS_FREE;
spin_unlock(&node->lock); spin_unlock(&node->lock);
} }
......
...@@ -26,6 +26,9 @@ ...@@ -26,6 +26,9 @@
/* Pages, which are being tracked by the page reclaimer. */ /* Pages, which are being tracked by the page reclaimer. */
#define SGX_EPC_PAGE_RECLAIMER_TRACKED BIT(0) #define SGX_EPC_PAGE_RECLAIMER_TRACKED BIT(0)
/* Pages on free list */
#define SGX_EPC_PAGE_IS_FREE BIT(1)
struct sgx_epc_page { struct sgx_epc_page {
unsigned int section; unsigned int section;
unsigned int flags; unsigned int flags;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment