On 03-08-23, 10:32, Martin Povišer wrote: > >>> +static int sio_alloc_tag(struct sio_data *sio) > >>> +{ > >>> + struct sio_tagdata *tags = &sio->tags; > >>> + int tag, i; > >>> + > >>> + /* > >>> + * Because tag number 0 is special, the usable tag range > >>> + * is 1...(SIO_NTAGS - 1). So, to pick the next usable tag, > >>> + * we do modulo (SIO_NTAGS - 1) *then* plus one. > >>> + */ > >>> + > >>> +#define SIO_USABLE_TAGS (SIO_NTAGS - 1) > >>> + tag = (READ_ONCE(tags->last_tag) % SIO_USABLE_TAGS) + 1; > >>> + > >>> + for (i = 0; i < SIO_USABLE_TAGS; i++) { > >>> + if (!test_and_set_bit(tag, &tags->allocated)) > >>> + break; > >>> + > >>> + tag = (tag % SIO_USABLE_TAGS) + 1; > >>> + } > >>> + > >>> + WRITE_ONCE(tags->last_tag, tag); > >>> + > >>> + if (i < SIO_USABLE_TAGS) > >>> + return tag; > >>> + else > >>> + return -EBUSY; > >>> +#undef SIO_USABLE_TAGS > >>> +} > >> > >> can you use kernel mechanisms like ida to alloc and free the tags... > > > > I can look into that. > > Documentation says IDA is deprecated in favour of Xarray, both look > like they serve to associate a pointer with an ID. I think neither > structure beats a simple bitfield and a static array for the per-tag > data. Agree? yeah xarray am not too sure. I would still go with ida, we will see when it is relly removed. If you need a bitfield why not use bitmap apis. I dont like drivers implementing the basic logic which kernel provides -- ~Vinod