hugetlb: embed busy flag in key structure
PATCH 5/11 hugetlb: embed busy flag in key structure
This replaces the usage of inode->i_writecount as a flag marking keys busy with a boolean flag field in struct htlbpagekey, and removes the last dependency of alloc_shared_hugetlb_pages() on struct inode.
hugetlbpage.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 40 insertions(+), 3 deletions(-)
arch/i386/mm/hugetlbpage.c +40 -3
@@ -31,10 +31,47 @@ static spinlock_t htlbpage_lock = SPIN_Lstatic struct htlbpagekey {struct inode *in;int key; +int busy; } htlbpagek[MAX_ID ];struct hugetlb_key ; +static void mark_key_busy (struct hugetlb_key *hugetlb_key) +{ +struct inode *inode = (struct inode *)hugetlb_key; +int i, key = inode->i_ino; + +for (i =0 ; i <MAX_ID ; ++i) +if (htlbpagek[i].key != key) +continue ; +BUG_ON (i >=MAX_ID ); + htlbpagek[i].busy =1 ; +} + +static void clear_key_busy (struct hugetlb_key *hugetlb_key) +{ +struct inode *inode = (struct inode *)hugetlb_key; +int i, key = inode->i_ino; + +for (i =0 ; i <MAX_ID ; ++i) +if (htlbpagek[i].key != key) +continue ; +BUG_ON (i >=MAX_ID ); + htlbpagek[i].busy =0 ; +} + +static int key_busy (struct hugetlb_key *hugetlb_key) +{ +struct inode *inode = (struct inode *)hugetlb_key; +int i, key = inode->i_ino; + +for (i =0 ; i <MAX_ID ; ++i) +if (htlbpagek[i].key != key) +continue ; +BUG_ON (i >=MAX_ID ); +return htlbpagek[i].busy; +} +static struct inode *find_key_inode (int key) {int i;
@@ -76,7 +113,7 @@ struct hugetlb_key *alloc_key(int key, u inode =ERR_PTR (-ENOMEM ); }else {inode_init_once (inode); -atomic_inc (&inode->i_writecount); +mark_key_busy ((struct hugetlb_key *)inode); inode->i_mapping = &inode->i_data; inode->i_mapping->host = inode; inode->i_ino = (unsigned long )key;
@@ -90,7 +127,7 @@ struct hugetlb_key *alloc_key(int key, u } } } - }else if (atomic_read (&inode->i_writecount)) { + }else if (key_busy ((struct hugetlb_key *)inode)) { inode =ERR_PTR (-EAGAIN );spin_unlock (&htlbpage_lock); }else if (check_size_prot (inode, len, prot, flag) <0 )
@@ -392,7 +429,7 @@ static int alloc_shared_hugetlb_pages(in vma->vm_ops = &hugetlb_vm_ops;spin_unlock (&mm->page_table_lock);spin_lock (&htlbpage_lock); -atomic_set (&inode->i_writecount,0 ); +clear_key_busy ((struct hugetlb_key *)inode);spin_unlock (&htlbpage_lock);return retval; out: