From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: qemu-devel@nongnu.org
Cc: Anthony Liguori <aliguori@us.ibm.com>,
Alexey Kardashevskiy <aik@ozlabs.ru>,
Alexander Graf <agraf@suse.de>,
qemu-ppc@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
Paul Mackerras <paulus@samba.org>,
David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH v2] spapr-vscsi: add task management
Date: Mon, 22 Jul 2013 16:07:54 +1000 [thread overview]
Message-ID: <1374473274-24140-1-git-send-email-aik@ozlabs.ru> (raw)
In-Reply-To: <51EC6A31.3000907@redhat.com>
At the moment the guest kernel issues two types of task management
requests to the hypervisor - task about and lun reset. This adds
handling for these tasks. As spapr-vscsi starts calling scsi_req_cancel(),
free_request callback was implemented.
As virtio-vscsi, spapr-vscsi does not handle CLEAR_ACA either as CDB
control byte does not seem to be used at all so NACA bit is not
set to the guest so the guest has no good reason to call CLEAR_ACA task.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
Changes:
2013/07/22:
* fixed LUN_RESET (it used to clear requests while it should reset a device)
* added handling of ABORT_TASK_SET/CLEAR_TASK_SET
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
hw/scsi/spapr_vscsi.c | 73 +++++++++++++++++++++++++++++++++++++++------------
1 file changed, 56 insertions(+), 17 deletions(-)
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index a86199b..f1e0e8f 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -117,6 +117,20 @@ static struct vscsi_req *vscsi_get_req(VSCSIState *s)
return NULL;
}
+static struct vscsi_req *vscsi_find_req(VSCSIState *s, uint64_t srp_tag)
+{
+ vscsi_req *req;
+ int i;
+
+ for (i = 0; i < VSCSI_REQ_LIMIT; i++) {
+ req = &s->reqs[i];
+ if (req->iu.srp.cmd.tag == srp_tag) {
+ return req;
+ }
+ }
+ return NULL;
+}
+
static void vscsi_put_req(vscsi_req *req)
{
if (req->sreq != NULL) {
@@ -578,6 +592,13 @@ static void vscsi_request_cancelled(SCSIRequest *sreq)
vscsi_put_req(req);
}
+static void vscsi_free_request(SCSIBus *bus, void *priv)
+{
+ vscsi_req *req = priv;
+
+ vscsi_put_req(req);
+}
+
static const VMStateDescription vmstate_spapr_vscsi_req = {
.name = "spapr_vscsi_req",
.version_id = 1,
@@ -753,40 +774,57 @@ static int vscsi_queue_cmd(VSCSIState *s, vscsi_req *req)
static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req)
{
union viosrp_iu *iu = &req->iu;
- int fn;
+ vscsi_req *tmpreq;
+ SCSIDevice *sdev;
+ int i, lun = 0, error = 0;
fprintf(stderr, "vscsi_process_tsk_mgmt %02x\n",
iu->srp.tsk_mgmt.tsk_mgmt_func);
switch (iu->srp.tsk_mgmt.tsk_mgmt_func) {
-#if 0 /* We really don't deal with these for now */
case SRP_TSK_ABORT_TASK:
- fn = ABORT_TASK;
+ tmpreq = vscsi_find_req(s, req->iu.srp.tsk_mgmt.task_tag);
+ if (tmpreq && tmpreq->sreq) {
+ assert(tmpreq->sreq->hba_private);
+ scsi_req_cancel(tmpreq->sreq);
+ }
break;
+
+ case SRP_TSK_LUN_RESET:
+ sdev = vscsi_device_find(&s->bus, req->iu.srp.tsk_mgmt.lun, &lun);
+ if (sdev) {
+ qdev_reset_all(&sdev->qdev);
+ }
+ break;
+
case SRP_TSK_ABORT_TASK_SET:
- fn = ABORT_TASK_SET;
- break;
case SRP_TSK_CLEAR_TASK_SET:
- fn = CLEAR_TASK_SET;
- break;
- case SRP_TSK_LUN_RESET:
- fn = LOGICAL_UNIT_RESET;
+ for (i = 0; i < VSCSI_REQ_LIMIT; i++) {
+ tmpreq = &s->reqs[i];
+ if (tmpreq->iu.srp.cmd.lun != req->iu.srp.tsk_mgmt.lun) {
+ continue;
+ }
+ if (!tmpreq->active || !tmpreq->sreq) {
+ continue;
+ }
+ assert(tmpreq->sreq->hba_private);
+ scsi_req_cancel(tmpreq->sreq);
+ }
break;
+
case SRP_TSK_CLEAR_ACA:
- fn = CLEAR_ACA;
- break;
-#endif
default:
- fn = 0;
+ error = 1;
}
- if (fn) {
- /* XXX Send/Handle target task management */
- ;
+
+ if (!error) {
+ vscsi_send_rsp(s, req, GOOD, 0, 0);
} else {
vscsi_makeup_sense(s, req, ILLEGAL_REQUEST, 0x20, 0);
vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0);
}
- return !fn;
+
+ return 1;
}
static int vscsi_handle_srp_req(VSCSIState *s, vscsi_req *req)
@@ -998,6 +1036,7 @@ static const struct SCSIBusInfo vscsi_scsi_info = {
.cancel = vscsi_request_cancelled,
.save_request = vscsi_save_request,
.load_request = vscsi_load_request,
+ .free_request = vscsi_free_request,
};
static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
--
1.8.3.2
next prev parent reply other threads:[~2013-07-22 6:08 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-21 10:04 [Qemu-devel] [RFC PATCH] spapr-vscsi: add task management Alexey Kardashevskiy
2013-07-21 21:34 ` Benjamin Herrenschmidt
2013-07-21 23:09 ` Paolo Bonzini
2013-07-22 6:07 ` Alexey Kardashevskiy [this message]
2013-07-22 0:20 ` Alexey Kardashevskiy
2013-07-22 0:23 ` Benjamin Herrenschmidt
2013-07-22 0:57 ` Alexey Kardashevskiy
2013-07-22 1:04 ` Benjamin Herrenschmidt
2013-07-22 6:30 ` Paolo Bonzini
2013-07-22 6:35 ` Benjamin Herrenschmidt
2013-07-22 9:23 ` Alexey Kardashevskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1374473274-24140-1-git-send-email-aik@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=agraf@suse.de \
--cc=aliguori@us.ibm.com \
--cc=david@gibson.dropbear.id.au \
--cc=paulus@samba.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).