On 03/23/13 12:28, Wanlong Gao wrote:
+static struct virtio_scsi_vq *virtscsi_pick_vq(struct virtio_scsi *vscsi,
+                                              struct virtio_scsi_target_state 
*tgt)
+{
+       struct virtio_scsi_vq *vq;
+       unsigned long flags;
+       u32 queue_num;
+
+       spin_lock_irqsave(&tgt->tgt_lock, flags);
+
+       /*
+        * The memory barrier after atomic_inc_return matches
+        * the smp_read_barrier_depends() in virtscsi_req_done.
+        */
+       if (atomic_inc_return(&tgt->reqs) > 1)
+               vq = ACCESS_ONCE(tgt->req_vq);
+       else {
+               queue_num = smp_processor_id();
+               while (unlikely(queue_num >= vscsi->num_queues))
+                       queue_num -= vscsi->num_queues;
+
+               tgt->req_vq = vq = &vscsi->req_vqs[queue_num];
+       }
+
+       spin_unlock_irqrestore(&tgt->tgt_lock, flags);
+       return vq;
+}

Is there any reason why the smp_processor_id() % vscsi->num_queues computation in virtscsi_pick_vq() has been implemented as a loop instead of as an arithmetic operation ? If so, I would appreciate it if that could be explained in a comment.

Thanks,

Bart.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to