Which core does a NVMe IO request would go?
harryxiyou
harryxiyou at gmail.com
Wed Sep 10 13:10:10 PDT 2014
On Thu, Sep 11, 2014 at 3:46 AM, harryxiyou <harryxiyou at gmail.com> wrote:
> On Thu, Sep 11, 2014 at 3:43 AM, harryxiyou <harryxiyou at gmail.com> wrote:
>> Dear all,
>>
>> I am not sure "Which core does a NVMe IO request would go?" after
>> I read the NVMe driver source codes.
>>
>> The code says that,
>>
>>
>> 648 static int nvme_make_request(struct request_queue *q, struct request *req)
>> 649 {
>> 650 struct nvme_ns *ns = q->queuedata;
>> 651 struct nvme_queue *nvmeq = get_nvmeq(ns->dev);
>> ...
>> 659
>> 660 return result;
>> 661 }
>>
>>
>> 289 struct nvme_queue *get_nvmeq(struct nvme_dev *dev)
>> 290 {
>> 291 return dev->queues[get_cpu() + 1];
>> 292 }
>>
>>
>> dev->queues[get_cpu() + 1] tells us which core it goes but I don't know
>> what get_cpu() returns.
>>
>>
>> Could you please give me some suggestions?
>
> Maybe, I find the answers like this.
>
> get_cpu() disables kernel preemption prior to returning the current
> processor number
>
BTW, I cannot find the NVMe controller handle function
675 static int nvme_process_cq(struct nvme_queue *nvmeq)
676 {
677 u16 head, phase;
678
679 head = nvmeq->cq_head;
680 phase = nvmeq->cq_phase;
681
682 for (;;) {
683 void *ctx;
684 nvme_completion_fn fn;
...
693
694 ctx = free_cmdid(nvmeq, cqe.command_id, &fn);
695 fn(nvmeq, ctx, &cqe);
696 }
}
I cannot find the fn function, could anyone give me some suggestions?
Thanks, Harry
More information about the Linux-nvme
mailing list