Skip to content

Commit

Permalink
xen/acpi: xen memory hotplug minor updates
Browse files Browse the repository at this point in the history
Dan Carpenter found current xen memory hotplug logic
has potential issue: at func acpi_memory_get_device()
*mem_device = acpi_driver_data(device);
while the device may be NULL and then dereference.

At native side, Rafael recently updated acpi_memory_get_device(),
dropping acpi_bus_add, adding lock, and avoiding above issue.

This patch updates xen memory hotplug logic accordingly, removing
redundant logic, adding lock, and avoiding dereference.

Signed-off-by: Liu Jinsong <jinsong.liu@intel.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  • Loading branch information
Liu Jinsong authored and Konrad Rzeszutek Wilk committed Feb 25, 2013
1 parent 77be36d commit 484400f
Showing 1 changed file with 26 additions and 26 deletions.
52 changes: 26 additions & 26 deletions drivers/xen/xen-acpi-memhotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,50 +158,46 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
return 0;
}

static int
acpi_memory_get_device(acpi_handle handle,
struct acpi_memory_device **mem_device)
static int acpi_memory_get_device(acpi_handle handle,
struct acpi_memory_device **mem_device)
{
acpi_status status;
acpi_handle phandle;
struct acpi_device *device = NULL;
struct acpi_device *pdevice = NULL;
int result;
int result = 0;

if (!acpi_bus_get_device(handle, &device) && device)
goto end;
acpi_scan_lock_acquire();

status = acpi_get_parent(handle, &phandle);
if (ACPI_FAILURE(status)) {
pr_warn(PREFIX "Cannot find acpi parent\n");
return -EINVAL;
}

/* Get the parent device */
result = acpi_bus_get_device(phandle, &pdevice);
if (result) {
pr_warn(PREFIX "Cannot get acpi bus device\n");
return -EINVAL;
}
acpi_bus_get_device(handle, &device);
if (device)
goto end;

/*
* Now add the notified device. This creates the acpi_device
* and invokes .add function
*/
result = acpi_bus_scan(handle);
if (result) {
pr_warn(PREFIX "Cannot add acpi bus\n");
return -EINVAL;
pr_warn(PREFIX "ACPI namespace scan failed\n");
result = -EINVAL;
goto out;
}
result = acpi_bus_get_device(handle, &device);
if (result) {
pr_warn(PREFIX "Missing device object\n");
result = -EINVAL;
goto out;
}

end:
*mem_device = acpi_driver_data(device);
if (!(*mem_device)) {
pr_err(PREFIX "Driver data not found\n");
return -ENODEV;
pr_err(PREFIX "driver data not found\n");
result = -ENODEV;
goto out;
}

return 0;
out:
acpi_scan_lock_release();
return result;
}

static int acpi_memory_check_device(struct acpi_memory_device *mem_device)
Expand Down Expand Up @@ -259,12 +255,15 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"\nReceived EJECT REQUEST notification for device\n"));

acpi_scan_lock_acquire();
if (acpi_bus_get_device(handle, &device)) {
acpi_scan_lock_release();
pr_err(PREFIX "Device doesn't exist\n");
break;
}
mem_device = acpi_driver_data(device);
if (!mem_device) {
acpi_scan_lock_release();
pr_err(PREFIX "Driver Data is NULL\n");
break;
}
Expand All @@ -274,6 +273,7 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
* acpi_bus_remove if Xen support hotremove in the future
*/
acpi_memory_disable_device(mem_device);
acpi_scan_lock_release();
break;

default:
Expand Down

0 comments on commit 484400f

Please sign in to comment.