lkml.org 
[lkml]   [2023]   [Feb]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/6] erofs: remove tagged pointer helpers
    Date
    Just open-code the remaining one to simplify the code.

    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    ---
    fs/erofs/tagptr.h | 107 ----------------------------------------------
    fs/erofs/zdata.c | 26 +++--------
    fs/erofs/zdata.h | 1 -
    3 files changed, 6 insertions(+), 128 deletions(-)
    delete mode 100644 fs/erofs/tagptr.h

    diff --git a/fs/erofs/tagptr.h b/fs/erofs/tagptr.h
    deleted file mode 100644
    index 64ceb7270b5c..000000000000
    --- a/fs/erofs/tagptr.h
    +++ /dev/null
    @@ -1,107 +0,0 @@
    -/* SPDX-License-Identifier: GPL-2.0-only */
    -/*
    - * A tagged pointer implementation
    - */
    -#ifndef __EROFS_FS_TAGPTR_H
    -#define __EROFS_FS_TAGPTR_H
    -
    -#include <linux/types.h>
    -#include <linux/build_bug.h>
    -
    -/*
    - * the name of tagged pointer types are tagptr{1, 2, 3...}_t
    - * avoid directly using the internal structs __tagptr{1, 2, 3...}
    - */
    -#define __MAKE_TAGPTR(n) \
    -typedef struct __tagptr##n { \
    - uintptr_t v; \
    -} tagptr##n##_t;
    -
    -__MAKE_TAGPTR(1)
    -__MAKE_TAGPTR(2)
    -__MAKE_TAGPTR(3)
    -__MAKE_TAGPTR(4)
    -
    -#undef __MAKE_TAGPTR
    -
    -extern void __compiletime_error("bad tagptr tags")
    - __bad_tagptr_tags(void);
    -
    -extern void __compiletime_error("bad tagptr type")
    - __bad_tagptr_type(void);
    -
    -/* fix the broken usage of "#define tagptr2_t tagptr3_t" by users */
    -#define __tagptr_mask_1(ptr, n) \
    - __builtin_types_compatible_p(typeof(ptr), struct __tagptr##n) ? \
    - (1UL << (n)) - 1 :
    -
    -#define __tagptr_mask(ptr) (\
    - __tagptr_mask_1(ptr, 1) ( \
    - __tagptr_mask_1(ptr, 2) ( \
    - __tagptr_mask_1(ptr, 3) ( \
    - __tagptr_mask_1(ptr, 4) ( \
    - __bad_tagptr_type(), 0)))))
    -
    -/* generate a tagged pointer from a raw value */
    -#define tagptr_init(type, val) \
    - ((typeof(type)){ .v = (uintptr_t)(val) })
    -
    -/*
    - * directly cast a tagged pointer to the native pointer type, which
    - * could be used for backward compatibility of existing code.
    - */
    -#define tagptr_cast_ptr(tptr) ((void *)(tptr).v)
    -
    -/* encode tagged pointers */
    -#define tagptr_fold(type, ptr, _tags) ({ \
    - const typeof(_tags) tags = (_tags); \
    - if (__builtin_constant_p(tags) && (tags & ~__tagptr_mask(type))) \
    - __bad_tagptr_tags(); \
    -tagptr_init(type, (uintptr_t)(ptr) | tags); })
    -
    -/* decode tagged pointers */
    -#define tagptr_unfold_ptr(tptr) \
    - ((void *)((tptr).v & ~__tagptr_mask(tptr)))
    -
    -#define tagptr_unfold_tags(tptr) \
    - ((tptr).v & __tagptr_mask(tptr))
    -
    -/* operations for the tagger pointer */
    -#define tagptr_eq(_tptr1, _tptr2) ({ \
    - typeof(_tptr1) tptr1 = (_tptr1); \
    - typeof(_tptr2) tptr2 = (_tptr2); \
    - (void)(&tptr1 == &tptr2); \
    -(tptr1).v == (tptr2).v; })
    -
    -/* lock-free CAS operation */
    -#define tagptr_cmpxchg(_ptptr, _o, _n) ({ \
    - typeof(_ptptr) ptptr = (_ptptr); \
    - typeof(_o) o = (_o); \
    - typeof(_n) n = (_n); \
    - (void)(&o == &n); \
    - (void)(&o == ptptr); \
    -tagptr_init(o, cmpxchg(&ptptr->v, o.v, n.v)); })
    -
    -/* wrap WRITE_ONCE if atomic update is needed */
    -#define tagptr_replace_tags(_ptptr, tags) ({ \
    - typeof(_ptptr) ptptr = (_ptptr); \
    - *ptptr = tagptr_fold(*ptptr, tagptr_unfold_ptr(*ptptr), tags); \
    -*ptptr; })
    -
    -#define tagptr_set_tags(_ptptr, _tags) ({ \
    - typeof(_ptptr) ptptr = (_ptptr); \
    - const typeof(_tags) tags = (_tags); \
    - if (__builtin_constant_p(tags) && (tags & ~__tagptr_mask(*ptptr))) \
    - __bad_tagptr_tags(); \
    - ptptr->v |= tags; \
    -*ptptr; })
    -
    -#define tagptr_clear_tags(_ptptr, _tags) ({ \
    - typeof(_ptptr) ptptr = (_ptptr); \
    - const typeof(_tags) tags = (_tags); \
    - if (__builtin_constant_p(tags) && (tags & ~__tagptr_mask(*ptptr))) \
    - __bad_tagptr_tags(); \
    - ptptr->v &= ~tags; \
    -*ptptr; })
    -
    -#endif /* __EROFS_FS_TAGPTR_H */
    diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
    index f015a90839f6..ae97e3b627cb 100644
    --- a/fs/erofs/zdata.c
    +++ b/fs/erofs/zdata.c
    @@ -175,15 +175,6 @@ static void z_erofs_free_pcluster(struct z_erofs_pcluster *pcl)
    DBG_BUGON(1);
    }

    -/*
    - * tagged pointer with 1-bit tag for all compressed pages
    - * tag 0 - the page is just found with an extra page reference
    - */
    -typedef tagptr1_t compressed_page_t;
    -
    -#define tag_compressed_page_justfound(page) \
    - tagptr_fold(compressed_page_t, page, 1)
    -
    static struct workqueue_struct *z_erofs_workqueue __read_mostly;

    void z_erofs_exit_zip_subsystem(void)
    @@ -319,7 +310,7 @@ static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe,

    for (i = 0; i < pcl->pclusterpages; ++i) {
    struct page *page;
    - compressed_page_t t;
    + void *t; /* mark pages just found for debugging */
    struct page *newpage = NULL;

    /* the compressed page was loaded before */
    @@ -329,7 +320,7 @@ static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe,
    page = find_get_page(mc, pcl->obj.index + i);

    if (page) {
    - t = tag_compressed_page_justfound(page);
    + t = (void *)((unsigned long)page | 1);
    } else {
    /* I/O is needed, no possible to decompress directly */
    standalone = false;
    @@ -345,11 +336,10 @@ static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe,
    if (!newpage)
    continue;
    set_page_private(newpage, Z_EROFS_PREALLOCATED_PAGE);
    - t = tag_compressed_page_justfound(newpage);
    + t = (void *)((unsigned long)newpage | 1);
    }

    - if (!cmpxchg_relaxed(&pcl->compressed_bvecs[i].page, NULL,
    - tagptr_cast_ptr(t)))
    + if (!cmpxchg_relaxed(&pcl->compressed_bvecs[i].page, NULL, t))
    continue;

    if (page)
    @@ -1192,8 +1182,6 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,

    struct address_space *mapping;
    struct page *oldpage, *page;
    -
    - compressed_page_t t;
    int justfound;

    repeat:
    @@ -1203,10 +1191,8 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,
    if (!page)
    goto out_allocpage;

    - /* process the target tagged pointer */
    - t = tagptr_init(compressed_page_t, page);
    - justfound = tagptr_unfold_tags(t);
    - page = tagptr_unfold_ptr(t);
    + justfound = (unsigned long)page & 1UL;
    + page = (struct page *)((unsigned long)page & ~1UL);

    /*
    * preallocated cached pages, which is used to avoid direct reclaim
    diff --git a/fs/erofs/zdata.h b/fs/erofs/zdata.h
    index b139de5473a9..f196a729c7e8 100644
    --- a/fs/erofs/zdata.h
    +++ b/fs/erofs/zdata.h
    @@ -7,7 +7,6 @@
    #define __EROFS_FS_ZDATA_H

    #include "internal.h"
    -#include "tagptr.h"

    #define Z_EROFS_PCLUSTER_MAX_PAGES (Z_EROFS_PCLUSTER_MAX_SIZE / PAGE_SIZE)
    #define Z_EROFS_INLINE_BVECS 2
    --
    2.24.4
    \
     
     \ /
      Last update: 2023-03-27 00:09    [W:2.820 / U:1.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site