From: "Ni, Ray" <ray.ni@intel.com>
To: Michael Brown <mcb30@ipxe.org>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Gerd Hoffmann <kraxel@redhat.com>, Laszlo Ersek <lersek@redhat.com>
Subject: Re: [edk2-devel] [PATCH v3 4/5] MdeModulePkg: Add self-tests for NestedInterruptTplLib
Date: Wed, 24 Jan 2024 10:26:11 +0000 [thread overview]
Message-ID: <MN6PR11MB82443018A7AC9D3AD3C7E9C88C7B2@MN6PR11MB8244.namprd11.prod.outlook.com> (raw)
In-Reply-To: <MN6PR11MB824420E4F455753A5609DBE58C7B2@MN6PR11MB8244.namprd11.prod.outlook.com>
Thank you for adding the self-test code!
Thanks,
Ray
> -----Original Message-----
> From: Ni, Ray
> Sent: Wednesday, January 24, 2024 6:25 PM
> To: Michael Brown <mcb30@ipxe.org>; devel@edk2.groups.io
> Cc: Gerd Hoffmann <kraxel@redhat.com>; Laszlo Ersek <lersek@redhat.com>
> Subject: RE: [PATCH v3 4/5] MdeModulePkg: Add self-tests for
> NestedInterruptTplLib
>
> > +//
> > +// Number of self-tests to perform.
> > +//
> > +#define NUMBER_OF_SELF_TESTS \
> > + (FixedPcdGet32 (PcdNestedInterruptNumberOfSelfTests))
>
> 1. can we avoid defining a PCD? I do not see a need that each platform needs
> to use a different count. How about just define it as 1?
>
> > +
> > +STATIC
> > +VOID
> > +NestedInterruptSelfTest (
> > + IN NESTED_INTERRUPT_STATE *IsrState
> > + );
> > +
> > /**
> > Raise the task priority level to TPL_HIGH_LEVEL.
> >
> > @@ -211,6 +223,16 @@ NestedInterruptRestoreTPL (
> > //
> > DisableInterrupts ();
> >
> > + ///
> > + /// Perform a limited number of self-tests on the first few
> > + /// invocations.
>
> 2. the comment could mention that the self-test only is performed when
> no nested interrupt happens in gBS->RestoreTpl() call in above.
>
> > + ///
> > + if ((IsrState->DeferredRestoreTPL == FALSE) &&
> > + (IsrState->SelfTestCount < NUMBER_OF_SELF_TESTS)) {
>
> 3. might have coding style issue.
>
> > + //
> > + // The test has failed and we will halt the system. Disable
> > + // interrupts now so that any test-induced interrupt storm does not
> > + // prevent the fatal error messages from being displayed correctly.
> > + //
>
> 4. The comment might be wrong. It does not indicate the test has failed.
> It's possible that the timer period is very long that causes no timer interrupt
> happens till now.
> In that case, IsrState->DeferredRestoreTPL is FALSE. That's not an issue IMO.
>
> Or, how about we stall for ever to wait for the timer interrupt instead of
> waiting just 1 second.
> We could wait for the IsrState->DeferredRestoreTPL is TRUE.
>
> > + DisableInterrupts();
> > +
> > + //
> > + // If we observe that DeferredRestoreTPL is TRUE then this indicates
> > + // that an interrupt did occur and NestedInterruptRestoreTPL() chose
> > + // to defer the RestoreTPL() call to the outer handler, but that
> > + // DisableInterruptsOnIret() failed to cause interrupts to be
> > + // disabled after the IRET or equivalent instruction.
>
> 5. The comment "failed to cause interrupts to be disabled after IRET" can be
> inside the if-condition.
>
> > + //
> > + // This error represents a bug in the architecture-specific
> > + // implementation of DisableInterruptsOnIret().
> > + //
> > + if (IsrState->DeferredRestoreTPL == TRUE) {
> > + DEBUG ((
> > + DEBUG_ERROR,
> > + "Nested interrupt self-test %u/%u failed: interrupts still
> enabled\n",
> > + SelfTestCount,
> > + NUMBER_OF_SELF_TESTS
> > + ));
> > + ASSERT (FALSE);
> > + }
> > +
>
>
> > + //
> > + // If no timer interrupt occurred then this indicates that the timer
> > + // interrupt handler failed to rearm the timer before calling
> > + // NestedInterruptRestoreTPL(). This would prevent nested
> > + // interrupts from occurring at all, which would break
> > + // e.g. callbacks at TPL_CALLBACK that themselves wait on further
> > + // timer events.
> > + //
> > + // This error represents a bug in the platform-specific timer
> > + // interrupt handler.
> > + //
> > + DEBUG ((
> > + DEBUG_ERROR,
> > + "Nested interrupt self-test %u/%u failed: no nested interrupt\n",
> > + SelfTestCount,
> > + NUMBER_OF_SELF_TESTS
> > + ));
> > + ASSERT (FALSE);
>
> 6. If we change the above code to wait forever until the DeferredRestoreTPL
> is TRUE,
> the above debug message and ASSERT() can be removed. Agree?
>
> > +}
> > --
> > 2.43.0
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114273): https://edk2.groups.io/g/devel/message/114273
Mute This Topic: https://groups.io/mt/103911608/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/12367111/7686176/1913456212/xyzzy [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-01-24 10:26 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <17ACFF3FDD20CD9A.13754@groups.io>
2024-01-23 15:31 ` [edk2-devel] [PATCH v3 0/5] MdeModulePkg: Move NestedInterruptTplLib to MdeModulePkg Michael Brown
2024-01-25 12:17 ` Ni, Ray
[not found] ` <20240123153104.2451759-1-mcb30@ipxe.org>
2024-01-23 15:31 ` [edk2-devel] [PATCH v3 1/5] " Michael Brown
2024-01-23 15:31 ` [edk2-devel] [PATCH v3 2/5] MdeModulePkg: Add missing Iret.h to NestedInterruptTplLib sources list Michael Brown
2024-01-23 15:31 ` [edk2-devel] [PATCH v3 3/5] MdeModulePkg: Do nothing on NestedInterruptRestoreTPL(TPL_HIGH_LEVEL) Michael Brown
2024-01-23 16:32 ` Laszlo Ersek
2024-01-23 16:59 ` Michael Brown
2024-01-24 12:52 ` Laszlo Ersek
2024-01-23 15:31 ` [edk2-devel] [PATCH v3 4/5] MdeModulePkg: Add self-tests for NestedInterruptTplLib Michael Brown
2024-01-23 16:55 ` Laszlo Ersek
2024-01-23 17:41 ` Michael Brown
2024-01-24 12:58 ` Laszlo Ersek
2024-01-24 10:24 ` Ni, Ray
2024-01-24 10:26 ` Ni, Ray [this message]
2024-01-23 15:31 ` [edk2-devel] [PATCH v3 5/5] MdeModulePkg: Extend NestedInterruptTplLib to support Arm CPUs Michael Brown
2024-01-23 15:51 ` Ard Biesheuvel
2024-01-23 16:48 ` Michael Brown
2024-01-23 17:10 ` Laszlo Ersek
2024-01-23 17:21 ` Michael Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MN6PR11MB82443018A7AC9D3AD3C7E9C88C7B2@MN6PR11MB8244.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox