Patchwork [rtc,hack] : reduce number of reinjects on ACK

login
register
mail settings
Submitter Gleb Natapov
Date Jan. 20, 2010, 1:37 p.m.
Message ID <20100120133733.GI5238@redhat.com>
Download mbox | patch
Permalink /patch/43281/
State New
Headers show

Comments

Gleb Natapov - Jan. 20, 2010, 1:37 p.m.
Windows 7 BSODs under load with HAL_RTC_IRQF_WILL_NOT_CLEAR error.

It happens here:
hal!HalpRtcUnmaskClock:
8281b93a 8bff            mov     edi,edi
8281b93c 56              push    esi
8281b93d 33f6            xor     esi,esi
8281b93f 6a0c            push    0Ch
8281b941 e8b2ffffff      call    hal!CMOS_READ (8281b8f8)
8281b946 84c0            test    al,al
8281b948 7920            jns     hal!HalpRtcUnmaskClock+0x30 (8281b96a)
8281b94a 6a0a            push    0Ah
8281b94c 46              inc     esi
8281b94d e854c8ffff      call    hal!KeStallExecutionProcessor (828181a6)
8281b952 83fe64          cmp     esi,64h
8281b955 72e8            jb      hal!HalpRtcUnmaskClock+0x5 (8281b93f)
8281b957 6a00            push    0
8281b959 6a00            push    0
8281b95b 6a00            push    0
8281b95d 680a010000      push    10Ah
8281b962 6a5c            push    5Ch
8281b964 ff1500c38082    call    dword ptr [hal!_imp__KeBugCheckEx (8280c300)]
8281b96a 5e              pop     esi
8281b96b c3              ret

So it loops for 100(64h) times reading register C before BSOD. Lets
reduce number of immediate reinjection well under this limit.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
--
			Gleb.
Anthony Liguori - Jan. 20, 2010, 2:56 p.m.
On 01/20/2010 07:37 AM, Gleb Natapov wrote:
> Windows 7 BSODs under load with HAL_RTC_IRQF_WILL_NOT_CLEAR error.
>
> It happens here:
> hal!HalpRtcUnmaskClock:
> 8281b93a 8bff            mov     edi,edi
> 8281b93c 56              push    esi
> 8281b93d 33f6            xor     esi,esi
> 8281b93f 6a0c            push    0Ch
> 8281b941 e8b2ffffff      call    hal!CMOS_READ (8281b8f8)
> 8281b946 84c0            test    al,al
> 8281b948 7920            jns     hal!HalpRtcUnmaskClock+0x30 (8281b96a)
> 8281b94a 6a0a            push    0Ah
> 8281b94c 46              inc     esi
> 8281b94d e854c8ffff      call    hal!KeStallExecutionProcessor (828181a6)
> 8281b952 83fe64          cmp     esi,64h
> 8281b955 72e8            jb      hal!HalpRtcUnmaskClock+0x5 (8281b93f)
> 8281b957 6a00            push    0
> 8281b959 6a00            push    0
> 8281b95b 6a00            push    0
> 8281b95d 680a010000      push    10Ah
> 8281b962 6a5c            push    5Ch
> 8281b964 ff1500c38082    call    dword ptr [hal!_imp__KeBugCheckEx (8280c300)]
> 8281b96a 5e              pop     esi
> 8281b96b c3              ret
>
> So it loops for 100(64h) times reading register C before BSOD. Lets
> reduce number of immediate reinjection well under this limit.
>
> Signed-off-by: Gleb Natapov<gleb@redhat.com>
>    

Applied.  Thanks.

Regards,

Anthony Liguori
> diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
> index e4d55c7..2616d0d 100644
> --- a/hw/mc146818rtc.c
> +++ b/hw/mc146818rtc.c
> @@ -30,7 +30,7 @@
>
>   //#define DEBUG_CMOS
>
> -#define RTC_REINJECT_ON_ACK_COUNT 1000
> +#define RTC_REINJECT_ON_ACK_COUNT 20
>
>   #define RTC_SECONDS             0
>   #define RTC_SECONDS_ALARM       1
> --
> 			Gleb.
>
>
>
>

Patch

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index e4d55c7..2616d0d 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -30,7 +30,7 @@ 
 
 //#define DEBUG_CMOS
 
-#define RTC_REINJECT_ON_ACK_COUNT 1000
+#define RTC_REINJECT_ON_ACK_COUNT 20
 
 #define RTC_SECONDS             0
 #define RTC_SECONDS_ALARM       1