lkml.org 
[lkml]   [2012]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 1/4] acpi,memory-hotplug : add memory offline code to acpi_memory_device_remove()
    From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>

    The memory device can be removed by 2 ways:
    1. send eject request by SCI
    2. echo 1 >/sys/bus/pci/devices/PNP0C80:XX/eject

    In the 1st case, acpi_memory_disable_device() will be called.
    In the 2nd case, acpi_memory_device_remove() will be called.
    acpi_memory_device_remove() will also be called when we unbind the
    memory device from the driver acpi_memhotplug.

    acpi_memory_disable_device() has already implemented a code which
    offlines memory and releases acpi_memory_info struct . But
    acpi_memory_device_remove() has not implemented it yet.

    So the patch implements acpi_memory_remove_memory() for offlining
    memory and releasing acpi_memory_info struct. And it is used by both
    acpi_memory_device_remove() and acpi_memory_disable_device().

    Additionally, if the type is ACPI_BUS_REMOVAL_EJECT in
    acpi_memory_device_remove() , it means that the user wants to eject
    the memory device. In this case, acpi_memory_device_remove() calls
    acpi_memory_remove_memory().

    CC: David Rientjes <rientjes@google.com>
    CC: Jiang Liu <liuj97@gmail.com>
    CC: Len Brown <len.brown@intel.com>
    CC: Christoph Lameter <cl@linux.com>
    Cc: Minchan Kim <minchan.kim@gmail.com>
    CC: Andrew Morton <akpm@linux-foundation.org>
    CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
    Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
    ---
    drivers/acpi/acpi_memhotplug.c | 44 +++++++++++++++++++++++++++++++----------
    1 file changed, 34 insertions(+), 10 deletions(-)

    Index: linux-3.6/drivers/acpi/acpi_memhotplug.c
    ===================================================================
    --- linux-3.6.orig/drivers/acpi/acpi_memhotplug.c 2012-10-03 18:55:33.386378909 +0900
    +++ linux-3.6/drivers/acpi/acpi_memhotplug.c 2012-10-03 18:55:58.624380688 +0900
    @@ -306,24 +306,37 @@ static int acpi_memory_powerdown_device(
    return 0;
    }

    -static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
    +static int acpi_memory_remove_memory(struct acpi_memory_device *mem_device)
    {
    int result;
    struct acpi_memory_info *info, *n;

    + list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
    + if (!info->enabled)
    + return -EBUSY;
    +
    + result = remove_memory(info->start_addr, info->length);
    + if (result)
    + return result;
    +
    + list_del(&info->list);
    + kfree(info);
    + }
    +
    + return 0;
    +}
    +
    +static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
    +{
    + int result;

    /*
    * Ask the VM to offline this memory range.
    * Note: Assume that this function returns zero on success
    */
    - list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
    - if (info->enabled) {
    - result = remove_memory(info->start_addr, info->length);
    - if (result)
    - return result;
    - }
    - kfree(info);
    - }
    + result = acpi_memory_remove_memory(mem_device);
    + if (result)
    + return result;

    /* Power-off and eject the device */
    result = acpi_memory_powerdown_device(mem_device);
    @@ -473,12 +486,23 @@ static int acpi_memory_device_add(struct
    static int acpi_memory_device_remove(struct acpi_device *device, int type)
    {
    struct acpi_memory_device *mem_device = NULL;
    -
    + int result;

    if (!device || !acpi_driver_data(device))
    return -EINVAL;

    mem_device = acpi_driver_data(device);
    +
    + if (type == ACPI_BUS_REMOVAL_EJECT) {
    + /*
    + * offline and remove memory only when the memory device is
    + * ejected.
    + */
    + result = acpi_memory_remove_memory(mem_device);
    + if (result)
    + return result;
    + }
    +
    kfree(mem_device);

    return 0;


    \
     
     \ /
      Last update: 2012-10-03 12:41    [W:3.959 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site