On Thu, 4 Mar 2021, JeffleXu wrote: > > __split_and_process_non_flush records the poll cookie in ci.poll_cookie. > > When we processed all the bios, we poll for the last cookie here: > > > > if (ci.poll_cookie != BLK_QC_T_NONE) { > > while (atomic_read(&ci.io->io_count) > 1 && > > blk_poll(ci.poll_queue, ci.poll_cookie, true)) ; > > } > > So what will happen if one bio submitted to dm device crosses the device > boundary among several target devices (e.g., dm-stripe)? Please refer > the following call graph. > > ``` > submit_bio > __submit_bio_noacct > disk->fops->submit_bio(), calling into __split_and_process_bio(), > call __split_and_process_non_flush() once, submitting the *first* split bio > disk->fops->submit_bio(), calling into __split_and_process_bio(), > call __split_and_process_non_flush() once, submitting the *second* split bio > ... > ``` > > > So the loop is in __submit_bio_noacct(), rather than > __split_and_process_bio(). Your design will send the first split bio, > and then poll on this split bio, then send the next split bio, polling > on this, go on and on... No. It will send all the bios and poll for the last one. Mikulas -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel