Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/jdolecek-ncqfixes]: src/sys/dev/ata remove AT_RST_EMERG, do the queue re...



details:   https://anonhg.NetBSD.org/src/rev/010c6116c1a0
branches:  jdolecek-ncqfixes
changeset: 850595:010c6116c1a0
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Sat Oct 06 20:27:36 2018 +0000

description:
remove AT_RST_EMERG, do the queue reset explicitly in wd(4)

this should explicitly fix PR kern/47041 with sync during heavy
disk activity, even thought it was actually already implicitly fixed by calling
ata_thread_run() for drive reset in previous commit already, since the
function already called ata_queue_reset()

drop now unused ch_reset_flags and drive_reset_flags

diffstat:

 sys/dev/ata/ata.c    |  21 ++++-----------------
 sys/dev/ata/atavar.h |   9 +--------
 sys/dev/ata/wd.c     |  12 ++++++++----
 3 files changed, 13 insertions(+), 29 deletions(-)

diffs (151 lines):

diff -r dda2b09ff6a2 -r 010c6116c1a0 sys/dev/ata/ata.c
--- a/sys/dev/ata/ata.c Sat Oct 06 20:27:28 2018 +0000
+++ b/sys/dev/ata/ata.c Sat Oct 06 20:27:36 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ata.c,v 1.141.6.13 2018/10/06 20:13:12 jdolecek Exp $  */
+/*     $NetBSD: ata.c,v 1.141.6.14 2018/10/06 20:27:36 jdolecek Exp $  */
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.13 2018/10/06 20:13:12 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.14 2018/10/06 20:27:36 jdolecek Exp $");
 
 #include "opt_ata.h"
 
@@ -480,20 +480,17 @@
                }
                if (chp->ch_flags & ATACH_TH_RESET) {
                        /* this will unfreeze the channel */
-                       ata_thread_run(chp, AT_WAIT | chp->ch_reset_flags,
+                       ata_thread_run(chp, AT_WAIT,
                            ATACH_TH_RESET, ATACH_NODRIVE);
                } else if (chp->ch_flags & ATACH_TH_DRIVE_RESET) {
                        for (i = 0; i < chp->ch_ndrives; i++) {
                                struct ata_drive_datas *drvp;
-                               int drv_reset_flags;
 
                                drvp = &chp->ch_drive[i];
-                               drv_reset_flags = drvp->drive_reset_flags;
 
                                if (drvp->drive_flags & ATA_DRIVE_TH_RESET) {
                                        ata_thread_run(chp,
-                                           AT_WAIT | drv_reset_flags,
-                                           ATACH_TH_DRIVE_RESET, i);
+                                           AT_WAIT, ATACH_TH_DRIVE_RESET, i);
                                }
                        }
                        chp->ch_flags &= ~ATACH_TH_DRIVE_RESET;
@@ -1527,9 +1524,6 @@
        TAILQ_FOREACH_SAFE(xfer, &chq->active_xfers, c_activechain, xfernext) {
                xfer->ops->c_kill_xfer(xfer->c_chp, xfer, reason);
        }
-
-       if (flags & AT_RST_EMERG)
-               ata_queue_reset(chq);
 }
 
 /*
@@ -1651,7 +1645,6 @@
                                /* No need to schedule another reset */
                                return;
                        }
-                       chp->ch_reset_flags = flags & AT_RST_EMERG;
                        break;
                case ATACH_TH_DRIVE_RESET:
                        KASSERT(drive <= chp->ch_ndrives);
@@ -1662,7 +1655,6 @@
                                return;
                        }
                        drvp->drive_flags |= ATA_DRIVE_TH_RESET;
-                       drvp->drive_reset_flags = flags;
                        break;
                default:
                        panic("%s: unknown type: %x", __func__, type);
@@ -1726,11 +1718,6 @@
 
        /* Signal the thread in case there is an xfer to run */
        cv_signal(&chp->ch_thr_idle);
-
-       if (flags & AT_RST_EMERG) {
-               /* make sure that we can use polled commands */
-               ata_queue_reset(chp->ch_queue);
-       }
 }
 
 int
diff -r dda2b09ff6a2 -r 010c6116c1a0 sys/dev/ata/atavar.h
--- a/sys/dev/ata/atavar.h      Sat Oct 06 20:27:28 2018 +0000
+++ b/sys/dev/ata/atavar.h      Sat Oct 06 20:27:36 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: atavar.h,v 1.99.2.8 2018/10/03 19:20:48 jdolecek Exp $ */
+/*     $NetBSD: atavar.h,v 1.99.2.9 2018/10/06 20:27:36 jdolecek Exp $ */
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.
@@ -275,7 +275,6 @@
 #define ATA_DRIVE_NCQ          0x0200  /* drive supports NCQ feature set */
 #define ATA_DRIVE_NCQ_PRIO     0x0400  /* drive supports NCQ PRIO field */
 #define ATA_DRIVE_TH_RESET     0x0800  /* drive waits for thread drive reset */
-       int drive_reset_flags;  /* flags for drive reset via thread */
 
        uint8_t drive_type;
 #define        ATA_DRIVET_NONE         0
@@ -365,9 +364,6 @@
        int     (*ata_bio)(struct ata_drive_datas *, struct ata_xfer *);
        void    (*ata_reset_drive)(struct ata_drive_datas *, int, uint32_t *);
        void    (*ata_reset_channel)(struct ata_channel *, int);
-/* extra flags for ata_reset_*(), in addition to AT_* */
-#define AT_RST_EMERG 0x10000 /* emergency - e.g. for a dump */
-
        int     (*ata_exec_command)(struct ata_drive_datas *,
                                    struct ata_xfer *);
 
@@ -421,9 +417,6 @@
 
 #define ATACH_NODRIVE  0xff    /* no drive selected for reset */
 
-       /* for the reset callback */
-       int ch_reset_flags;
-
        /* for the timeout callout */
        struct callout c_timo_callout;  /* timeout callout handle */
 
diff -r dda2b09ff6a2 -r 010c6116c1a0 sys/dev/ata/wd.c
--- a/sys/dev/ata/wd.c  Sat Oct 06 20:27:28 2018 +0000
+++ b/sys/dev/ata/wd.c  Sat Oct 06 20:27:36 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wd.c,v 1.441.2.10 2018/10/06 19:25:43 jdolecek Exp $ */
+/*     $NetBSD: wd.c,v 1.441.2.11 2018/10/06 20:27:36 jdolecek Exp $ */
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.441.2.10 2018/10/06 19:25:43 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.441.2.11 2018/10/06 20:27:36 jdolecek Exp $");
 
 #include "opt_ata.h"
 #include "opt_wd.h"
@@ -1494,10 +1494,14 @@
                wddumprecalibrated = 1;
                ata_channel_lock(wd->drvp->chnl_softc);
                /* This will directly execute the reset due to AT_POLL */
-               ata_thread_run(wd->drvp->chnl_softc, AT_POLL | AT_RST_EMERG,
+               ata_thread_run(wd->drvp->chnl_softc, AT_POLL,
                    ATACH_TH_DRIVE_RESET, wd->drvp->drive);
+
+               /* make sure that we can use polled commands */
+               ata_queue_reset(wd->drvp->chnl_softc->ch_queue);
+
+               wd->drvp->state = RESET;
                ata_channel_unlock(wd->drvp->chnl_softc);
-               wd->drvp->state = RESET;
        }
 
        memset(xfer, 0, sizeof(*xfer));



Home | Main Index | Thread Index | Old Index