Commit 68e125c4 authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

ACPICA: Optimize buffer allocation procedure



Eliminate duplicate code.

Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent cf058bd1
Loading
Loading
Loading
Loading
+28 −25
Original line number Diff line number Diff line
@@ -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;
		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