Skip to content

Commit ea74d70

Browse files
fix raid concurrency error with priority by setting priority per raid_bdev_io, not in raid_bdev
1 parent 4bdee17 commit ea74d70

File tree

7 files changed

+20
-27
lines changed

7 files changed

+20
-27
lines changed

module/bdev/raid/bdev_raid.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -921,9 +921,7 @@ raid_bdev_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
921921
bdev_io->u.bdev.offset_blocks & MASK_OUT_PRIORITY_CLASS, bdev_io->u.bdev.num_blocks,
922922
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, bdev_io->u.bdev.md_buf,
923923
bdev_io->u.bdev.memory_domain, bdev_io->u.bdev.memory_domain_ctx);
924-
925-
struct raid_bdev *raid_bdev = raid_io->raid_bdev;
926-
raid_bdev->priority_class = (bdev_io->u.bdev.offset_blocks & PRIORITY_CLASS_MASK) >> PRIORITY_CLASS_BITS_POS;
924+
raid_io->priority_class = (bdev_io->u.bdev.offset_blocks & PRIORITY_CLASS_MASK) >> PRIORITY_CLASS_BITS_POS;
927925

928926
switch (bdev_io->type) {
929927
case SPDK_BDEV_IO_TYPE_READ:

module/bdev/raid/bdev_raid.h

+5-9
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ struct raid_bdev_io {
126126
/* The raid bdev associated with this IO */
127127
struct raid_bdev *raid_bdev;
128128

129+
int8_t priority_class; /* priority class of the parent SPDK blob and lvol who submitted this I/O request */
129130
uint64_t offset_blocks;
130131
uint64_t num_blocks;
131132
struct iovec *iovs;
@@ -194,9 +195,6 @@ struct raid_bdev {
194195
/* array of base bdev info */
195196
struct raid_base_bdev_info *base_bdev_info;
196197

197-
/* priority class of the parent SPDK blob and lvol */
198-
int priority_class;
199-
200198
/* strip size of raid bdev in blocks */
201199
uint32_t strip_size;
202200

@@ -406,9 +404,8 @@ static inline int
406404
raid_bdev_readv_blocks_ext(struct raid_base_bdev_info *base_info, struct spdk_io_channel *ch,
407405
struct iovec *iov, int iovcnt, uint64_t offset_blocks,
408406
uint64_t num_blocks, spdk_bdev_io_completion_cb cb, void *cb_arg,
409-
struct spdk_bdev_ext_io_opts *opts)
407+
struct spdk_bdev_ext_io_opts *opts, int8_t priority_class)
410408
{
411-
const int priority_class = base_info->raid_bdev->priority_class;
412409
const uint64_t priority_blocks = ((uint64_t)priority_class << PRIORITY_CLASS_BITS_POS) | (base_info->data_offset + offset_blocks);
413410

414411
return spdk_bdev_readv_blocks_ext(base_info->desc, ch, iov, iovcnt,
@@ -422,7 +419,7 @@ static inline int
422419
raid_bdev_writev_blocks_ext(struct raid_base_bdev_info *base_info, struct spdk_io_channel *ch,
423420
struct iovec *iov, int iovcnt, uint64_t offset_blocks,
424421
uint64_t num_blocks, spdk_bdev_io_completion_cb cb, void *cb_arg,
425-
struct spdk_bdev_ext_io_opts *opts)
422+
struct spdk_bdev_ext_io_opts *opts, int8_t priority_class)
426423
{
427424
int rc;
428425
uint64_t remapped_offset_blocks = base_info->data_offset + offset_blocks;
@@ -436,7 +433,6 @@ raid_bdev_writev_blocks_ext(struct raid_base_bdev_info *base_info, struct spdk_i
436433
}
437434
}
438435

439-
const int priority_class = base_info->raid_bdev->priority_class;
440436
const uint64_t priority_blocks = ((uint64_t)priority_class << PRIORITY_CLASS_BITS_POS) | remapped_offset_blocks;
441437

442438
return spdk_bdev_writev_blocks_ext(base_info->desc, ch, iov, iovcnt,
@@ -451,7 +447,7 @@ raid_bdev_unmap_blocks(struct raid_base_bdev_info *base_info, struct spdk_io_cha
451447
uint64_t offset_blocks, uint64_t num_blocks,
452448
spdk_bdev_io_completion_cb cb, void *cb_arg)
453449
{
454-
const int priority_class = base_info->raid_bdev->priority_class;
450+
const int priority_class = ((struct raid_bdev_io*)cb_arg)->priority_class;
455451
const uint64_t priority_blocks = ((uint64_t)priority_class << PRIORITY_CLASS_BITS_POS) | (base_info->data_offset + offset_blocks);
456452

457453
return spdk_bdev_unmap_blocks(base_info->desc, ch, priority_blocks,
@@ -466,7 +462,7 @@ raid_bdev_flush_blocks(struct raid_base_bdev_info *base_info, struct spdk_io_cha
466462
uint64_t offset_blocks, uint64_t num_blocks,
467463
spdk_bdev_io_completion_cb cb, void *cb_arg)
468464
{
469-
const int priority_class = base_info->raid_bdev->priority_class;
465+
const int priority_class = ((struct raid_bdev_io*)cb_arg)->priority_class;
470466
const uint64_t priority_blocks = ((uint64_t)priority_class << PRIORITY_CLASS_BITS_POS) | (base_info->data_offset + offset_blocks);
471467

472468
return spdk_bdev_flush_blocks(base_info->desc, ch, priority_blocks,

module/bdev/raid/bdev_raid_sb.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -359,10 +359,9 @@ _raid_bdev_write_superblock(void *_ctx)
359359

360360
const uint64_t offset_blocks = 0;
361361
const uint64_t num_blocks = raid_bdev->sb_io_buf_size / bdev->blocklen;
362-
const uint64_t priority_blocks = ((uint64_t)raid_bdev->priority_class << PRIORITY_CLASS_BITS_POS) | offset_blocks;
363362

364363
rc = spdk_bdev_write_blocks(base_info->desc, base_info->app_thread_ch,
365-
raid_bdev->sb_io_buf, priority_blocks, num_blocks,
364+
raid_bdev->sb_io_buf, offset_blocks, num_blocks,
366365
raid_bdev_write_superblock_cb, ctx);
367366
if (rc != 0) {
368367
if (rc == -ENOMEM) {

module/bdev/raid/concat.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,12 @@ concat_submit_rw_request(struct raid_bdev_io *raid_io)
111111
ret = raid_bdev_readv_blocks_ext(base_info, base_ch,
112112
raid_io->iovs, raid_io->iovcnt,
113113
pd_lba, pd_blocks, concat_bdev_io_completion,
114-
raid_io, &io_opts);
114+
raid_io, &io_opts, raid_io->priority_class);
115115
} else if (raid_io->type == SPDK_BDEV_IO_TYPE_WRITE) {
116116
ret = raid_bdev_writev_blocks_ext(base_info, base_ch,
117117
raid_io->iovs, raid_io->iovcnt,
118118
pd_lba, pd_blocks, concat_bdev_io_completion,
119-
raid_io, &io_opts);
119+
raid_io, &io_opts, raid_io->priority_class);
120120
} else {
121121
SPDK_ERRLOG("Recvd not supported io type %u\n", raid_io->type);
122122
assert(0);

module/bdev/raid/raid0.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ raid0_submit_rw_request(struct raid_bdev_io *raid_io)
127127
ret = raid_bdev_readv_blocks_ext(base_info, base_ch,
128128
raid_io->iovs, raid_io->iovcnt,
129129
pd_lba, pd_blocks, raid0_bdev_io_completion,
130-
raid_io, &io_opts);
130+
raid_io, &io_opts, raid_io->priority_class);
131131
} else if (raid_io->type == SPDK_BDEV_IO_TYPE_WRITE) {
132132
struct spdk_bdev *bdev = &base_info->raid_bdev->bdev;
133133

@@ -145,7 +145,7 @@ raid0_submit_rw_request(struct raid_bdev_io *raid_io)
145145
ret = raid_bdev_writev_blocks_ext(base_info, base_ch,
146146
raid_io->iovs, raid_io->iovcnt,
147147
pd_lba, pd_blocks, raid0_bdev_io_completion,
148-
raid_io, &io_opts);
148+
raid_io, &io_opts, raid_io->priority_class);
149149
} else {
150150
SPDK_ERRLOG("Recvd not supported io type %u\n", raid_io->type);
151151
assert(0);

module/bdev/raid/raid1.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ raid1_correct_read_error(void *_raid_io)
113113
raid1_init_ext_io_opts(&io_opts, raid_io);
114114
ret = raid_bdev_writev_blocks_ext(base_info, base_ch, raid_io->iovs, raid_io->iovcnt,
115115
raid_io->offset_blocks, raid_io->num_blocks,
116-
raid1_correct_read_error_completion, raid_io, &io_opts);
116+
raid1_correct_read_error_completion, raid_io, &io_opts, raid_io->priority_class);
117117
if (spdk_unlikely(ret != 0)) {
118118
if (ret == -ENOMEM) {
119119
raid_bdev_queue_io_wait(raid_io, spdk_bdev_desc_get_bdev(base_info->desc),
@@ -169,7 +169,7 @@ raid1_read_other_base_bdev(void *_raid_io)
169169
raid1_init_ext_io_opts(&io_opts, raid_io);
170170
ret = raid_bdev_readv_blocks_ext(base_info, base_ch, raid_io->iovs, raid_io->iovcnt,
171171
raid_io->offset_blocks, raid_io->num_blocks,
172-
raid1_read_other_completion, raid_io, &io_opts);
172+
raid1_read_other_completion, raid_io, &io_opts, raid_io->priority_class);
173173
if (spdk_unlikely(ret != 0)) {
174174
if (ret == -ENOMEM) {
175175
raid_bdev_queue_io_wait(raid_io, spdk_bdev_desc_get_bdev(base_info->desc),
@@ -258,7 +258,7 @@ raid1_submit_read_request(struct raid_bdev_io *raid_io)
258258
raid1_init_ext_io_opts(&io_opts, raid_io);
259259
ret = raid_bdev_readv_blocks_ext(base_info, base_ch, raid_io->iovs, raid_io->iovcnt,
260260
raid_io->offset_blocks, raid_io->num_blocks,
261-
raid1_read_bdev_io_completion, raid_io, &io_opts);
261+
raid1_read_bdev_io_completion, raid_io, &io_opts, raid_io->priority_class);
262262

263263
if (spdk_likely(ret == 0)) {
264264
raid1_channel_inc_read_counters(raid_ch, idx, raid_io->num_blocks);
@@ -302,7 +302,7 @@ raid1_submit_write_request(struct raid_bdev_io *raid_io)
302302

303303
ret = raid_bdev_writev_blocks_ext(base_info, base_ch, raid_io->iovs, raid_io->iovcnt,
304304
raid_io->offset_blocks, raid_io->num_blocks,
305-
raid1_write_bdev_io_completion, raid_io, &io_opts);
305+
raid1_write_bdev_io_completion, raid_io, &io_opts, raid_io->priority_class);
306306
if (spdk_unlikely(ret != 0)) {
307307
if (spdk_unlikely(ret == -ENOMEM)) {
308308
raid_bdev_queue_io_wait(raid_io, spdk_bdev_desc_get_bdev(base_info->desc),
@@ -453,7 +453,7 @@ raid1_process_submit_write(struct raid_bdev_process_request *process_req)
453453
ret = raid_bdev_writev_blocks_ext(process_req->target, process_req->target_ch,
454454
raid_io->iovs, raid_io->iovcnt,
455455
raid_io->offset_blocks, raid_io->num_blocks,
456-
raid1_process_write_completed, process_req, &io_opts);
456+
raid1_process_write_completed, process_req, &io_opts, raid_io->priority_class);
457457
if (spdk_unlikely(ret != 0)) {
458458
if (ret == -ENOMEM) {
459459
raid_bdev_queue_io_wait(raid_io, spdk_bdev_desc_get_bdev(process_req->target->desc),

module/bdev/raid/raid5f.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ raid5f_chunk_submit(struct chunk *chunk)
448448

449449
ret = raid_bdev_writev_blocks_ext(base_info, base_ch, chunk->iovs, chunk->iovcnt,
450450
base_offset_blocks, raid_bdev->strip_size,
451-
raid5f_chunk_complete_bdev_io, chunk, &io_opts);
451+
raid5f_chunk_complete_bdev_io, chunk, &io_opts, raid_io->priority_class);
452452
break;
453453
case STRIPE_REQ_RECONSTRUCT:
454454
if (chunk == stripe_req->reconstruct.chunk) {
@@ -460,7 +460,7 @@ raid5f_chunk_submit(struct chunk *chunk)
460460

461461
ret = raid_bdev_readv_blocks_ext(base_info, base_ch, chunk->iovs, chunk->iovcnt,
462462
base_offset_blocks, raid_io->num_blocks,
463-
raid5f_chunk_complete_bdev_io, chunk, &io_opts);
463+
raid5f_chunk_complete_bdev_io, chunk, &io_opts, raid_io->priority_class);
464464
break;
465465
default:
466466
assert(false);
@@ -791,7 +791,7 @@ raid5f_submit_read_request(struct raid_bdev_io *raid_io, uint64_t stripe_index,
791791

792792
ret = raid_bdev_readv_blocks_ext(base_info, base_ch, raid_io->iovs, raid_io->iovcnt,
793793
base_offset_blocks, raid_io->num_blocks,
794-
raid5f_chunk_read_complete, raid_io, &io_opts);
794+
raid5f_chunk_read_complete, raid_io, &io_opts, raid_io->priority_class);
795795
if (spdk_unlikely(ret == -ENOMEM)) {
796796
raid_bdev_queue_io_wait(raid_io, spdk_bdev_desc_get_bdev(base_info->desc),
797797
base_ch, _raid5f_submit_rw_request);
@@ -1174,7 +1174,7 @@ raid5f_process_submit_write(struct raid_bdev_process_request *process_req)
11741174
ret = raid_bdev_writev_blocks_ext(process_req->target, process_req->target_ch,
11751175
raid_io->iovs, raid_io->iovcnt,
11761176
stripe_index << raid_bdev->strip_size_shift, raid_bdev->strip_size,
1177-
raid5f_process_write_completed, process_req, &io_opts);
1177+
raid5f_process_write_completed, process_req, &io_opts, raid_io->priority_class);
11781178
if (spdk_unlikely(ret != 0)) {
11791179
if (ret == -ENOMEM) {
11801180
raid_bdev_queue_io_wait(raid_io, spdk_bdev_desc_get_bdev(process_req->target->desc),

0 commit comments

Comments
 (0)