]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
ACPICA: Optimize buffer allocation procedure
authorBob Moore <robert.moore@intel.com>
Sat, 27 Sep 2008 03:34:48 +0000 (11:34 +0800)
committerLen Brown <len.brown@intel.com>
Thu, 23 Oct 2008 03:14:48 +0000 (23:14 -0400)
Eliminate duplicate code.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/utilities/utalloc.c

index 7dcb67e0b215d1d56de71cff60edf3f4e56b2b9b..241c535c1753bb7f844a14805a8aaea88960e586 100644 (file)
@@ -232,7 +232,7 @@ acpi_status acpi_ut_validate_buffer(struct acpi_buffer * buffer)
  * RETURN:      Status
  *
  * DESCRIPTION: Validate that the buffer is of the required length or
- *              allocate a new buffer.  Returned buffer is always zeroed.
+ *              allocate a new buffer. Returned buffer is always zeroed.
  *
  ******************************************************************************/
 
@@ -240,7 +240,7 @@ acpi_status
 acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
                          acpi_size required_length)
 {
-       acpi_status status = AE_OK;
+       acpi_size input_buffer_length;
 
        /* Parameter validation */
 
@@ -248,55 +248,58 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
                return (AE_BAD_PARAMETER);
        }
 
-       switch (buffer->length) {
+       /*
+        * Buffer->Length is used as both an input and output parameter. Get the
+        * input actual length and set the output required buffer length.
+        */
+       input_buffer_length = buffer->length;
+       buffer->length = required_length;
+
+       /*
+        * The input buffer length contains the actual buffer length, or the type
+        * of buffer to be allocated by this routine.
+        */
+       switch (input_buffer_length) {
        case ACPI_NO_BUFFER:
 
-               /* Set the exception and returned the required length */
+               /* Return the exception (and the required buffer length) */
 
-               status = AE_BUFFER_OVERFLOW;
-               break;
+               return (AE_BUFFER_OVERFLOW);
 
        case ACPI_ALLOCATE_BUFFER:
 
                /* Allocate a new buffer */
 
                buffer->pointer = acpi_os_allocate(required_length);
-               if (!buffer->pointer) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Clear the buffer */
-
-               ACPI_MEMSET(buffer->pointer, 0, required_length);
                break;
 
        case ACPI_ALLOCATE_LOCAL_BUFFER:
 
                /* Allocate a new buffer with local interface to allow tracking */
 
-               buffer->pointer = ACPI_ALLOCATE_ZEROED(required_length);
-               if (!buffer->pointer) {
-                       return (AE_NO_MEMORY);
-               }
+               buffer->pointer = ACPI_ALLOCATE(required_length);
                break;
 
        default:
 
                /* Existing buffer: Validate the size of the buffer */
 
-               if (buffer->length < required_length) {
-                       status = AE_BUFFER_OVERFLOW;
-                       break;
+               if (input_buffer_length < required_length) {
+                       return (AE_BUFFER_OVERFLOW);
                }
+               break;
+       }
 
-               /* Clear the buffer */
+       /* Validate allocation from above or input buffer pointer */
 
-               ACPI_MEMSET(buffer->pointer, 0, required_length);
-               break;
+       if (!buffer->pointer) {
+               return (AE_NO_MEMORY);
        }
 
-       buffer->length = required_length;
-       return (status);
+       /* Have a valid buffer, clear it */
+
+       ACPI_MEMSET(buffer->pointer, 0, required_length);
+       return (AE_OK);
 }
 
 #ifdef NOT_USED_BY_LINUX