On Oct 12, 2012, at 2:40 AM, Ouyang, Qian wrote:
> Hi, Andrew > Yes, the current FlushBlockEx() implementation in AtaBustDriver doesn't > finish all tasks which have been transferred to it. It is a bug. > But it won't overwrite freed memory since AtaBusDriver maintain its own > subtask list. > The issues related to this bug could be > 1. Because the Token.evnt has been signaled, after task has been truly > finished, the Callback function in AtaBusDriver will fail to signal the token > again (since it might be freed) I think the caller would CloseEvent() prior to freeing the event. So I think the SignalEvent() would just fail if was signaled .This assumes the driver has its own copy of the event. > 2. Only part of data has been write/read to/from the I/O device when the > FlushBlockEx() has been called. > Yes my concern is caller allocates both Token and Buffer. The driver writes TransactionStatus into the Token, and data into the Buffer. The driver can not have it's own copies of these resources. > For the Token set to NULL, we need further discussion with SPEC owner. > The FlushBlockEx() is not recommended to use frequently in Non-Blocking mode > since it implements in blocking way and that will definitely impact the > performance. > I'm trying to figure out how the consumer of the BlockIo2 implements a Stop() function if async requests are queued. Thanks, Andrew > Thanks > Michalle > > -----Original Message----- > From: Andrew Fish [mailto:[email protected]] > Sent: Sunday, September 30, 2012 1:28 AM > To: [email protected] > Subject: [edk2] MdeModulePkg EFI_BLOCK_IO2_PROTOCOL.FlushBlocksEx questions? > > Dear MdeModulePkg maintainers, > > I see the Partition driver doing the following in its Stop() function: > > BlockIo2->FlushBlocksEx (BlockIo2, NULL); > > I don't see in the UEFI spec where Token being set to NULL is defined? What > does Token == NULL mean? > > In the AtaBusDriver FlushBlocksEx() seems to just signal the Token? So this > implies the caller can then free Token, and the Buffer used for the > transaction. It seems like Token and Buffer are queued by the AtaBusDriver, > so would not this cause AtaBusDriver to overwrite freed memory? Also If do a > large ReadBlocksEx(), do work, and then do a FlushBlocksEx(), it seems like > my event will be signaled that the read buffer is valid. It looks like the > caller gets signaled that the read is complete, when it may not be complete? > > EFI_STATUS > EFIAPI > AtaBlockIoFlushBlocksEx ( > IN EFI_BLOCK_IO2_PROTOCOL *This, > IN OUT EFI_BLOCK_IO2_TOKEN *Token > ) > { > // > // Signal event and return directly. > // > if (Token != NULL && Token->Event != NULL) { > Token->TransactionStatus = EFI_SUCCESS; > gBS->SignalEvent (Token->Event); > } > return EFI_SUCCESS; > } > > Andrew Fish > > PS I'm doing some research for USWG on surprise hot removal and I'm trying to > figure out what the Stop() function of the consumer of BlockIo2 should do if > Async I/O is in flight. It seems like the two options are to call > FlushBlocksEx() on all pending transactions, or fail the Stop() until > transactions complete. > > > > > > ------------------------------------------------------------------------------ > How fast is your code? > 3 out of 4 devs don\\\'t know how their code performs in production. > Find out how slow your code is with AppDynamics Lite. > http://ad.doubleclick.net/clk;262219672;13503038;z? > http://info.appdynamics.com/FreeJavaPerformanceDownload.html > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/edk2-devel > > ------------------------------------------------------------------------------ > Don't let slow site performance ruin your business. Deploy New Relic APM > Deploy New Relic app performance management and know exactly > what is happening inside your Ruby, Python, PHP, Java, and .NET app > Try New Relic at no cost today and get our sweet Data Nerd shirt too! > http://p.sf.net/sfu/newrelic-dev2dev > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Don't let slow site performance ruin your business. Deploy New Relic APM Deploy New Relic app performance management and know exactly what is happening inside your Ruby, Python, PHP, Java, and .NET app Try New Relic at no cost today and get our sweet Data Nerd shirt too! http://p.sf.net/sfu/newrelic-dev2dev _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
