• Suresh Siddha's avatar
    x86, pat: don't use rb-tree based lookup in reserve_memtype() · dcb73bf4
    Suresh Siddha authored
    Recent enhancement of rb-tree based lookup exposed a  bug with the lookup
    mechanism in the reserve_memtype() which ensures that there are no conflicting
    memtype requests for the memory range.
    
    memtype_rb_search() returns an entry which has a start address <= new start
    address. And from here we traverse the linear linked list to check if there
    any conflicts with the existing mappings. As the rbtree is based on the
    start address of the memory range, it is quite possible that we have several
    overlapped mappings whose start address is much less than new requested start
    but the end is >= new requested end. This results in conflicting memtype
    mappings.
    
    Same bug exists with the old code which uses cached_entry from where
    we traverse the linear linked list. But the new rb-tree code exposes this
    bug fairly easily.
    
    For now, don't use the memtype_rb_search() and always start the search from
    the head of linear linked list in reserve_memtype(). Linear linked list
    for most of the systems grow's to few 10's of entries(as we track memory type
    of RAM pages using struct page). So we should be ok for now.
    
    We still retain the rbtree and use it to speed up free_memtype() which
    doesn't have the same bug(as we know what exactly we are searching for
    in free_memtype).
    
    Also use list_for_each_entry_from() in free_memtype() so that we start
    the search from rb-tree lookup result.
    Reported-by: default avatarMarkus Trippelsdorf <markus@trippelsdorf.de>
    Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
    Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    LKML-Reference: <1253136483.4119.12.camel@sbs-t61.sc.intel.com>
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    dcb73bf4
pat.c 24.8 KB