|
@@ -272,3 +272,58 @@ int create_task_io_context(struct task_struct *task, gfp_t gfp_flags, int node)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * get_task_io_context - get io_context of a task
|
|
|
|
+ * @task: task of interest
|
|
|
|
+ * @gfp_flags: allocation flags, used if allocation is necessary
|
|
|
|
+ * @node: allocation node, used if allocation is necessary
|
|
|
|
+ *
|
|
|
|
+ * Return io_context of @task. If it doesn't exist, it is created with
|
|
|
|
+ * @gfp_flags and @node. The returned io_context has its reference count
|
|
|
|
+ * incremented.
|
|
|
|
+ *
|
|
|
|
+ * This function always goes through task_lock() and it's better to use
|
|
|
|
+ * %current->io_context + get_io_context() for %current.
|
|
|
|
+ */
|
|
|
|
+struct io_context *get_task_io_context(struct task_struct *task,
|
|
|
|
+ gfp_t gfp_flags, int node)
|
|
|
|
+{
|
|
|
|
+ struct io_context *ioc;
|
|
|
|
+
|
|
|
|
+ might_sleep_if(gfp_flags & __GFP_WAIT);
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ task_lock(task);
|
|
|
|
+ ioc = task->io_context;
|
|
|
|
+ if (likely(ioc)) {
|
|
|
|
+ get_io_context(ioc);
|
|
|
|
+ task_unlock(task);
|
|
|
|
+ return ioc;
|
|
|
|
+ }
|
|
|
|
+ task_unlock(task);
|
|
|
|
+ } while (!create_task_io_context(task, gfp_flags, node));
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(get_task_io_context);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * ioc_lookup_icq - lookup io_cq from ioc
|
|
|
|
+ * @ioc: the associated io_context
|
|
|
|
+ * @q: the associated request_queue
|
|
|
|
+ *
|
|
|
|
+ * Look up io_cq associated with @ioc - @q pair from @ioc. Must be called
|
|
|
|
+ * with @q->queue_lock held.
|
|
|
|
+ */
|
|
|
|
+struct io_cq *ioc_lookup_icq(struct io_context *ioc, struct request_queue *q)
|
|
|
|
+{
|
|
|
|
+ struct io_cq *icq;
|
|
|
|
+
|
|
|
|
+ lockdep_assert_held(q->queue_lock);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * icq's are indexed from @ioc using radix tree and hint pointer,
|
|
|
|
+ * both of which are protected with RCU. All removals are done
|
|
|
|
+ * holding both q and ioc locks, and we're holding q lock - if we
|
|
|
|
+ * find a icq which points to us, it's guaranteed to be valid.
|
|
|
|
+ */
|