NetworkPkg: Update cache management in HTTP boot driver.

The original HTTP boot driver always save the received message body in its cache,
it bring a large of memory allocation during HTTP download. This patch updates
the HTTP boot driver to only cache data when caller doesn't provide a buffer for
download (which is usually used when caller want to get the required buffer size).

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18448 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Fu Siyuan 2015-09-14 09:05:12 +00:00 committed by sfu5
parent b578030972
commit 7fd71047a6
1 changed files with 35 additions and 28 deletions

View File

@ -458,22 +458,6 @@ HttpBootGetBootFileCallback (
} }
CallbackData = (HTTP_BOOT_CALLBACK_DATA *) Context; CallbackData = (HTTP_BOOT_CALLBACK_DATA *) Context;
//
// Save the data into cache list.
//
NewEntityData = AllocatePool (sizeof (HTTP_BOOT_ENTITY_DATA));
if (NewEntityData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
if (CallbackData->NewBlock) {
NewEntityData->Block = CallbackData->Block;
CallbackData->Block = NULL;
}
NewEntityData->DataLength = Length;
NewEntityData->DataStart = (UINT8*) Data;
InsertTailList (&CallbackData->Cache->EntityDataList, &NewEntityData->Link);
// //
// Copy data if caller has provided a buffer. // Copy data if caller has provided a buffer.
// //
@ -486,6 +470,22 @@ HttpBootGetBootFileCallback (
CallbackData->CopyedSize += MIN (Length, CallbackData->BufferSize - CallbackData->CopyedSize); CallbackData->CopyedSize += MIN (Length, CallbackData->BufferSize - CallbackData->CopyedSize);
} }
//
// The caller doesn't provide a buffer, save the block into cache list.
//
if (CallbackData->Cache != NULL) {
NewEntityData = AllocatePool (sizeof (HTTP_BOOT_ENTITY_DATA));
if (NewEntityData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
if (CallbackData->NewBlock) {
NewEntityData->Block = CallbackData->Block;
CallbackData->Block = NULL;
}
NewEntityData->DataLength = Length;
NewEntityData->DataStart = (UINT8*) Data;
InsertTailList (&CallbackData->Cache->EntityDataList, &NewEntityData->Link);
}
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -566,10 +566,10 @@ HttpBootGetBootFile (
// //
// //
// 1. Create a temp cache item for the requested URI. // 1. Create a temp cache item for the requested URI if caller doesn't provide buffer.
// //
Cache = NULL; Cache = NULL;
if (!HeaderOnly) { if ((!HeaderOnly) && (*BufferSize == 0)) {
Cache = AllocateZeroPool (sizeof (HTTP_BOOT_CACHE_CONTENT)); Cache = AllocateZeroPool (sizeof (HTTP_BOOT_CACHE_CONTENT));
if (Cache == NULL) { if (Cache == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
@ -659,7 +659,7 @@ HttpBootGetBootFile (
// //
// 2.3 Record the request info in a temp cache item. // 2.3 Record the request info in a temp cache item.
// //
if (!HeaderOnly) { if (Cache != NULL) {
Cache->RequestData = RequestData; Cache->RequestData = RequestData;
} }
@ -703,7 +703,7 @@ HttpBootGetBootFile (
// //
// 3.2 Cache the response header. // 3.2 Cache the response header.
// //
if (!HeaderOnly) { if (Cache != NULL) {
Cache->ResponseData = ResponseData; Cache->ResponseData = ResponseData;
} }
@ -733,17 +733,26 @@ HttpBootGetBootFile (
// //
// 3.4 Continue to receive and parse message-body if needed. // 3.4 Continue to receive and parse message-body if needed.
// //
Block = NULL;
if (!HeaderOnly) { if (!HeaderOnly) {
ZeroMem (&ResponseBody, sizeof (HTTP_IO_RESOPNSE_DATA)); ZeroMem (&ResponseBody, sizeof (HTTP_IO_RESOPNSE_DATA));
while (!HttpIsMessageComplete (Parser)) { while (!HttpIsMessageComplete (Parser)) {
// //
// Allocate a new block to hold the message-body. // Allocate a block to hold the message-body, if caller doesn't provide
// a buffer, the block will be cached and we will allocate a new one here.
// //
Block = AllocatePool (HTTP_BOOT_BLOCK_SIZE); if (Block == NULL || Context.BufferSize == 0) {
if (Block == NULL) { Block = AllocatePool (HTTP_BOOT_BLOCK_SIZE);
Status = EFI_OUT_OF_RESOURCES; if (Block == NULL) {
goto ERROR_6; Status = EFI_OUT_OF_RESOURCES;
goto ERROR_6;
}
Context.NewBlock = TRUE;
Context.Block = Block;
} else {
Context.NewBlock = FALSE;
} }
ResponseBody.Body = (CHAR8*) Block; ResponseBody.Body = (CHAR8*) Block;
ResponseBody.BodyLength = HTTP_BOOT_BLOCK_SIZE; ResponseBody.BodyLength = HTTP_BOOT_BLOCK_SIZE;
Status = HttpIoRecvResponse ( Status = HttpIoRecvResponse (
@ -758,8 +767,6 @@ HttpBootGetBootFile (
// //
// Parse the new received block of the message-body, the block will be saved in cache. // Parse the new received block of the message-body, the block will be saved in cache.
// //
Context.NewBlock = TRUE;
Context.Block = Block;
Status = HttpParseMessageBody ( Status = HttpParseMessageBody (
Parser, Parser,
ResponseBody.BodyLength, ResponseBody.BodyLength,
@ -787,7 +794,7 @@ HttpBootGetBootFile (
// //
// 4. Save the cache item to driver's cache list and return. // 4. Save the cache item to driver's cache list and return.
// //
if (!HeaderOnly) { if (Cache != NULL) {
Cache->EntityLength = ContentLength; Cache->EntityLength = ContentLength;
InsertTailList (&Private->CacheList, &Cache->Link); InsertTailList (&Private->CacheList, &Cache->Link);
} }