x86/mm/pat: Do a small optimization and fix in reserve_memtype
PATCH v5 1/1 x86/mm/pat: Do a small optimization and fix in reserve_memtype
From: Pan Xinhui <[email protected]>
It's more reasonable to unlock memtype_lock right after rbt_memtype_check_insert. All pat_rbtree operations need to be performed while holding the memtype_lock. But codes like kfree, pr_info, etc have nothing to do with this lock. So move spin_unlock a little ahead.
If *new* succeed to be stored into the rb-tree, we might hit panic. Because we access *new* in dprintk "cattr_name(new->type)". Data stored in the rb-tree might be freed at any possbile time. It's abviously wrong to access such data without lock held.
We use actual_type instead of new->type in dprintk. Two benefits, 1) We don't touch *new* here now so panic can be avoided. 2) As new->type is same with *new_type, We needn't to print it again, what's more, this actual_type's output can help dubug. When new_type is NULL, actual_type is equal to new->type, So no key information is lost.
Do a minor codes style improvement.
---
change from v4:
codes style improvement by removing {}.
@sorry for that, make reviewing a patch so much complex, this should be done in V4.
change from v3:
output actual_type instead of new->type. codes style improvement. update comments.
change from v2:
update comments.
change from V1:
fix an access of *new* without memtype_lock held.
--- arch/x86/mm/pat.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-)
arch/x86/mm/pat.c +6 -13
@@ -520,14 +520,10 @@ int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type, *new_type = actual_type; is_range_ram =pat_pagerange_is_ram (start, end); -if (is_range_ram ==1 ) { - - err =reserve_ram_pages_type (start, end, req_type, new_type); - -return err; - }else if (is_range_ram <0 ) { +if (is_range_ram ==1 ) +return reserve_ram_pages_type (start, end, req_type, new_type); +else if (is_range_ram <0 )return -EINVAL ; - } new =kzalloc (sizeof (struct memtype ),GFP_KERNEL );if (!new)
@@ -538,22 +534,19 @@ int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type, new->type = actual_type;spin_lock (&memtype_lock); - err =rbt_memtype_check_insert (new, new_type); +spin_unlock (&memtype_lock); +if (err) {pr_info ("x86/PAT: reserve_memtype failed [mem %#010Lx-%#010Lx], track %s, req %s\n" , start, end -1 ,cattr_name (new->type),cattr_name (req_type));kfree (new); -spin_unlock (&memtype_lock); -return err; } -spin_unlock (&memtype_lock); -dprintk ("reserve_memtype added [mem %#010Lx-%#010Lx], track %s, req %s, ret %s\n" , - start, end -1 ,cattr_name (new->type),cattr_name (req_type), + start, end -1 ,cattr_name (actual_type),cattr_name (req_type), new_type ?cattr_name (*new_type) :"-" );return err;
Signature · 1 line
1.9.1