lkml.org 
[lkml]   [2014]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 08/12] mm: slub: introduce metadata_access_enable()/metadata_access_disable()
    Date
    Wrap access to object's metadata in external functions with
    metadata_access_enable()/metadata_access_disable() function calls.

    This hooks separates payload accesses from metadata accesses
    which might be useful for different checkers (e.g. KASan).

    Signed-off-by: Andrey Ryabinin <a.ryabinin@samsung.com>
    ---
    mm/slub.c | 16 ++++++++++++++++
    1 file changed, 16 insertions(+)

    diff --git a/mm/slub.c b/mm/slub.c
    index 1458629..2116ccd 100644
    --- a/mm/slub.c
    +++ b/mm/slub.c
    @@ -467,13 +467,23 @@ static int slub_debug;
    static char *slub_debug_slabs;
    static int disable_higher_order_debug;

    +static inline void metadata_access_enable(void)
    +{
    +}
    +
    +static inline void metadata_access_disable(void)
    +{
    +}
    +
    /*
    * Object debugging
    */
    static void print_section(char *text, u8 *addr, unsigned int length)
    {
    + metadata_access_enable();
    print_hex_dump(KERN_ERR, text, DUMP_PREFIX_ADDRESS, 16, 1, addr,
    length, 1);
    + metadata_access_disable();
    }

    static struct track *get_track(struct kmem_cache *s, void *object,
    @@ -503,7 +513,9 @@ static void set_track(struct kmem_cache *s, void *object,
    trace.max_entries = TRACK_ADDRS_COUNT;
    trace.entries = p->addrs;
    trace.skip = 3;
    + metadata_access_enable();
    save_stack_trace(&trace);
    + metadata_access_disable();

    /* See rant in lockdep.c */
    if (trace.nr_entries != 0 &&
    @@ -677,7 +689,9 @@ static int check_bytes_and_report(struct kmem_cache *s, struct page *page,
    u8 *fault;
    u8 *end;

    + metadata_access_enable();
    fault = memchr_inv(start, value, bytes);
    + metadata_access_disable();
    if (!fault)
    return 1;

    @@ -770,7 +784,9 @@ static int slab_pad_check(struct kmem_cache *s, struct page *page)
    if (!remainder)
    return 1;

    + metadata_access_enable();
    fault = memchr_inv(end - remainder, POISON_INUSE, remainder);
    + metadata_access_disable();
    if (!fault)
    return 1;
    while (end > fault && end[-1] == POISON_INUSE)
    --
    2.1.2


    \
     
     \ /
      Last update: 2014-10-27 18:21    [W:4.044 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site