[FOR INTERNAL REVIEW] [PATCH 3/4] staging: erofs: remove RADIX_TREE_EXCEPTIONAL_{ENTRY,SHIFT}

Gao Xiang gaoxiang25 at huawei.com
Mon Jul 30 23:33:44 AEST 2018


Hi Matthew,

On 2018/7/30 21:19, Matthew Wilcox wrote:
> 
> This review looks pretty external now ...
> 

:-'( Internal means currently in the linux-erofs mailing list for preview.
I haven't sent to the linux-kernel mailing list yet..

> On Mon, Jul 30, 2018 at 05:18:30PM +0800, Gao Xiang wrote:
>> After commit 49520d317715 ("xarray: Replace exceptional entries"),
>> there are no RADIX_TREE_EXCEPTIONAL_{ENTRY,SHIFT} at all, remove them
>> as a workaround but erofs actually needs an extra bit for each entry.
> 
> This patch confuses me.  You say erofs needs an extra bit, but apparently
> it works well with the bit removed.  What, then, is the point of the bit?
> 
The previous version of erofs used these bits for differentiating (un)cached entry...
Link: https://lists.ozlabs.org/pipermail/linux-erofs/2018-July/000093.html

It has no use currently, but I plan to reserve an extra bit for the future
VLE/non-VLE hybrid decompression...

> You can use bit 0 if you need to distinguish between two types of pointers.
> Indeed, you can distinguish between three different types of pointers
> -- x & 3 == { 0, 1, 3 }.

Thanks, I will look into the radix tree implementation and have a try.
But if XArray is merged into 4.19, I will also try to convert into the XArray...

Thanks,
Gao Xiang

> 
>> In the future, it should be converted to XArray of course.
>>
>> Cc: Matthew Wilcox <willy at infradead.org>
>> Signed-off-by: Gao Xiang <gaoxiang25 at huawei.com>
>> ---
>>
>> - Tested with images generated by mkfs.erofs:
>>    1) mount and unmount operations
>>    2) md5sum `find . -type f`
>>
>>  drivers/staging/erofs/utils.c | 19 ++++++++-----------
>>  1 file changed, 8 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/staging/erofs/utils.c b/drivers/staging/erofs/utils.c
>> index 595cf90..25ff39f 100644
>> --- a/drivers/staging/erofs/utils.c
>> +++ b/drivers/staging/erofs/utils.c
>> @@ -47,9 +47,7 @@ struct erofs_workgroup *erofs_find_workgroup(
>>  	rcu_read_lock();
>>  	grp = radix_tree_lookup(&sbi->workstn_tree, index);
>>  	if (grp != NULL) {
>> -		*tag = radix_tree_exceptional_entry(grp);
>> -		grp = (void *)((unsigned long)grp &
>> -			~RADIX_TREE_EXCEPTIONAL_ENTRY);
>> +		*tag = 0;
>>  
>>  		if (erofs_workgroup_get(grp, &oldcount)) {
>>  			/* prefer to relax rcu read side */
>> @@ -68,7 +66,7 @@ struct erofs_workgroup *erofs_find_workgroup(
>>  
>>  int erofs_register_workgroup(struct super_block *sb,
>>  			     struct erofs_workgroup *grp,
>> -			     bool tag)
>> +			     bool __maybe_unused tag)
>>  {
>>  	struct erofs_sb_info *sbi;
>>  	int err;
>> @@ -76,6 +74,11 @@ int erofs_register_workgroup(struct super_block *sb,
>>  	/* grp->refcount should not < 1 */
>>  	BUG_ON(!atomic_read(&grp->refcount));
>>  
>> +	if (tag) {
>> +		DBG_BUGON(1);
>> +		return -EINVAL;
>> +	}
>> +
>>  	err = radix_tree_preload(GFP_NOFS);
>>  	if (err)
>>  		return err;
>> @@ -83,10 +86,6 @@ int erofs_register_workgroup(struct super_block *sb,
>>  	sbi = EROFS_SB(sb);
>>  	erofs_workstn_lock(sbi);
>>  
>> -	if (tag)
>> -		grp = (void *)((unsigned long)grp |
>> -			1UL << RADIX_TREE_EXCEPTIONAL_SHIFT);
>> -
>>  	err = radix_tree_insert(&sbi->workstn_tree,
>>  		grp->index, grp);
>>  
>> @@ -131,9 +130,7 @@ unsigned long erofs_shrink_workstation(struct erofs_sb_info *sbi,
>>  
>>  	for (i = 0; i < found; ++i) {
>>  		int cnt;
>> -		struct erofs_workgroup *grp = (void *)
>> -			((unsigned long)batch[i] &
>> -				~RADIX_TREE_EXCEPTIONAL_ENTRY);
>> +		struct erofs_workgroup *grp = batch[i];
>>  
>>  		first_index = grp->index + 1;
>>  
>> -- 
>> 1.9.1
>>


More information about the Linux-erofs mailing list