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. 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.