]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/scsi/qla2xxx/qla_iocb.c
[SCSI] qla2xxx: Add CPU affinity support.
[net-next-2.6.git] / drivers / scsi / qla2xxx / qla_iocb.c
index 94b69d86482d90785e46d104990d3ff94bc84da1..7b15ded991cb67040678df287eef6b4eb2593d3c 100644 (file)
@@ -15,6 +15,7 @@ static request_t *qla2x00_req_pkt(struct scsi_qla_host *, struct req_que *,
                                                        struct rsp_que *rsp);
 static void qla2x00_isp_cmd(struct scsi_qla_host *, struct req_que *);
 
+static void qla25xx_set_que(srb_t *, struct req_que **, struct rsp_que **);
 /**
  * qla2x00_get_cmd_direction() - Determine control_flag data direction.
  * @cmd: SCSI command
@@ -726,8 +727,7 @@ qla24xx_start_scsi(srb_t *sp)
        /* Setup device pointers. */
        ret = 0;
 
-       req = vha->req;
-       rsp = ha->rsp_q_map[0];
+       qla25xx_set_que(sp, &req, &rsp);
        sp->que = req;
 
        /* So we know we haven't pci_map'ed anything yet */
@@ -850,3 +850,21 @@ queuing_error:
 
        return QLA_FUNCTION_FAILED;
 }
+
+static void qla25xx_set_que(srb_t *sp, struct req_que **req,
+       struct rsp_que **rsp)
+{
+       struct scsi_cmnd *cmd = sp->cmd;
+       struct scsi_qla_host *vha = sp->fcport->vha;
+       struct qla_hw_data *ha = sp->fcport->vha->hw;
+       int affinity = cmd->request->cpu;
+
+       if (ql2xmultique_tag && affinity >= 0 &&
+               affinity < ha->max_rsp_queues - 1) {
+               *rsp = ha->rsp_q_map[affinity + 1];
+               *req = ha->req_q_map[1];
+       } else {
+               *req = vha->req;
+               *rsp = ha->rsp_q_map[0];
+       }
+}