On 5/29/20 1:21 PM, Matthew Wilcox wrote:
On Fri, May 29, 2020 at 08:50:21AM +0200, Hannes Reinecke wrote:
I meant just use xa_alloc() for everything instead of using xa_insert for
0-255.
But then I'll have to use xa_find() to get to the actual element as the 1:1
mapping between SCSI LUN and array index is lost.
And seeing that most storage arrays will expose only up to 256 LUNs I
thought this was a good improvement on lookup.
Of course, this only makes sense if xa_load() is more efficient than
xa_find(). If not then of course it's a bit futile.
xa_load() is absolutely more efficient than xa_find(). It's just a
question of whether it matters ;-) Carry on ...
Thanks. I will.
BTW, care to update the documentation?
* Return: 0 on success, -ENOMEM if memory could not be allocated or
* -EBUSY if there are no free entries in @limit.
*/
int __xa_alloc(struct xarray *xa, u32 *id, void *entry,
struct xa_limit limit, gfp_t gfp)
{
XA_STATE(xas, xa, 0);
if (WARN_ON_ONCE(xa_is_advanced(entry)))
return -EINVAL;
if (WARN_ON_ONCE(!xa_track_free(xa)))
return -EINVAL;
So looks as if the documentation is in need of updating to cover -EINVAL.
And, please, state somewhere that whenever you want to use xa_alloc()
you _need_ to specify XA_ALLOC_FLAGS in xa_init_flags(), otherwise
you trip across the above.
It's not entirely obvious, and took me the better half of a day to
figure out.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@xxxxxxx +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer