mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
erofs: remove tagged pointer helpers
[ Upstream commitb1ed220c62] Just open-code the remaining one to simplify the code. Reviewed-by: Yue Hu <huyue2@coolpad.com> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20230204093040.97967-3-hsiangkao@linux.alibaba.com Stable-dep-of:967c28b23f("erofs: kill hooked chains to avoid loops on deduplicated compressed images") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3379f13ebc
commit
041ff2c21b
@@ -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 */
|
|
||||||
@@ -175,15 +175,6 @@ static void z_erofs_free_pcluster(struct z_erofs_pcluster *pcl)
|
|||||||
DBG_BUGON(1);
|
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;
|
static struct workqueue_struct *z_erofs_workqueue __read_mostly;
|
||||||
|
|
||||||
void z_erofs_exit_zip_subsystem(void)
|
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) {
|
for (i = 0; i < pcl->pclusterpages; ++i) {
|
||||||
struct page *page;
|
struct page *page;
|
||||||
compressed_page_t t;
|
void *t; /* mark pages just found for debugging */
|
||||||
struct page *newpage = NULL;
|
struct page *newpage = NULL;
|
||||||
|
|
||||||
/* the compressed page was loaded before */
|
/* 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);
|
page = find_get_page(mc, pcl->obj.index + i);
|
||||||
|
|
||||||
if (page) {
|
if (page) {
|
||||||
t = tag_compressed_page_justfound(page);
|
t = (void *)((unsigned long)page | 1);
|
||||||
} else {
|
} else {
|
||||||
/* I/O is needed, no possible to decompress directly */
|
/* I/O is needed, no possible to decompress directly */
|
||||||
standalone = false;
|
standalone = false;
|
||||||
@@ -345,11 +336,10 @@ static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe,
|
|||||||
if (!newpage)
|
if (!newpage)
|
||||||
continue;
|
continue;
|
||||||
set_page_private(newpage, Z_EROFS_PREALLOCATED_PAGE);
|
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,
|
if (!cmpxchg_relaxed(&pcl->compressed_bvecs[i].page, NULL, t))
|
||||||
tagptr_cast_ptr(t)))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (page)
|
if (page)
|
||||||
@@ -1192,8 +1182,6 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,
|
|||||||
|
|
||||||
struct address_space *mapping;
|
struct address_space *mapping;
|
||||||
struct page *oldpage, *page;
|
struct page *oldpage, *page;
|
||||||
|
|
||||||
compressed_page_t t;
|
|
||||||
int justfound;
|
int justfound;
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
@@ -1203,10 +1191,8 @@ repeat:
|
|||||||
if (!page)
|
if (!page)
|
||||||
goto out_allocpage;
|
goto out_allocpage;
|
||||||
|
|
||||||
/* process the target tagged pointer */
|
justfound = (unsigned long)page & 1UL;
|
||||||
t = tagptr_init(compressed_page_t, page);
|
page = (struct page *)((unsigned long)page & ~1UL);
|
||||||
justfound = tagptr_unfold_tags(t);
|
|
||||||
page = tagptr_unfold_ptr(t);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* preallocated cached pages, which is used to avoid direct reclaim
|
* preallocated cached pages, which is used to avoid direct reclaim
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#define __EROFS_FS_ZDATA_H
|
#define __EROFS_FS_ZDATA_H
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "tagptr.h"
|
|
||||||
|
|
||||||
#define Z_EROFS_PCLUSTER_MAX_PAGES (Z_EROFS_PCLUSTER_MAX_SIZE / PAGE_SIZE)
|
#define Z_EROFS_PCLUSTER_MAX_PAGES (Z_EROFS_PCLUSTER_MAX_SIZE / PAGE_SIZE)
|
||||||
#define Z_EROFS_INLINE_BVECS 2
|
#define Z_EROFS_INLINE_BVECS 2
|
||||||
|
|||||||
Reference in New Issue
Block a user