On 2/14/19 12:18 AM, Jens Axboe wrote:
> On 2/13/19 2:50 AM, Bob Liu wrote:
>> rd_hint is a bitmap for stacked layer support(see patch 4/9),
>> set a bit to 1 means already read from the corresponding mirror device.
>>
>> rd_hint will be set properly recording read i/o went to which real device
>> during end_bio().
>> If the upper layer want to retry other mirrors, just preserve the returned
>> bi_rd_hint and resubmit bio.
>>
>> The upper layer e.g fs can set bitmap_zero(rd_hint) if don't care about alt
>> mirror device retry feature which is also the default setting.
>
> You just made the bio 16 bytes bigger on my build, which is an increase
> of 12.5% and spills it into a third cacheline. That's not going to work
> at all. At least look at where you are placing this thing. That goes
> for the request as well, you can just toss members in there at random.
>
Are you fine with an union like?
- unsigned short bi_write_hint;
- DECLARE_BITMAP(bi_rd_hint, BLKDEV_MAX_MIRRORS);
+ union {
+ unsigned short bi_write_hint;
+ unsigned long bi_rd_hint;
+ };
But rd_hint need to be "unsigned long" which would still make bio/request
bigger.
For sure can add KCONFIG option around if necessary.
> Also, why is BLKDEV_MAX_MIRRORS in types.h? That makes very little sense.
>
Indeed, so I plan to switch back "unsigned long bi_rd_hint".
But bi_rd_hint is still a bitmap(for stacked layer support) which means this
feature can not
work if more than BITS_PER_LONG copies.
> Look into options of carrying this elsewhere, or (at the very least)
> making it dependent on whoever needs it. This is NOT a negligible
> amount of wasted space.
>