@@ -549,41 +549,66 @@ static inline bool wbt_should_throttle(struct rq_wb *rwb, struct bio *bio)
549549 }
550550}
551551
552+ static enum wbt_flags bio_to_wbt_flags (struct rq_wb * rwb , struct bio * bio )
553+ {
554+ enum wbt_flags flags = 0 ;
555+
556+ if (bio_op (bio ) == REQ_OP_READ ) {
557+ flags = WBT_READ ;
558+ } else if (wbt_should_throttle (rwb , bio )) {
559+ if (current_is_kswapd ())
560+ flags |= WBT_KSWAPD ;
561+ if (bio_op (bio ) == REQ_OP_DISCARD )
562+ flags |= WBT_DISCARD ;
563+ flags |= WBT_TRACKED ;
564+ }
565+ return flags ;
566+ }
567+
568+ static void wbt_cleanup (struct rq_qos * rqos , struct bio * bio )
569+ {
570+ struct rq_wb * rwb = RQWB (rqos );
571+ enum wbt_flags flags = bio_to_wbt_flags (rwb , bio );
572+ __wbt_done (rqos , flags );
573+ }
574+
552575/*
553576 * Returns true if the IO request should be accounted, false if not.
554577 * May sleep, if we have exceeded the writeback limits. Caller can pass
555578 * in an irq held spinlock, if it holds one when calling this function.
556579 * If we do sleep, we'll release and re-grab it.
557580 */
558- static enum wbt_flags wbt_wait (struct rq_qos * rqos , struct bio * bio ,
559- spinlock_t * lock )
581+ static void wbt_wait (struct rq_qos * rqos , struct bio * bio , spinlock_t * lock )
560582{
561583 struct rq_wb * rwb = RQWB (rqos );
562- enum wbt_flags ret = 0 ;
584+ enum wbt_flags flags ;
563585
564586 if (!rwb_enabled (rwb ))
565- return 0 ;
587+ return ;
566588
567- if (bio_op (bio ) == REQ_OP_READ )
568- ret = WBT_READ ;
589+ flags = bio_to_wbt_flags (rwb , bio );
569590
570591 if (!wbt_should_throttle (rwb , bio )) {
571- if (ret & WBT_READ )
592+ if (flags & WBT_READ )
572593 wb_timestamp (rwb , & rwb -> last_issue );
573- return ret ;
594+ return ;
574595 }
575596
576597 if (current_is_kswapd ())
577- ret |= WBT_KSWAPD ;
598+ flags |= WBT_KSWAPD ;
578599 if (bio_op (bio ) == REQ_OP_DISCARD )
579- ret |= WBT_DISCARD ;
600+ flags |= WBT_DISCARD ;
580601
581- __wbt_wait (rwb , ret , bio -> bi_opf , lock );
602+ __wbt_wait (rwb , flags , bio -> bi_opf , lock );
582603
583604 if (!blk_stat_is_active (rwb -> cb ))
584605 rwb_arm_timer (rwb );
606+ }
585607
586- return ret | WBT_TRACKED ;
608+ static void wbt_track (struct rq_qos * rqos , struct request * rq , struct bio * bio )
609+ {
610+ struct rq_wb * rwb = RQWB (rqos );
611+ rq -> wbt_flags |= bio_to_wbt_flags (rwb , bio );
587612}
588613
589614void wbt_issue (struct rq_qos * rqos , struct request * rq )
@@ -707,9 +732,10 @@ EXPORT_SYMBOL_GPL(wbt_disable_default);
707732static struct rq_qos_ops wbt_rqos_ops = {
708733 .throttle = wbt_wait ,
709734 .issue = wbt_issue ,
735+ .track = wbt_track ,
710736 .requeue = wbt_requeue ,
711737 .done = wbt_done ,
712- .cleanup = __wbt_done ,
738+ .cleanup = wbt_cleanup ,
713739 .exit = wbt_exit ,
714740};
715741
0 commit comments