Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=654ede200fe028373852bbca387ab4834ddb7228
Commit:     654ede200fe028373852bbca387ab4834ddb7228
Parent:     b113a3f7e85d7f97c8383a88a5bc7c2ea8daeb2f
Author:     Jason Uhlenkott <[EMAIL PROTECTED]>
AuthorDate: Thu Jul 19 01:50:16 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Thu Jul 19 10:04:55 2007 -0700

    drivers/edac: mod race fix i82875p
    
    If ERRSTS indicates that there's no error then we don't need to bother 
reading
    the other registers.
    
    In addition to making the common case faster, this actually fixes a small 
race
    where we don't see an error but we clear the error bits anyway, potentially
    wiping away info on an error that happened in the interim (or where a CE
    arrives between the first and second read of ERRSTS, causing us to falsely
    claim "UE overwrote CE").
    
    Signed-off-by: Jason Uhlenkott <[EMAIL PROTECTED]>
    Signed-off-by: Douglas Thompson <[EMAIL PROTECTED]>
    Cc: Alan Cox <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/edac/i82875p_edac.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c
index c9aed70..089ec39 100644
--- a/drivers/edac/i82875p_edac.c
+++ b/drivers/edac/i82875p_edac.c
@@ -198,27 +198,28 @@ static void i82875p_get_error_info(struct mem_ctl_info 
*mci,
         * overwritten by UE.
         */
        pci_read_config_word(pdev, I82875P_ERRSTS, &info->errsts);
+
+       if (!(info->errsts & 0x0081))
+               return;
+
        pci_read_config_dword(pdev, I82875P_EAP, &info->eap);
        pci_read_config_byte(pdev, I82875P_DES, &info->des);
        pci_read_config_byte(pdev, I82875P_DERRSYN, &info->derrsyn);
        pci_read_config_word(pdev, I82875P_ERRSTS, &info->errsts2);
 
-       pci_write_bits16(pdev, I82875P_ERRSTS, 0x0081, 0x0081);
-
        /*
         * If the error is the same then we can for both reads then
         * the first set of reads is valid.  If there is a change then
         * there is a CE no info and the second set of reads is valid
         * and should be UE info.
         */
-       if (!(info->errsts2 & 0x0081))
-               return;
-
        if ((info->errsts ^ info->errsts2) & 0x0081) {
                pci_read_config_dword(pdev, I82875P_EAP, &info->eap);
                pci_read_config_byte(pdev, I82875P_DES, &info->des);
                pci_read_config_byte(pdev, I82875P_DERRSYN, &info->derrsyn);
        }
+
+       pci_write_bits16(pdev, I82875P_ERRSTS, 0x0081, 0x0081);
 }
 
 static int i82875p_process_error_info(struct mem_ctl_info *mci,
@@ -229,7 +230,7 @@ static int i82875p_process_error_info(struct mem_ctl_info 
*mci,
 
        multi_chan = mci->csrows[0].nr_channels - 1;
 
-       if (!(info->errsts2 & 0x0081))
+       if (!(info->errsts & 0x0081))
                return 0;
 
        if (!handle_errors)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to