[PATCH for-4.19 1/2] xarray: Replace exceptional entries

Gao Xiang gaoxiang25 at huawei.com
Tue Feb 26 12:21:50 AEDT 2019


Hi Matthew,

On 2019/2/26 2:27, Matthew Wilcox wrote:
> On Tue, Feb 26, 2019 at 01:58:08AM +0800, Gao Xiang wrote:
>> +/**
>> + * xa_tag_pointer() - Create an XArray entry for a tagged pointer.
>> + * @p: Plain pointer.
>> + * @tag: Tag value (0, 1 or 3).
>> + *
>> + * If the user of the XArray prefers, they can tag their pointers instead
>> + * of storing value entries.  Three tags are available (0, 1 and 3).
>> + * These are distinct from the xa_mark_t as they are not replicated up
>> + * through the array and cannot be searched for.
>> + *
>> + * Context: Any context.
>> + * Return: An XArray entry.
>> + */
>> +static inline void *xa_tag_pointer(void *p, unsigned long tag)
>> +{
>> +	return (void *)((unsigned long)p | tag);
>> +}
> 
> I think we have to diverge from upstream here.  Part of the original
> commit is changing the format of internal & exceptional entries to give
> us an extra bit.  This implementation of xa_tag_pointer would transform
> a pointer tagged with value 1 into an internal pointer, which would
> break the radix tree.

Sorry for the delay reply. I noticed this, 
radix use 1x for storing exceptional entry
#define RADIX_TREE_EXCEPTIONAL_ENTRY   2
but XArray use x1 instead.

But I didn't notice this commit fixes the radix tree implementation as well,
let me fix it soon and thanks for pointing it out :)

Thanks,
Gao Xiang

> 
> I would suggest:
> 
> +/**
> + * xa_tag_pointer() - Create an XArray entry for a tagged pointer.
> + * @p: Plain pointer.
> + * @tag: Tag value (0 or 1).
> + *
> + * If the user of the XArray prefers, they can tag their pointers instead
> + * of storing value entries.  Two tags are available (0 and 1).
> + * These are distinct from the xa_mark_t as they are not replicated up
> + * through the array and cannot be searched for.
> + *
> + * Context: Any context.
> + * Return: An XArray entry.
> + */
> +static inline void *xa_tag_pointer(void *p, unsigned long tag)
> +{
> +	BUG_ON(tag > 1);
> +	return (void *)((unsigned long)p | (tag << 1));
> +}
> 
> xa_untag_pointer() and xa_pointer_tag() will need corresponding changes.
> 


More information about the Linux-erofs mailing list