From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60948) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDCXn-0000Zi-Lf for qemu-devel@nongnu.org; Thu, 09 Jul 2015 10:11:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZDCXk-0004De-Dj for qemu-devel@nongnu.org; Thu, 09 Jul 2015 10:11:19 -0400 Received: from mail-wi0-x22d.google.com ([2a00:1450:400c:c05::22d]:34674) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDCXk-0004DU-2I for qemu-devel@nongnu.org; Thu, 09 Jul 2015 10:11:16 -0400 Received: by wifm2 with SMTP id m2so19984827wif.1 for ; Thu, 09 Jul 2015 07:11:15 -0700 (PDT) Sender: Paolo Bonzini References: <1435990034-8945-1-git-send-email-jsnow@redhat.com> <1435990034-8945-33-git-send-email-jsnow@redhat.com> From: Paolo Bonzini Message-ID: <559E8101.8020305@redhat.com> Date: Thu, 9 Jul 2015 16:11:13 +0200 MIME-Version: 1.0 In-Reply-To: <1435990034-8945-33-git-send-email-jsnow@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PULL 32/35] ahci: ncq migration List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: John Snow , qemu-devel@nongnu.org Cc: peter.maydell@linaro.org On 04/07/2015 08:07, John Snow wrote: > 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 > Reviewed-by: Stefan Hajnoczi > Message-id: 1435767578-32743-13-git-send-email-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, sector_count should be cast to a 64-bit type before multiplying it. Paolo > + 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 >