|
@@ -238,6 +238,22 @@ static inline struct blkcg *bio_blkcg(struct bio *bio)
|
|
|
return css_to_blkcg(task_css(current, io_cgrp_id));
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * bio_issue_as_root_blkg - see if this bio needs to be issued as root blkg
|
|
|
+ * @return: true if this bio needs to be submitted with the root blkg context.
|
|
|
+ *
|
|
|
+ * In order to avoid priority inversions we sometimes need to issue a bio as if
|
|
|
+ * it were attached to the root blkg, and then backcharge to the actual owning
|
|
|
+ * blkg. The idea is we do bio_blkcg() to look up the actual context for the
|
|
|
+ * bio and attach the appropriate blkg to the bio. Then we call this helper and
|
|
|
+ * if it is true run with the root blkg for that queue and then do any
|
|
|
+ * backcharging to the originating cgroup once the io is complete.
|
|
|
+ */
|
|
|
+static inline bool bio_issue_as_root_blkg(struct bio *bio)
|
|
|
+{
|
|
|
+ return (bio->bi_opf & REQ_META);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* blkcg_parent - get the parent of a blkcg
|
|
|
* @blkcg: blkcg of interest
|