Message ID | 20170619142026.GA92582@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 06/19/2017 04:20 PM, Mike Snitzer wrote: > > Looks like submit_flush_bio() is disabling/enabling interrupts from > interrupt context. Ondrej, does this patch fix the issue? I let it spin for 30 minutes on patched dm-integrity and everything seems ok now. The moment I loaded back the old one it fell on face almost immediately again. Thanks! > > diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c > index 4ab10cf..93b1810 100644 > --- a/drivers/md/dm-integrity.c > +++ b/drivers/md/dm-integrity.c > @@ -1105,10 +1105,13 @@ static void schedule_autocommit(struct dm_integrity_c *ic) > static void submit_flush_bio(struct dm_integrity_c *ic, struct dm_integrity_io *dio) > { > struct bio *bio; > - spin_lock_irq(&ic->endio_wait.lock); > + unsigned long flags; > + > + spin_lock_irqsave(&ic->endio_wait.lock, flags); > bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io)); > bio_list_add(&ic->flush_bio_list, bio); > - spin_unlock_irq(&ic->endio_wait.lock); > + spin_unlock_irqrestore(&ic->endio_wait.lock, flags); > + > queue_work(ic->commit_wq, &ic->commit_work); > } > > > -- > dm-devel mailing list > dm-devel@redhat.com > https://www.redhat.com/mailman/listinfo/dm-devel >
On Mon, Jun 19 2017 at 11:16am -0400, Ondrej Kozina <okozina@redhat.com> wrote: > On 06/19/2017 04:20 PM, Mike Snitzer wrote: > > > >Looks like submit_flush_bio() is disabling/enabling interrupts from > >interrupt context. Ondrej, does this patch fix the issue? > > I let it spin for 30 minutes on patched dm-integrity and everything > seems ok now. The moment I loaded back the old one it fell on face > almost immediately again. OK, I'll get it staged as a fix for 4.12. Thanks, Mike
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c index 4ab10cf..93b1810 100644 --- a/drivers/md/dm-integrity.c +++ b/drivers/md/dm-integrity.c @@ -1105,10 +1105,13 @@ static void schedule_autocommit(struct dm_integrity_c *ic) static void submit_flush_bio(struct dm_integrity_c *ic, struct dm_integrity_io *dio) { struct bio *bio; - spin_lock_irq(&ic->endio_wait.lock); + unsigned long flags; + + spin_lock_irqsave(&ic->endio_wait.lock, flags); bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io)); bio_list_add(&ic->flush_bio_list, bio); - spin_unlock_irq(&ic->endio_wait.lock); + spin_unlock_irqrestore(&ic->endio_wait.lock, flags); + queue_work(ic->commit_wq, &ic->commit_work); }