[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH 06/16] ahci: record ncq failures
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-block] [PATCH 06/16] ahci: record ncq failures |
Date: |
Fri, 26 Jun 2015 16:35:14 +0100 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Mon, Jun 22, 2015 at 08:21:05PM -0400, John Snow wrote:
> Handle NCQ failures for cases where we want to halt the VM on IO errors.
>
> Signed-off-by: John Snow <address@hidden>
> ---
> hw/ide/ahci.c | 17 +++++++++++++++--
> hw/ide/ahci.h | 1 +
> hw/ide/internal.h | 1 +
> 3 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
> index 71b5085..a838317 100644
> --- a/hw/ide/ahci.c
> +++ b/hw/ide/ahci.c
> @@ -959,13 +959,25 @@ static void ncq_cb(void *opaque, int ret)
> return;
> }
>
> + ncq_tfs->halt = false;
Why does halt need to be cleared here?
> if (ret < 0) {
> - ncq_err(ncq_tfs);
> + bool is_read = ncq_tfs->cmd == READ_FPDMA_QUEUED;
> + BlockErrorAction action = blk_get_error_action(ide_state->blk,
> + is_read, -ret);
> + if (action == BLOCK_ERROR_ACTION_STOP) {
> + ncq_tfs->halt = true;
> + ide_state->bus->error_status = IDE_RETRY_HBA;
> + } else if (action == BLOCK_ERROR_ACTION_REPORT) {
> + ncq_err(ncq_tfs);
> + }
> + blk_error_action(ide_state->blk, action, is_read, -ret);
> } else {
> ide_state->status = READY_STAT | SEEK_STAT;
> }
>
> - ncq_finish(ncq_tfs);
> + if (!ncq_tfs->halt) {
> + ncq_finish(ncq_tfs);
> + }
> }
>
> static int is_ncq(uint8_t ata_cmd)
> @@ -1042,6 +1054,7 @@ static void process_ncq_command(AHCIState *s, int port,
> uint8_t *cmd_fis,
> }
>
> ncq_tfs->used = 1;
> + ncq_tfs->halt = false;
> ncq_tfs->drive = ad;
> ncq_tfs->slot = slot;
> ncq_tfs->cmd = ncq_fis->command;
> diff --git a/hw/ide/ahci.h b/hw/ide/ahci.h
> index 33607d7..47a3122 100644
> --- a/hw/ide/ahci.h
> +++ b/hw/ide/ahci.h
> @@ -262,6 +262,7 @@ typedef struct NCQTransferState {
> uint8_t cmd;
> int slot;
> int used;
> + bool halt;
> } NCQTransferState;
>
> struct AHCIDevice {
> diff --git a/hw/ide/internal.h b/hw/ide/internal.h
> index 7a4a86d..5abee19 100644
> --- a/hw/ide/internal.h
> +++ b/hw/ide/internal.h
> @@ -499,6 +499,7 @@ struct IDEDevice {
> #define IDE_RETRY_READ 0x20
> #define IDE_RETRY_FLUSH 0x40
> #define IDE_RETRY_TRIM 0x80
> +#define IDE_RETRY_HBA 0x100
Feel free to squash this patch together with the next one. It is hard
to review in isolation since IDE_RETRY_HBA and ->halt aren't used yet.
pgp4d06fVcjIr.pgp
Description: PGP signature
- [Qemu-block] [PATCH 00/16] ahci: ncq cleanup, part 2, John Snow, 2015/06/22
- [Qemu-block] [PATCH 02/16] ahci: stash ncq command, John Snow, 2015/06/22
- [Qemu-block] [PATCH 03/16] ahci: assert is_ncq for process_ncq, John Snow, 2015/06/22
- [Qemu-block] [PATCH 04/16] ahci: refactor process_ncq_command, John Snow, 2015/06/22
- [Qemu-block] [PATCH 05/16] ahci: factor ncq_finish out of ncq_cb, John Snow, 2015/06/22
- [Qemu-block] [PATCH 06/16] ahci: record ncq failures, John Snow, 2015/06/22
- Re: [Qemu-block] [PATCH 06/16] ahci: record ncq failures,
Stefan Hajnoczi <=
- Re: [Qemu-block] [Qemu-devel] [PATCH 06/16] ahci: record ncq failures, John Snow, 2015/06/26
- Re: [Qemu-block] [Qemu-devel] [PATCH 06/16] ahci: record ncq failures, Stefan Hajnoczi, 2015/06/29
- Re: [Qemu-block] [Qemu-devel] [PATCH 06/16] ahci: record ncq failures, Stefan Hajnoczi, 2015/06/29
- Re: [Qemu-block] [Qemu-devel] [PATCH 06/16] ahci: record ncq failures, John Snow, 2015/06/29
- Re: [Qemu-block] [Qemu-devel] [PATCH 06/16] ahci: record ncq failures, John Snow, 2015/06/29
- Re: [Qemu-block] [Qemu-devel] [PATCH 06/16] ahci: record ncq failures, Stefan Hajnoczi, 2015/06/30
[Qemu-block] [PATCH 07/16] ahci: kick NCQ queue, John Snow, 2015/06/22
[Qemu-block] [PATCH 08/16] ahci: correct types in NCQTransferState, John Snow, 2015/06/22
[Qemu-block] [PATCH 09/16] ahci: correct ncq sector count, John Snow, 2015/06/22
[Qemu-block] [PATCH 01/16] ide: add limit to .prepare_buf(), John Snow, 2015/06/22