It's not actual hang but always running at while-poll function in the TPL call 
back level , meanwhile, the while condition depends on another time event that 
running on the same TPL. If so, the time event might have no chance to be 
triggered. So, the code will never run out of while () {}:

  while (Token->Status == EFI_NOT_READY) {
    This->Poll (This);
  }


Thanks,
Jiaxin

> -----Original Message-----
> From: Fu, Siyuan
> Sent: Thursday, March 1, 2018 7:03 PM
> To: Wu, Jiaxin <jiaxin...@intel.com>; edk2-devel@lists.01.org
> Cc: Wang, Fan <fan.w...@intel.com>; Ye, Ting <ting...@intel.com>
> Subject: RE: [Patch] MdeModulePkg/Mtftp4Dxe: Restore the TPL before the
> poll function.
> 
> Hi, Jiaxin
> 
> Do you mean the code which calls MTFTP4->Poll() at TPL_CALLBACK will
> cause system hang? This should not happen because all network protocol
> should be able to run at TPL_CALLBACK.
> 
> BestRegards
> Fu Siyuan
> 
> 
> > -----Original Message-----
> > From: Wu, Jiaxin
> > Sent: Thursday, March 1, 2018 5:38 PM
> > To: edk2-devel@lists.01.org
> > Cc: Wang, Fan <fan.w...@intel.com>; Fu, Siyuan <siyuan...@intel.com>;
> Ye,
> > Ting <ting...@intel.com>
> > Subject: [Patch] MdeModulePkg/Mtftp4Dxe: Restore the TPL before the
> poll
> > function.
> >
> > This patch is to fix the hang issue, which was enrolled by the commit of
> > 39b0867d.
> > The TPL should be restored before calling poll function at TPL_CALLBACK.
> >
> > Cc: Wang Fan <fan.w...@intel.com>
> > Cc: Fu Siyuan <siyuan...@intel.com>
> > Cc: Ye Ting <ting...@intel.com>
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Jiaxin Wu <jiaxin...@intel.com>
> > ---
> >  MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c | 9
> ++++++---
> >  1 file changed, 6 insertions(+), 3 deletions(-)
> >
> > diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c
> > b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c
> > index f5f9e6d8f7..64e0463dd9 100644
> > --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c
> > +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.c
> > @@ -507,24 +507,27 @@ Mtftp4Start (
> >    if (EFI_ERROR (Status)) {
> >      Status = EFI_DEVICE_ERROR;
> >      goto ON_ERROR;
> >    }
> >
> > +  //
> > +  // Restore the TPL now, don't call poll function at TPL_CALLBACK.
> > +  //
> > +  gBS->RestoreTPL (OldTpl);
> > +
> >    if (Token->Event != NULL) {
> > -    gBS->RestoreTPL (OldTpl);
> >      return EFI_SUCCESS;
> >    }
> >
> >    //
> >    // Return immediately for asynchronous operation or poll the
> >    // instance for synchronous operation.
> >    //
> >    while (Token->Status == EFI_NOT_READY) {
> >      This->Poll (This);
> >    }
> > -
> > -  gBS->RestoreTPL (OldTpl);
> > +
> >    return Token->Status;
> >
> >  ON_ERROR:
> >    Mtftp4CleanOperation (Instance, Status);
> >    gBS->RestoreTPL (OldTpl);
> > --
> > 2.16.2.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to