On 2021/09/24 8:27, Bart Van Assche wrote: > Check a statistics invariant at module unload time. When running > blktests, the invariant is verified every time a request queue is > removed and hence is verified at least once per test. > > Cc: Damien Le Moal <damien.lemoal@xxxxxxx> > Cc: Niklas Cassel <Niklas.Cassel@xxxxxxx> > Cc: Hannes Reinecke <hare@xxxxxxx> > Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> > --- > block/mq-deadline.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/block/mq-deadline.c b/block/mq-deadline.c > index b1175e4560ad..6deb4306bcf3 100644 > --- a/block/mq-deadline.c > +++ b/block/mq-deadline.c > @@ -270,6 +270,12 @@ deadline_move_request(struct deadline_data *dd, struct dd_per_prio *per_prio, > deadline_remove_request(rq->q, per_prio, rq); > } > > +/* Number of requests queued for a given priority level. */ > +static u32 dd_queued(struct deadline_data *dd, enum dd_prio prio) > +{ > + return dd_sum(dd, inserted, prio) - dd_sum(dd, completed, prio); > +} > + > /* > * deadline_check_fifo returns 0 if there are no expired requests on the fifo, > * 1 otherwise. Requires !list_empty(&dd->fifo_list[data_dir]) > @@ -539,6 +545,12 @@ static void dd_exit_sched(struct elevator_queue *e) > > WARN_ON_ONCE(!list_empty(&per_prio->fifo_list[DD_READ])); > WARN_ON_ONCE(!list_empty(&per_prio->fifo_list[DD_WRITE])); > + WARN_ONCE(dd_queued(dd, prio) != 0, > + "statistics for priority %d: i %u m %u d %u c %u\n", > + prio, dd_sum(dd, inserted, prio), > + dd_sum(dd, merged, prio), > + dd_sum(dd, dispatched, prio), > + dd_sum(dd, completed, prio)); > } > > free_percpu(dd->stats); > @@ -950,12 +962,6 @@ static int dd_async_depth_show(void *data, struct seq_file *m) > return 0; > } > > -/* Number of requests queued for a given priority level. */ > -static u32 dd_queued(struct deadline_data *dd, enum dd_prio prio) > -{ > - return dd_sum(dd, inserted, prio) - dd_sum(dd, completed, prio); > -} > - > static int dd_queued_show(void *data, struct seq_file *m) > { > struct request_queue *q = data; > Looks good. Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxx> -- Damien Le Moal Western Digital Research