From: John Snow <jsnow@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, pbonzini@redhat.com,
John Snow <jsnow@redhat.com>,
qemu-devel@nongnu.org, stefanha@redhat.com
Subject: [Qemu-devel] [PATCH v2 12/15] ahci: ncq migration
Date: Wed, 1 Jul 2015 12:19:35 -0400 [thread overview]
Message-ID: <1435767578-32743-13-git-send-email-jsnow@redhat.com> (raw)
In-Reply-To: <1435767578-32743-1-git-send-email-jsnow@redhat.com>
Migrate the NCQ queue. This is solely for the benefit of halted commands,
since anything else should have completed and had any relevant status
flushed to the HBA registers already.
Signed-off-by: John Snow <jsnow@redhat.com>
---
hw/ide/ahci.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 13b0157..a2620f6 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1521,6 +1521,21 @@ void ahci_reset(AHCIState *s)
}
}
+static const VMStateDescription vmstate_ncq_tfs = {
+ .name = "ncq state",
+ .version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT32(sector_count, NCQTransferState),
+ VMSTATE_UINT64(lba, NCQTransferState),
+ VMSTATE_UINT8(tag, NCQTransferState),
+ VMSTATE_UINT8(cmd, NCQTransferState),
+ VMSTATE_UINT8(slot, NCQTransferState),
+ VMSTATE_BOOL(used, NCQTransferState),
+ VMSTATE_BOOL(halt, NCQTransferState),
+ VMSTATE_END_OF_LIST()
+ },
+};
+
static const VMStateDescription vmstate_ahci_device = {
.name = "ahci port",
.version_id = 1,
@@ -1546,14 +1561,17 @@ static const VMStateDescription vmstate_ahci_device = {
VMSTATE_BOOL(done_atapi_packet, AHCIDevice),
VMSTATE_INT32(busy_slot, AHCIDevice),
VMSTATE_BOOL(init_d2h_sent, AHCIDevice),
+ VMSTATE_STRUCT_ARRAY(ncq_tfs, AHCIDevice, AHCI_MAX_CMDS,
+ 1, vmstate_ncq_tfs, NCQTransferState),
VMSTATE_END_OF_LIST()
},
};
static int ahci_state_post_load(void *opaque, int version_id)
{
- int i;
+ int i, j;
struct AHCIDevice *ad;
+ NCQTransferState *ncq_tfs;
AHCIState *s = opaque;
for (i = 0; i < s->ports; i++) {
@@ -1565,6 +1583,37 @@ static int ahci_state_post_load(void *opaque, int version_id)
return -1;
}
+ for (j = 0; j < AHCI_MAX_CMDS; j++) {
+ ncq_tfs = &ad->ncq_tfs[j];
+ ncq_tfs->drive = ad;
+
+ if (ncq_tfs->used != ncq_tfs->halt) {
+ return -1;
+ }
+ if (!ncq_tfs->halt) {
+ continue;
+ }
+ if (!is_ncq(ncq_tfs->cmd)) {
+ return -1;
+ }
+ if (ncq_tfs->slot != ncq_tfs->tag) {
+ return -1;
+ }
+ /* If ncq_tfs->halt is justly set, the engine should be engaged,
+ * and the command list buffer should be mapped. */
+ ncq_tfs->cmdh = get_cmd_header(s, i, ncq_tfs->slot);
+ if (!ncq_tfs->cmdh) {
+ return -1;
+ }
+ ahci_populate_sglist(ncq_tfs->drive, &ncq_tfs->sglist,
+ ncq_tfs->cmdh, ncq_tfs->sector_count * 512,
+ 0);
+ if (ncq_tfs->sector_count != ncq_tfs->sglist.size >> 9) {
+ return -1;
+ }
+ }
+
+
/*
* If an error is present, ad->busy_slot will be valid and not -1.
* In this case, an operation is waiting to resume and will re-check
--
2.1.0
next prev parent reply other threads:[~2015-07-01 16:19 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-01 16:19 [Qemu-devel] [PATCH v2 00/15] ahci: ncq cleanup, part 2 John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 01/15] ide: add limit to .prepare_buf() John Snow
2015-07-02 14:04 ` Stefan Hajnoczi
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 02/15] ahci: stash ncq command John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 03/15] ahci: assert is_ncq for process_ncq John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 04/15] ahci: refactor process_ncq_command John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 05/15] ahci: factor ncq_finish out of ncq_cb John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 06/15] ahci: add rwerror=stop support for ncq John Snow
2015-07-02 14:05 ` Stefan Hajnoczi
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 07/15] ahci: correct types in NCQTransferState John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 08/15] ahci: correct ncq sector count John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 09/15] qtest/ahci: halted NCQ test John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 10/15] ahci: add cmd header to ncq transfer state John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 11/15] ahci: add get_cmd_header helper John Snow
2015-07-01 16:19 ` John Snow [this message]
2015-07-02 14:06 ` [Qemu-devel] [PATCH v2 12/15] ahci: ncq migration Stefan Hajnoczi
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 13/15] ahci: Do not map cmd_fis to generate response John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 14/15] qtest/ahci: halted ncq migration test John Snow
2015-07-01 16:19 ` [Qemu-devel] [PATCH v2 15/15] ahci: fix sdb fis semantics John Snow
2015-07-02 14:09 ` [Qemu-devel] [PATCH v2 00/15] ahci: ncq cleanup, part 2 Stefan Hajnoczi
2015-07-02 15:36 ` John Snow
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=1435767578-32743-13-git-send-email-jsnow@redhat.com \
--to=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).