* [PATCH 0/3] Series short description
@ 2007-05-29 12:42 Alexey Starikovskiy
2007-05-29 12:42 ` [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle Alexey Starikovskiy
` (2 more replies)
0 siblings, 3 replies; 21+ messages in thread
From: Alexey Starikovskiy @ 2007-05-29 12:42 UTC (permalink / raw)
To: len.brown, linux-acpi
In order to get notifications from Smart Batteries there is a need to
allow non-AML query handlers in EC driver.
AML query handlers are now found at init time, so there is no need to
look them up in namespace at query time.
--
Regards,
Alex.
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle. 2007-05-29 12:42 [PATCH 0/3] Series short description Alexey Starikovskiy @ 2007-05-29 12:42 ` Alexey Starikovskiy 2007-06-23 20:02 ` Len Brown 2007-05-29 12:42 ` [PATCH 2/3] ACPI EC: drop usage of ACPI_DEBUG_PRINT as too heavy weight Alexey Starikovskiy 2007-05-29 12:43 ` [PATCH 3/3] ACPI EC: Add support for non-AML EC query handlers Alexey Starikovskiy 2 siblings, 1 reply; 21+ messages in thread From: Alexey Starikovskiy @ 2007-05-29 12:42 UTC (permalink / raw) To: len.brown, linux-acpi; +Cc: Alexey Starikovskiy Signed-off-by: Alexey Starikovskiy <aystarik@gmail.com> --- drivers/acpi/ec.c | 56 ++++++++++++++++------------------------------------- 1 files changed, 17 insertions(+), 39 deletions(-) diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 82f496c..5534b23 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -454,57 +454,35 @@ acpi_ec_space_setup(acpi_handle region_handle, } static acpi_status -acpi_ec_space_handler(u32 function, - acpi_physical_address address, - u32 bit_width, - acpi_integer * value, +acpi_ec_space_handler(u32 function, acpi_physical_address address, + u32 bits, acpi_integer *value, void *handler_context, void *region_context) { - int result = 0; struct acpi_ec *ec = handler_context; - u64 temp = *value; - acpi_integer f_v = 0; - int i = 0; + int result = 0, i = 0; + u8 temp = 0; if ((address > 0xFF) || !value || !handler_context) return AE_BAD_PARAMETER; - if (bit_width != 8 && acpi_strict) { + if (function != ACPI_READ && function != ACPI_WRITE) return AE_BAD_PARAMETER; - } - - next_byte: - switch (function) { - case ACPI_READ: - temp = 0; - result = acpi_ec_read(ec, (u8) address, (u8 *) & temp); - break; - case ACPI_WRITE: - result = acpi_ec_write(ec, (u8) address, (u8) temp); - break; - default: - result = -EINVAL; - goto out; - break; - } - bit_width -= 8; - if (bit_width) { - if (function == ACPI_READ) - f_v |= temp << 8 * i; - if (function == ACPI_WRITE) - temp >>= 8; - i++; - address++; - goto next_byte; - } + if (bits != 8 && acpi_strict) + return AE_BAD_PARAMETER; - if (function == ACPI_READ) { - f_v |= temp << 8 * i; - *value = f_v; + while (bits - i > 0) { + if (function == ACPI_READ) { + result = acpi_ec_read(ec, address, &temp); + (*value) |= ((acpi_integer)temp) << i; + } else { + temp = 0xff & ((*value) >> i); + result = acpi_ec_write(ec, address, temp); + } + i += 8; + ++address; } - out: switch (result) { case -EINVAL: return AE_BAD_PARAMETER; ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle. 2007-05-29 12:42 ` [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle Alexey Starikovskiy @ 2007-06-23 20:02 ` Len Brown 0 siblings, 0 replies; 21+ messages in thread From: Len Brown @ 2007-06-23 20:02 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: linux-acpi Applied. thanks, -Len On Tuesday 29 May 2007 08:42, Alexey Starikovskiy wrote: > Signed-off-by: Alexey Starikovskiy <aystarik@gmail.com> > --- > > drivers/acpi/ec.c | 56 ++++++++++++++++------------------------------------- > 1 files changed, 17 insertions(+), 39 deletions(-) > > diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > index 82f496c..5534b23 100644 > --- a/drivers/acpi/ec.c > +++ b/drivers/acpi/ec.c > @@ -454,57 +454,35 @@ acpi_ec_space_setup(acpi_handle region_handle, > } > > static acpi_status > -acpi_ec_space_handler(u32 function, > - acpi_physical_address address, > - u32 bit_width, > - acpi_integer * value, > +acpi_ec_space_handler(u32 function, acpi_physical_address address, > + u32 bits, acpi_integer *value, > void *handler_context, void *region_context) > { > - int result = 0; > struct acpi_ec *ec = handler_context; > - u64 temp = *value; > - acpi_integer f_v = 0; > - int i = 0; > + int result = 0, i = 0; > + u8 temp = 0; > > if ((address > 0xFF) || !value || !handler_context) > return AE_BAD_PARAMETER; > > - if (bit_width != 8 && acpi_strict) { > + if (function != ACPI_READ && function != ACPI_WRITE) > return AE_BAD_PARAMETER; > - } > - > - next_byte: > - switch (function) { > - case ACPI_READ: > - temp = 0; > - result = acpi_ec_read(ec, (u8) address, (u8 *) & temp); > - break; > - case ACPI_WRITE: > - result = acpi_ec_write(ec, (u8) address, (u8) temp); > - break; > - default: > - result = -EINVAL; > - goto out; > - break; > - } > > - bit_width -= 8; > - if (bit_width) { > - if (function == ACPI_READ) > - f_v |= temp << 8 * i; > - if (function == ACPI_WRITE) > - temp >>= 8; > - i++; > - address++; > - goto next_byte; > - } > + if (bits != 8 && acpi_strict) > + return AE_BAD_PARAMETER; > > - if (function == ACPI_READ) { > - f_v |= temp << 8 * i; > - *value = f_v; > + while (bits - i > 0) { > + if (function == ACPI_READ) { > + result = acpi_ec_read(ec, address, &temp); > + (*value) |= ((acpi_integer)temp) << i; > + } else { > + temp = 0xff & ((*value) >> i); > + result = acpi_ec_write(ec, address, temp); > + } > + i += 8; > + ++address; > } > > - out: > switch (result) { > case -EINVAL: > return AE_BAD_PARAMETER; > > - > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 2/3] ACPI EC: drop usage of ACPI_DEBUG_PRINT as too heavy weight 2007-05-29 12:42 [PATCH 0/3] Series short description Alexey Starikovskiy 2007-05-29 12:42 ` [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle Alexey Starikovskiy @ 2007-05-29 12:42 ` Alexey Starikovskiy 2007-06-23 20:03 ` Len Brown 2007-05-29 12:43 ` [PATCH 3/3] ACPI EC: Add support for non-AML EC query handlers Alexey Starikovskiy 2 siblings, 1 reply; 21+ messages in thread From: Alexey Starikovskiy @ 2007-05-29 12:42 UTC (permalink / raw) To: len.brown, linux-acpi; +Cc: Alexey Starikovskiy Signed-off-by: Alexey Starikovskiy <aystarik@gmail.com> --- drivers/acpi/ec.c | 20 ++++++-------------- 1 files changed, 6 insertions(+), 14 deletions(-) diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 5534b23..ffb8361 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -39,20 +39,19 @@ #include <acpi/acpi_drivers.h> #include <acpi/actypes.h> -#define _COMPONENT ACPI_EC_COMPONENT -ACPI_MODULE_NAME("ec"); -#define ACPI_EC_COMPONENT 0x00100000 #define ACPI_EC_CLASS "embedded_controller" #define ACPI_EC_HID "PNP0C09" #define ACPI_EC_DEVICE_NAME "Embedded Controller" #define ACPI_EC_FILE_INFO "info" #undef PREFIX #define PREFIX "ACPI: EC: " + /* EC status register */ #define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */ #define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */ #define ACPI_EC_FLAG_BURST 0x10 /* burst mode */ #define ACPI_EC_FLAG_SCI 0x20 /* EC-SCI occurred */ + /* EC commands */ enum ec_command { ACPI_EC_COMMAND_READ = 0x80, @@ -245,7 +244,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0, 0); if (status) { - printk(KERN_DEBUG PREFIX + printk(KERN_ERR PREFIX "input buffer is not empty, aborting transaction\n"); goto end; } @@ -630,10 +629,6 @@ static int acpi_ec_add(struct acpi_device *device) acpi_ec_add_fs(device); - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s [%s] (gpe %d) interrupt mode.", - acpi_device_name(device), acpi_device_bid(device), - (u32) ec->gpe)); - return 0; } @@ -718,9 +713,6 @@ static int acpi_ec_start(struct acpi_device *device) if (!ec) return -EINVAL; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "gpe=0x%02lx, ports=0x%2lx,0x%2lx", - ec->gpe, ec->command_addr, ec->data_addr)); - /* Boot EC is already working */ if (ec == boot_ec) return 0; @@ -779,8 +771,8 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) ec->handle = handle; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "GPE=0x%02lx, ports=0x%2lx, 0x%2lx", - ec->gpe, ec->command_addr, ec->data_addr)); + printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx", + ec->gpe, ec->command_addr, ec->data_addr); return AE_CTRL_TERMINATE; } @@ -803,7 +795,7 @@ int __init acpi_ec_ecdt_probe(void) if (ACPI_FAILURE(status)) goto error; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found ECDT")); + printk(KERN_INFO PREFIX "EC description table is found, configuring boot EC\n"); boot_ec->command_addr = ecdt_ptr->control.address; boot_ec->data_addr = ecdt_ptr->data.address; ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 2/3] ACPI EC: drop usage of ACPI_DEBUG_PRINT as too heavy weight 2007-05-29 12:42 ` [PATCH 2/3] ACPI EC: drop usage of ACPI_DEBUG_PRINT as too heavy weight Alexey Starikovskiy @ 2007-06-23 20:03 ` Len Brown 0 siblings, 0 replies; 21+ messages in thread From: Len Brown @ 2007-06-23 20:03 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: linux-acpi Applied. thanks, -Len On Tuesday 29 May 2007 08:42, Alexey Starikovskiy wrote: > Signed-off-by: Alexey Starikovskiy <aystarik@gmail.com> > --- > > drivers/acpi/ec.c | 20 ++++++-------------- > 1 files changed, 6 insertions(+), 14 deletions(-) > > diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > index 5534b23..ffb8361 100644 > --- a/drivers/acpi/ec.c > +++ b/drivers/acpi/ec.c > @@ -39,20 +39,19 @@ > #include <acpi/acpi_drivers.h> > #include <acpi/actypes.h> > > -#define _COMPONENT ACPI_EC_COMPONENT > -ACPI_MODULE_NAME("ec"); > -#define ACPI_EC_COMPONENT 0x00100000 > #define ACPI_EC_CLASS "embedded_controller" > #define ACPI_EC_HID "PNP0C09" > #define ACPI_EC_DEVICE_NAME "Embedded Controller" > #define ACPI_EC_FILE_INFO "info" > #undef PREFIX > #define PREFIX "ACPI: EC: " > + > /* EC status register */ > #define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */ > #define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */ > #define ACPI_EC_FLAG_BURST 0x10 /* burst mode */ > #define ACPI_EC_FLAG_SCI 0x20 /* EC-SCI occurred */ > + > /* EC commands */ > enum ec_command { > ACPI_EC_COMMAND_READ = 0x80, > @@ -245,7 +244,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, > > status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0, 0); > if (status) { > - printk(KERN_DEBUG PREFIX > + printk(KERN_ERR PREFIX > "input buffer is not empty, aborting transaction\n"); > goto end; > } > @@ -630,10 +629,6 @@ static int acpi_ec_add(struct acpi_device *device) > > acpi_ec_add_fs(device); > > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s [%s] (gpe %d) interrupt mode.", > - acpi_device_name(device), acpi_device_bid(device), > - (u32) ec->gpe)); > - > return 0; > } > > @@ -718,9 +713,6 @@ static int acpi_ec_start(struct acpi_device *device) > if (!ec) > return -EINVAL; > > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "gpe=0x%02lx, ports=0x%2lx,0x%2lx", > - ec->gpe, ec->command_addr, ec->data_addr)); > - > /* Boot EC is already working */ > if (ec == boot_ec) > return 0; > @@ -779,8 +771,8 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) > > ec->handle = handle; > > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "GPE=0x%02lx, ports=0x%2lx, 0x%2lx", > - ec->gpe, ec->command_addr, ec->data_addr)); > + printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx", > + ec->gpe, ec->command_addr, ec->data_addr); > > return AE_CTRL_TERMINATE; > } > @@ -803,7 +795,7 @@ int __init acpi_ec_ecdt_probe(void) > if (ACPI_FAILURE(status)) > goto error; > > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found ECDT")); > + printk(KERN_INFO PREFIX "EC description table is found, configuring boot EC\n"); > > boot_ec->command_addr = ecdt_ptr->control.address; > boot_ec->data_addr = ecdt_ptr->data.address; > > - > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 3/3] ACPI EC: Add support for non-AML EC query handlers 2007-05-29 12:42 [PATCH 0/3] Series short description Alexey Starikovskiy 2007-05-29 12:42 ` [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle Alexey Starikovskiy 2007-05-29 12:42 ` [PATCH 2/3] ACPI EC: drop usage of ACPI_DEBUG_PRINT as too heavy weight Alexey Starikovskiy @ 2007-05-29 12:43 ` Alexey Starikovskiy 2007-06-23 20:07 ` Len Brown 2 siblings, 1 reply; 21+ messages in thread From: Alexey Starikovskiy @ 2007-05-29 12:43 UTC (permalink / raw) To: len.brown, linux-acpi; +Cc: Alexey Starikovskiy Signed-off-by: Alexey Starikovskiy <aystarik@gmail.com> --- drivers/acpi/ec.c | 175 ++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 125 insertions(+), 50 deletions(-) diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index ffb8361..10e8510 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -34,6 +34,7 @@ #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <linux/interrupt.h> +#include <linux/list.h> #include <asm/io.h> #include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> @@ -43,6 +44,7 @@ #define ACPI_EC_HID "PNP0C09" #define ACPI_EC_DEVICE_NAME "Embedded Controller" #define ACPI_EC_FILE_INFO "info" + #undef PREFIX #define PREFIX "ACPI: EC: " @@ -60,6 +62,7 @@ enum ec_command { ACPI_EC_BURST_DISABLE = 0x83, ACPI_EC_COMMAND_QUERY = 0x84, }; + /* EC events */ enum ec_event { ACPI_EC_EVENT_OBF_1 = 1, /* Output buffer full */ @@ -93,6 +96,16 @@ static struct acpi_driver acpi_ec_driver = { /* If we find an EC via the ECDT, we need to keep a ptr to its context */ /* External interfaces use first EC only, so remember */ +typedef int (*acpi_ec_query_func) (void *data); + +struct acpi_ec_query_handler { + struct list_head node; + acpi_ec_query_func func; + acpi_handle handle; + void *data; + u8 query_bit; +}; + static struct acpi_ec { acpi_handle handle; unsigned long gpe; @@ -103,6 +116,7 @@ static struct acpi_ec { atomic_t query_pending; atomic_t event_count; wait_queue_head_t wait; + struct list_head list; } *boot_ec, *first_ec; /* -------------------------------------------------------------------------- @@ -393,21 +407,67 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data) /* -------------------------------------------------------------------------- Event Management -------------------------------------------------------------------------- */ +int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, + acpi_handle handle, acpi_ec_query_func func, + void *data) +{ + struct acpi_ec_query_handler *handler = + kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL); + if (!handler) + return -ENOMEM; + + handler->query_bit = query_bit; + handler->handle = handle; + handler->func = func; + handler->data = data; + mutex_lock(&ec->lock); + list_add_tail(&handler->node, &ec->list); + mutex_unlock(&ec->lock); + return 0; +} + +EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler); + +void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) +{ + struct acpi_ec_query_handler *handler; + mutex_lock(&ec->lock); + list_for_each_entry(handler, &ec->list, node) { + if (query_bit == handler->query_bit) { + list_del(&handler->node); + kfree(handler); + break; + } + } + mutex_unlock(&ec->lock); +} + +EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler); static void acpi_ec_gpe_query(void *ec_cxt) { struct acpi_ec *ec = ec_cxt; u8 value = 0; - char object_name[8]; + struct acpi_ec_query_handler *handler, copy; if (!ec || acpi_ec_query(ec, &value)) return; - - snprintf(object_name, 8, "_Q%2.2X", value); - - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s", object_name)); - - acpi_evaluate_object(ec->handle, object_name, NULL, NULL); + mutex_lock(&ec->lock); + list_for_each_entry(handler, &ec->list, node) { + if (value == handler->query_bit) { + /* have custom handler for this bit */ + memcpy(©, handler, sizeof(copy)); + mutex_unlock(&ec->lock); + if (copy.func) { + copy.func(copy.data); + } else if (copy.handle) { + acpi_evaluate_object(copy.handle, NULL, NULL, NULL); + } + return; + } + } + mutex_unlock(&ec->lock); + printk(KERN_ERR PREFIX "Handler for query 0x%x is not found!\n", value); } static u32 acpi_ec_gpe_handler(void *data) @@ -426,8 +486,7 @@ static u32 acpi_ec_gpe_handler(void *data) if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) { atomic_set(&ec->query_pending, 1); status = - acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, - ec); + acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec); } return status == AE_OK ? @@ -574,9 +633,6 @@ static int acpi_ec_remove_fs(struct acpi_device *device) static acpi_status ec_parse_io_ports(struct acpi_resource *resource, void *context); -static acpi_status -ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval); - static struct acpi_ec *make_acpi_ec(void) { struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL); @@ -587,13 +643,52 @@ static struct acpi_ec *make_acpi_ec(void) atomic_set(&ec->event_count, 1); mutex_init(&ec->lock); init_waitqueue_head(&ec->wait); + INIT_LIST_HEAD(&ec->list); return ec; } +static acpi_status +acpi_ec_register_query_methods(acpi_handle handle, u32 level, + void *context, void **return_value) +{ + struct acpi_namespace_node *node = handle; + struct acpi_ec *ec = context; + int value = 0; + if (sscanf(node->name.ascii, "_Q%x", &value) == 1) { + acpi_ec_add_query_handler(ec, value, handle, NULL, NULL); + } + return AE_OK; +} + +static int ec_parse_device(struct acpi_ec *ec, acpi_handle handle) +{ + if (ACPI_FAILURE(acpi_walk_resources(handle, METHOD_NAME__CRS, + ec_parse_io_ports, ec))) + return -EINVAL; + + /* Get GPE bit assignment (EC events). */ + /* TODO: Add support for _GPE returning a package */ + if (ACPI_FAILURE(acpi_evaluate_integer(handle, "_GPE", NULL, &ec->gpe))) + return -EINVAL; + + /* Use the global lock for all EC transactions? */ + acpi_evaluate_integer(handle, "_GLK", NULL, &ec->global_lock); + + /* Find and register all query methods */ + acpi_walk_namespace(ACPI_TYPE_METHOD, handle, 1, + acpi_ec_register_query_methods, ec, NULL); + + ec->handle = handle; + + printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx", + ec->gpe, ec->command_addr, ec->data_addr); + + return 0; +} + static int acpi_ec_add(struct acpi_device *device) { - acpi_status status = AE_OK; struct acpi_ec *ec = NULL; if (!device) @@ -606,8 +701,7 @@ static int acpi_ec_add(struct acpi_device *device) if (!ec) return -ENOMEM; - status = ec_parse_device(device->handle, 0, ec, NULL); - if (status != AE_CTRL_TERMINATE) { + if (ec_parse_device(ec, device->handle)) { kfree(ec); return -EINVAL; } @@ -618,6 +712,8 @@ static int acpi_ec_add(struct acpi_device *device) /* We might have incorrect info for GL at boot time */ mutex_lock(&boot_ec->lock); boot_ec->global_lock = ec->global_lock; + /* Copy handlers from new ec into boot ec */ + list_splice(&ec->list, &boot_ec->list); mutex_unlock(&boot_ec->lock); kfree(ec); ec = boot_ec; @@ -628,18 +724,24 @@ static int acpi_ec_add(struct acpi_device *device) acpi_driver_data(device) = ec; acpi_ec_add_fs(device); - return 0; } static int acpi_ec_remove(struct acpi_device *device, int type) { struct acpi_ec *ec; + struct acpi_ec_query_handler *handler; if (!device) return -EINVAL; ec = acpi_driver_data(device); + mutex_lock(&ec->lock); + list_for_each_entry(handler, &ec->list, node) { + list_del(&handler->node); + kfree(handler); + } + mutex_unlock(&ec->lock); acpi_ec_remove_fs(device); acpi_driver_data(device) = NULL; if (ec == first_ec) @@ -695,15 +797,13 @@ static int ec_install_handlers(struct acpi_ec *ec) return -ENODEV; } - /* EC is fully operational, allow queries */ - atomic_set(&ec->query_pending, 0); - return 0; } static int acpi_ec_start(struct acpi_device *device) { struct acpi_ec *ec; + int ret = 0; if (!device) return -EINVAL; @@ -714,10 +814,13 @@ static int acpi_ec_start(struct acpi_device *device) return -EINVAL; /* Boot EC is already working */ - if (ec == boot_ec) - return 0; + if (ec != boot_ec) + ret = ec_install_handlers(ec); + + /* EC is fully operational, allow queries */ + atomic_set(&ec->query_pending, 0); - return ec_install_handlers(ec); + return ret; } static int acpi_ec_stop(struct acpi_device *device, int type) @@ -749,34 +852,6 @@ static int acpi_ec_stop(struct acpi_device *device, int type) return 0; } -static acpi_status -ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) -{ - acpi_status status; - - struct acpi_ec *ec = context; - status = acpi_walk_resources(handle, METHOD_NAME__CRS, - ec_parse_io_ports, ec); - if (ACPI_FAILURE(status)) - return status; - - /* Get GPE bit assignment (EC events). */ - /* TODO: Add support for _GPE returning a package */ - status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec->gpe); - if (ACPI_FAILURE(status)) - return status; - - /* Use the global lock for all EC transactions? */ - acpi_evaluate_integer(handle, "_GLK", NULL, &ec->global_lock); - - ec->handle = handle; - - printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx", - ec->gpe, ec->command_addr, ec->data_addr); - - return AE_CTRL_TERMINATE; -} - int __init acpi_ec_ecdt_probe(void) { int ret; ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 3/3] ACPI EC: Add support for non-AML EC query handlers 2007-05-29 12:43 ` [PATCH 3/3] ACPI EC: Add support for non-AML EC query handlers Alexey Starikovskiy @ 2007-06-23 20:07 ` Len Brown 0 siblings, 0 replies; 21+ messages in thread From: Len Brown @ 2007-06-23 20:07 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: linux-acpi What is the benefit of this patch? (it would be good to say in the check-in comments...hint hint) Also, if you want your git commit author tag to be "Alexey Starikovskiy <astarikovskiy@suse.de>" as you mentioned earlier, then this would be a good time to cut over to sending patches From and signed-off-by that address. thanks, -Len On Tuesday 29 May 2007 08:43, Alexey Starikovskiy wrote: > Signed-off-by: Alexey Starikovskiy <aystarik@gmail.com> > --- > > drivers/acpi/ec.c | 175 ++++++++++++++++++++++++++++++++++++++--------------- > 1 files changed, 125 insertions(+), 50 deletions(-) > > diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > index ffb8361..10e8510 100644 > --- a/drivers/acpi/ec.c > +++ b/drivers/acpi/ec.c > @@ -34,6 +34,7 @@ > #include <linux/proc_fs.h> > #include <linux/seq_file.h> > #include <linux/interrupt.h> > +#include <linux/list.h> > #include <asm/io.h> > #include <acpi/acpi_bus.h> > #include <acpi/acpi_drivers.h> > @@ -43,6 +44,7 @@ > #define ACPI_EC_HID "PNP0C09" > #define ACPI_EC_DEVICE_NAME "Embedded Controller" > #define ACPI_EC_FILE_INFO "info" > + > #undef PREFIX > #define PREFIX "ACPI: EC: " > > @@ -60,6 +62,7 @@ enum ec_command { > ACPI_EC_BURST_DISABLE = 0x83, > ACPI_EC_COMMAND_QUERY = 0x84, > }; > + > /* EC events */ > enum ec_event { > ACPI_EC_EVENT_OBF_1 = 1, /* Output buffer full */ > @@ -93,6 +96,16 @@ static struct acpi_driver acpi_ec_driver = { > > /* If we find an EC via the ECDT, we need to keep a ptr to its context */ > /* External interfaces use first EC only, so remember */ > +typedef int (*acpi_ec_query_func) (void *data); > + > +struct acpi_ec_query_handler { > + struct list_head node; > + acpi_ec_query_func func; > + acpi_handle handle; > + void *data; > + u8 query_bit; > +}; > + > static struct acpi_ec { > acpi_handle handle; > unsigned long gpe; > @@ -103,6 +116,7 @@ static struct acpi_ec { > atomic_t query_pending; > atomic_t event_count; > wait_queue_head_t wait; > + struct list_head list; > } *boot_ec, *first_ec; > > /* -------------------------------------------------------------------------- > @@ -393,21 +407,67 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data) > /* -------------------------------------------------------------------------- > Event Management > -------------------------------------------------------------------------- */ > +int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, > + acpi_handle handle, acpi_ec_query_func func, > + void *data) > +{ > + struct acpi_ec_query_handler *handler = > + kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL); > + if (!handler) > + return -ENOMEM; > + > + handler->query_bit = query_bit; > + handler->handle = handle; > + handler->func = func; > + handler->data = data; > + mutex_lock(&ec->lock); > + list_add_tail(&handler->node, &ec->list); > + mutex_unlock(&ec->lock); > + return 0; > +} > + > +EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler); > + > +void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) > +{ > + struct acpi_ec_query_handler *handler; > + mutex_lock(&ec->lock); > + list_for_each_entry(handler, &ec->list, node) { > + if (query_bit == handler->query_bit) { > + list_del(&handler->node); > + kfree(handler); > + break; > + } > + } > + mutex_unlock(&ec->lock); > +} > + > +EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler); > > static void acpi_ec_gpe_query(void *ec_cxt) > { > struct acpi_ec *ec = ec_cxt; > u8 value = 0; > - char object_name[8]; > + struct acpi_ec_query_handler *handler, copy; > > if (!ec || acpi_ec_query(ec, &value)) > return; > - > - snprintf(object_name, 8, "_Q%2.2X", value); > - > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s", object_name)); > - > - acpi_evaluate_object(ec->handle, object_name, NULL, NULL); > + mutex_lock(&ec->lock); > + list_for_each_entry(handler, &ec->list, node) { > + if (value == handler->query_bit) { > + /* have custom handler for this bit */ > + memcpy(©, handler, sizeof(copy)); > + mutex_unlock(&ec->lock); > + if (copy.func) { > + copy.func(copy.data); > + } else if (copy.handle) { > + acpi_evaluate_object(copy.handle, NULL, NULL, NULL); > + } > + return; > + } > + } > + mutex_unlock(&ec->lock); > + printk(KERN_ERR PREFIX "Handler for query 0x%x is not found!\n", value); > } > > static u32 acpi_ec_gpe_handler(void *data) > @@ -426,8 +486,7 @@ static u32 acpi_ec_gpe_handler(void *data) > if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) { > atomic_set(&ec->query_pending, 1); > status = > - acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, > - ec); > + acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec); > } > > return status == AE_OK ? > @@ -574,9 +633,6 @@ static int acpi_ec_remove_fs(struct acpi_device *device) > static acpi_status > ec_parse_io_ports(struct acpi_resource *resource, void *context); > > -static acpi_status > -ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval); > - > static struct acpi_ec *make_acpi_ec(void) > { > struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL); > @@ -587,13 +643,52 @@ static struct acpi_ec *make_acpi_ec(void) > atomic_set(&ec->event_count, 1); > mutex_init(&ec->lock); > init_waitqueue_head(&ec->wait); > + INIT_LIST_HEAD(&ec->list); > > return ec; > } > > +static acpi_status > +acpi_ec_register_query_methods(acpi_handle handle, u32 level, > + void *context, void **return_value) > +{ > + struct acpi_namespace_node *node = handle; > + struct acpi_ec *ec = context; > + int value = 0; > + if (sscanf(node->name.ascii, "_Q%x", &value) == 1) { > + acpi_ec_add_query_handler(ec, value, handle, NULL, NULL); > + } > + return AE_OK; > +} > + > +static int ec_parse_device(struct acpi_ec *ec, acpi_handle handle) > +{ > + if (ACPI_FAILURE(acpi_walk_resources(handle, METHOD_NAME__CRS, > + ec_parse_io_ports, ec))) > + return -EINVAL; > + > + /* Get GPE bit assignment (EC events). */ > + /* TODO: Add support for _GPE returning a package */ > + if (ACPI_FAILURE(acpi_evaluate_integer(handle, "_GPE", NULL, &ec->gpe))) > + return -EINVAL; > + > + /* Use the global lock for all EC transactions? */ > + acpi_evaluate_integer(handle, "_GLK", NULL, &ec->global_lock); > + > + /* Find and register all query methods */ > + acpi_walk_namespace(ACPI_TYPE_METHOD, handle, 1, > + acpi_ec_register_query_methods, ec, NULL); > + > + ec->handle = handle; > + > + printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx", > + ec->gpe, ec->command_addr, ec->data_addr); > + > + return 0; > +} > + > static int acpi_ec_add(struct acpi_device *device) > { > - acpi_status status = AE_OK; > struct acpi_ec *ec = NULL; > > if (!device) > @@ -606,8 +701,7 @@ static int acpi_ec_add(struct acpi_device *device) > if (!ec) > return -ENOMEM; > > - status = ec_parse_device(device->handle, 0, ec, NULL); > - if (status != AE_CTRL_TERMINATE) { > + if (ec_parse_device(ec, device->handle)) { > kfree(ec); > return -EINVAL; > } > @@ -618,6 +712,8 @@ static int acpi_ec_add(struct acpi_device *device) > /* We might have incorrect info for GL at boot time */ > mutex_lock(&boot_ec->lock); > boot_ec->global_lock = ec->global_lock; > + /* Copy handlers from new ec into boot ec */ > + list_splice(&ec->list, &boot_ec->list); > mutex_unlock(&boot_ec->lock); > kfree(ec); > ec = boot_ec; > @@ -628,18 +724,24 @@ static int acpi_ec_add(struct acpi_device *device) > acpi_driver_data(device) = ec; > > acpi_ec_add_fs(device); > - > return 0; > } > > static int acpi_ec_remove(struct acpi_device *device, int type) > { > struct acpi_ec *ec; > + struct acpi_ec_query_handler *handler; > > if (!device) > return -EINVAL; > > ec = acpi_driver_data(device); > + mutex_lock(&ec->lock); > + list_for_each_entry(handler, &ec->list, node) { > + list_del(&handler->node); > + kfree(handler); > + } > + mutex_unlock(&ec->lock); > acpi_ec_remove_fs(device); > acpi_driver_data(device) = NULL; > if (ec == first_ec) > @@ -695,15 +797,13 @@ static int ec_install_handlers(struct acpi_ec *ec) > return -ENODEV; > } > > - /* EC is fully operational, allow queries */ > - atomic_set(&ec->query_pending, 0); > - > return 0; > } > > static int acpi_ec_start(struct acpi_device *device) > { > struct acpi_ec *ec; > + int ret = 0; > > if (!device) > return -EINVAL; > @@ -714,10 +814,13 @@ static int acpi_ec_start(struct acpi_device *device) > return -EINVAL; > > /* Boot EC is already working */ > - if (ec == boot_ec) > - return 0; > + if (ec != boot_ec) > + ret = ec_install_handlers(ec); > + > + /* EC is fully operational, allow queries */ > + atomic_set(&ec->query_pending, 0); > > - return ec_install_handlers(ec); > + return ret; > } > > static int acpi_ec_stop(struct acpi_device *device, int type) > @@ -749,34 +852,6 @@ static int acpi_ec_stop(struct acpi_device *device, int type) > return 0; > } > > -static acpi_status > -ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) > -{ > - acpi_status status; > - > - struct acpi_ec *ec = context; > - status = acpi_walk_resources(handle, METHOD_NAME__CRS, > - ec_parse_io_ports, ec); > - if (ACPI_FAILURE(status)) > - return status; > - > - /* Get GPE bit assignment (EC events). */ > - /* TODO: Add support for _GPE returning a package */ > - status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec->gpe); > - if (ACPI_FAILURE(status)) > - return status; > - > - /* Use the global lock for all EC transactions? */ > - acpi_evaluate_integer(handle, "_GLK", NULL, &ec->global_lock); > - > - ec->handle = handle; > - > - printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx", > - ec->gpe, ec->command_addr, ec->data_addr); > - > - return AE_CTRL_TERMINATE; > -} > - > int __init acpi_ec_ecdt_probe(void) > { > int ret; > > - > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 0/3] Series short description @ 2009-04-01 6:16 Grant Likely 2009-04-02 7:57 ` David Miller 0 siblings, 1 reply; 21+ messages in thread From: Grant Likely @ 2009-04-01 6:16 UTC (permalink / raw) To: netdev, linuxppc-dev, David Miller Hi David, Here are the fec_mpc52xx patches which should be picked up for 2.6.29. Patch #1 fixes a dma related BUG_ON() discovered after the merge window opened. #2 & #3 were original a single patch posted prior to the merge window, but not having a s-o-b line from the original author held them up. In the end I rewrote it from scratch as two patches just so I can get them merged. #2 makes the driver use net_device_ops, and #3 fixes a NULL dereference. I've tested these patches on several MPC5200 platforms. drivers/net/fec_mpc52xx.c | 77 +++++++++++++++++++++++++------------------- 1 files changed, 44 insertions(+), 33 deletions(-) Cheers, g. -- Grant Likely, B.Sc. P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 0/3] Series short description 2009-04-01 6:16 [PATCH 0/3] Series short description Grant Likely @ 2009-04-02 7:57 ` David Miller 2009-04-02 13:41 ` Grant Likely 0 siblings, 1 reply; 21+ messages in thread From: David Miller @ 2009-04-02 7:57 UTC (permalink / raw) To: grant.likely; +Cc: netdev, linuxppc-dev From: Grant Likely <grant.likely@secretlab.ca> Date: Wed, 01 Apr 2009 00:16:46 -0600 > Here are the fec_mpc52xx patches which should be picked up for 2.6.29. > Patch #1 fixes a dma related BUG_ON() discovered after the merge window > opened. #2 & #3 were original a single patch posted prior to the merge > window, but not having a s-o-b line from the original author held them up. > In the end I rewrote it from scratch as two patches just so I can get > them merged. #2 makes the driver use net_device_ops, and #3 fixes a NULL > dereference. > > I've tested these patches on several MPC5200 platforms. All applied, thanks Grant. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 0/3] Series short description 2009-04-02 7:57 ` David Miller @ 2009-04-02 13:41 ` Grant Likely 0 siblings, 0 replies; 21+ messages in thread From: Grant Likely @ 2009-04-02 13:41 UTC (permalink / raw) To: David Miller; +Cc: netdev, linuxppc-dev On Thu, Apr 2, 2009 at 1:57 AM, David Miller <davem@davemloft.net> wrote: > From: Grant Likely <grant.likely@secretlab.ca> > Date: Wed, 01 Apr 2009 00:16:46 -0600 > >> Here are the fec_mpc52xx patches which should be picked up for 2.6.29. >> Patch #1 fixes a dma related BUG_ON() discovered after the merge window >> opened. =A0#2 & #3 were original a single patch posted prior to the merg= e >> window, but not having a s-o-b line from the original author held them u= p. >> In the end I rewrote it from scratch as two patches just so I can get >> them merged. =A0#2 makes the driver use net_device_ops, and #3 fixes a N= ULL >> dereference. >> >> I've tested these patches on several MPC5200 platforms. > > All applied, thanks Grant. Thanks David! g. --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 0/3] Series short description @ 2009-04-02 13:41 ` Grant Likely 0 siblings, 0 replies; 21+ messages in thread From: Grant Likely @ 2009-04-02 13:41 UTC (permalink / raw) To: David Miller; +Cc: netdev, linuxppc-dev On Thu, Apr 2, 2009 at 1:57 AM, David Miller <davem@davemloft.net> wrote: > From: Grant Likely <grant.likely@secretlab.ca> > Date: Wed, 01 Apr 2009 00:16:46 -0600 > >> Here are the fec_mpc52xx patches which should be picked up for 2.6.29. >> Patch #1 fixes a dma related BUG_ON() discovered after the merge window >> opened. #2 & #3 were original a single patch posted prior to the merge >> window, but not having a s-o-b line from the original author held them up. >> In the end I rewrote it from scratch as two patches just so I can get >> them merged. #2 makes the driver use net_device_ops, and #3 fixes a NULL >> dereference. >> >> I've tested these patches on several MPC5200 platforms. > > All applied, thanks Grant. Thanks David! g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 0/3] Series short description
@ 2009-07-10 22:59 Ben Blum
0 siblings, 0 replies; 21+ messages in thread
From: Ben Blum @ 2009-07-10 22:59 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b,
serue-r/Jw6+rmf7HQT0dZR+AlfA, lizf-BthXqXjhjHXQFUHtdCDX3A,
menage-hpIqsD4AKlfQT0dZR+AlfA
The following series implements...
---
Ben Blum (3):
Quick vmalloc vs kmalloc fix to the case where array size > KMALLOC_MAX_SIZE
Ensures correct concurrent opening/reading of pidlists across pid namespaces
Adds a read-only "procs" file similar to "tasks" that shows only unique tgids
include/linux/cgroup.h | 46 +++++-
kernel/cgroup.c | 378 ++++++++++++++++++++++++++++++++++--------------
2 files changed, 309 insertions(+), 115 deletions(-)
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 0/3] Series short description
@ 2009-07-10 22:59 Ben Blum
0 siblings, 0 replies; 21+ messages in thread
From: Ben Blum @ 2009-07-10 22:59 UTC (permalink / raw)
To: linux-kernel, containers, akpm, serue, lizf, menage
The following series implements...
---
Ben Blum (3):
Quick vmalloc vs kmalloc fix to the case where array size > KMALLOC_MAX_SIZE
Ensures correct concurrent opening/reading of pidlists across pid namespaces
Adds a read-only "procs" file similar to "tasks" that shows only unique tgids
include/linux/cgroup.h | 46 +++++-
kernel/cgroup.c | 378 ++++++++++++++++++++++++++++++++++--------------
2 files changed, 309 insertions(+), 115 deletions(-)
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 0/3] Series short description
@ 2010-11-30 10:14 ` Balbir Singh
0 siblings, 0 replies; 21+ messages in thread
From: Balbir Singh @ 2010-11-30 10:14 UTC (permalink / raw)
To: linux-mm, Christoph Lameter; +Cc: akpm, linux-kernel, kvm
The following series implements page cache control,
this is a split out version of patch 1 of version 3 of the
page cache optimization patches posted earlier at
http://www.mail-archive.com/kvm@vger.kernel.org/msg43654.html
Christoph Lamater recommended splitting out patch 1, which
is what this series does
Detailed Description
====================
This patch implements unmapped page cache control via preferred
page cache reclaim. The current patch hooks into kswapd and reclaims
page cache if the user has requested for unmapped page control.
This is useful in the following scenario
- In a virtualized environment with cache=writethrough, we see
double caching - (one in the host and one in the guest). As
we try to scale guests, cache usage across the system grows.
The goal of this patch is to reclaim page cache when Linux is running
as a guest and get the host to hold the page cache and manage it.
There might be temporary duplication, but in the long run, memory
in the guests would be used for mapped pages.
- The option is controlled via a boot option and the administrator
can selectively turn it on, on a need to use basis.
A lot of the code is borrowed from zone_reclaim_mode logic for
__zone_reclaim(). One might argue that the with ballooning and
KSM this feature is not very useful, but even with ballooning,
we need extra logic to balloon multiple VM machines and it is hard
to figure out the correct amount of memory to balloon. With these
patches applied, each guest has a sufficient amount of free memory
available, that can be easily seen and reclaimed by the balloon driver.
The additional memory in the guest can be reused for additional
applications or used to start additional guests/balance memory in
the host.
KSM currently does not de-duplicate host and guest page cache. The goal
of this patch is to help automatically balance unmapped page cache when
instructed to do so.
There are some magic numbers in use in the code, UNMAPPED_PAGE_RATIO
and the number of pages to reclaim when unmapped_page_control argument
is supplied. These numbers were chosen to avoid aggressiveness in
reaping page cache ever so frequently, at the same time providing control.
The sysctl for min_unmapped_ratio provides further control from
within the guest on the amount of unmapped pages to reclaim.
For a single VM - running kernbench
Enabled
Optimal load -j 8 run number 1...
Optimal load -j 8 run number 2...
Optimal load -j 8 run number 3...
Optimal load -j 8 run number 4...
Optimal load -j 8 run number 5...
Average Optimal load -j 8 Run (std deviation):
Elapsed Time 273.726 (1.2683)
User Time 190.014 (0.589941)
System Time 298.758 (1.72574)
Percent CPU 178 (0)
Context Switches 119953 (865.74)
Sleeps 38758 (795.074)
Disabled
Optimal load -j 8 run number 1...
Optimal load -j 8 run number 2...
Optimal load -j 8 run number 3...
Optimal load -j 8 run number 4...
Optimal load -j 8 run number 5...
Average Optimal load -j 8 Run (std deviation):
Elapsed Time 272.672 (0.453178)
User Time 189.7 (0.718157)
System Time 296.77 (0.845606)
Percent CPU 178 (0)
Context Switches 118822 (277.434)
Sleeps 37542.8 (545.922)
More data on the test results with the earlier patch is
at http://www.mail-archive.com/kvm@vger.kernel.org/msg43655.html
---
Balbir Singh (3):
Move zone_reclaim() outside of CONFIG_NUMA
Refactor zone_reclaim, move reusable functionality outside
Provide control over unmapped pages
include/linux/mmzone.h | 4 +-
include/linux/swap.h | 5 +-
mm/page_alloc.c | 7 ++-
mm/vmscan.c | 109 +++++++++++++++++++++++++++++++++++++++++-------
4 files changed, 104 insertions(+), 21 deletions(-)
--
Balbir
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 0/3] Series short description @ 2010-11-30 10:14 ` Balbir Singh 0 siblings, 0 replies; 21+ messages in thread From: Balbir Singh @ 2010-11-30 10:14 UTC (permalink / raw) To: linux-mm, Christoph Lameter; +Cc: akpm, linux-kernel, kvm The following series implements page cache control, this is a split out version of patch 1 of version 3 of the page cache optimization patches posted earlier at http://www.mail-archive.com/kvm@vger.kernel.org/msg43654.html Christoph Lamater recommended splitting out patch 1, which is what this series does Detailed Description ==================== This patch implements unmapped page cache control via preferred page cache reclaim. The current patch hooks into kswapd and reclaims page cache if the user has requested for unmapped page control. This is useful in the following scenario - In a virtualized environment with cache=writethrough, we see double caching - (one in the host and one in the guest). As we try to scale guests, cache usage across the system grows. The goal of this patch is to reclaim page cache when Linux is running as a guest and get the host to hold the page cache and manage it. There might be temporary duplication, but in the long run, memory in the guests would be used for mapped pages. - The option is controlled via a boot option and the administrator can selectively turn it on, on a need to use basis. A lot of the code is borrowed from zone_reclaim_mode logic for __zone_reclaim(). One might argue that the with ballooning and KSM this feature is not very useful, but even with ballooning, we need extra logic to balloon multiple VM machines and it is hard to figure out the correct amount of memory to balloon. With these patches applied, each guest has a sufficient amount of free memory available, that can be easily seen and reclaimed by the balloon driver. The additional memory in the guest can be reused for additional applications or used to start additional guests/balance memory in the host. KSM currently does not de-duplicate host and guest page cache. The goal of this patch is to help automatically balance unmapped page cache when instructed to do so. There are some magic numbers in use in the code, UNMAPPED_PAGE_RATIO and the number of pages to reclaim when unmapped_page_control argument is supplied. These numbers were chosen to avoid aggressiveness in reaping page cache ever so frequently, at the same time providing control. The sysctl for min_unmapped_ratio provides further control from within the guest on the amount of unmapped pages to reclaim. For a single VM - running kernbench Enabled Optimal load -j 8 run number 1... Optimal load -j 8 run number 2... Optimal load -j 8 run number 3... Optimal load -j 8 run number 4... Optimal load -j 8 run number 5... Average Optimal load -j 8 Run (std deviation): Elapsed Time 273.726 (1.2683) User Time 190.014 (0.589941) System Time 298.758 (1.72574) Percent CPU 178 (0) Context Switches 119953 (865.74) Sleeps 38758 (795.074) Disabled Optimal load -j 8 run number 1... Optimal load -j 8 run number 2... Optimal load -j 8 run number 3... Optimal load -j 8 run number 4... Optimal load -j 8 run number 5... Average Optimal load -j 8 Run (std deviation): Elapsed Time 272.672 (0.453178) User Time 189.7 (0.718157) System Time 296.77 (0.845606) Percent CPU 178 (0) Context Switches 118822 (277.434) Sleeps 37542.8 (545.922) More data on the test results with the earlier patch is at http://www.mail-archive.com/kvm@vger.kernel.org/msg43655.html --- Balbir Singh (3): Move zone_reclaim() outside of CONFIG_NUMA Refactor zone_reclaim, move reusable functionality outside Provide control over unmapped pages include/linux/mmzone.h | 4 +- include/linux/swap.h | 5 +- mm/page_alloc.c | 7 ++- mm/vmscan.c | 109 +++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 104 insertions(+), 21 deletions(-) -- Balbir -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 0/3] Series short description
@ 2011-09-19 16:52 Lukasz Orlowski
0 siblings, 0 replies; 21+ messages in thread
From: Lukasz Orlowski @ 2011-09-19 16:52 UTC (permalink / raw)
To: neilb; +Cc: linux-raid
The following series implements...
---
Lukasz Orlowski (3):
Create: Allow to create two volumes of different sizes within one container
Create: Unnecessary prompt about device being busy
Create: Incorrect message when creating a volume with explicit md dev name
Create.c | 26 +++++++++++++++-----------
super-intel.c | 16 +++++++++++++---
2 files changed, 28 insertions(+), 14 deletions(-)
--
Signature
---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
z siedziba w Gdansku
ul. Slowackiego 173
80-298 Gdansk
Sad Rejonowy Gdansk Polnoc w Gdansku,
VII Wydzial Gospodarczy Krajowego Rejestru Sadowego,
numer KRS 101882
NIP 957-07-52-316
Kapital zakladowy 200.000 zl
This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 0/3] Series short description
@ 2012-04-04 23:10 Dave Jiang
0 siblings, 0 replies; 21+ messages in thread
From: Dave Jiang @ 2012-04-04 23:10 UTC (permalink / raw)
To: dan.j.williams, linux-kernel; +Cc: netdev, davem
The following series address issues with the ioatdma driver. The first
patch fixes a potential ring size overflow. The next two patches put
in alignment requirement for silicon errata on the ioatdma hardware related to
M2M ops and impacts NETDMA. The last patch will probably need to be
ack'd by David Miller as it touches the network subsystem.
---
Dave Jiang (3):
netdma: adding alignment check for NETDMA ops
ioatdma: DMA copy alignment needed to address IOAT DMA silicon errata
ioat: ring size variables need to be 32bit to avoid overflow
drivers/dma/dmaengine.c | 14 ++++++++++++++
drivers/dma/ioat/dma_v2.c | 4 ++--
drivers/dma/ioat/dma_v2.h | 4 ++--
drivers/dma/ioat/dma_v3.c | 41 +++++++++++++++++++++++++++++++++++++++++
include/linux/dmaengine.h | 1 +
net/ipv4/tcp.c | 4 ++--
net/ipv4/tcp_input.c | 2 +-
net/ipv4/tcp_ipv4.c | 2 +-
net/ipv6/tcp_ipv6.c | 2 +-
9 files changed, 65 insertions(+), 9 deletions(-)
--
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 0/3] Series short description
@ 2014-03-25 23:39 David Härdeman
2014-03-25 23:40 ` David Härdeman
0 siblings, 1 reply; 21+ messages in thread
From: David Härdeman @ 2014-03-25 23:39 UTC (permalink / raw)
To: linux-media; +Cc: m.chehab
The following series implements...
---
David Härdeman (3):
bt8xx: fixup RC5 decoding
rc-core: improve ir-kbd-i2c get_key functions
rc-core: document the protocol type
drivers/media/i2c/ir-kbd-i2c.c | 91 +++++++++++-----------
drivers/media/pci/bt8xx/bttv-input.c | 78 ++++++++++---------
drivers/media/pci/bt8xx/bttvp.h | 2
drivers/media/pci/cx88/cx88-input.c | 34 ++++++--
drivers/media/pci/dm1105/dm1105.c | 3 -
drivers/media/pci/ivtv/ivtv-i2c.c | 9 +-
drivers/media/pci/saa7134/saa7134-input.c | 82 ++++++++++++--------
drivers/media/pci/ttpci/budget-ci.c | 8 +-
drivers/media/rc/img-ir/img-ir-hw.c | 8 +-
drivers/media/rc/img-ir/img-ir-hw.h | 3 -
drivers/media/rc/img-ir/img-ir-jvc.c | 4 +
drivers/media/rc/img-ir/img-ir-nec.c | 4 +
drivers/media/rc/img-ir/img-ir-sanyo.c | 4 +
drivers/media/rc/img-ir/img-ir-sharp.c | 4 +
drivers/media/rc/img-ir/img-ir-sony.c | 12 ++-
drivers/media/rc/ir-jvc-decoder.c | 2
drivers/media/rc/ir-nec-decoder.c | 2
drivers/media/rc/ir-rc5-decoder.c | 5 +
drivers/media/rc/ir-rc5-sz-decoder.c | 2
drivers/media/rc/ir-rc6-decoder.c | 37 +++++++--
drivers/media/rc/ir-sanyo-decoder.c | 2
drivers/media/rc/ir-sharp-decoder.c | 2
drivers/media/rc/ir-sony-decoder.c | 6 +
drivers/media/rc/keymaps/rc-nebula.c | 112 ++++++++++++++-------------
drivers/media/rc/rc-main.c | 32 +++++---
drivers/media/usb/cx231xx/cx231xx-input.c | 20 ++---
drivers/media/usb/dvb-usb-v2/af9015.c | 18 +++-
drivers/media/usb/dvb-usb-v2/af9035.c | 9 +-
drivers/media/usb/dvb-usb-v2/anysee.c | 3 -
drivers/media/usb/dvb-usb-v2/az6007.c | 25 +++---
drivers/media/usb/dvb-usb-v2/lmedm04.c | 9 +-
drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 12 +--
drivers/media/usb/dvb-usb/dib0700_core.c | 16 ++--
drivers/media/usb/dvb-usb/dib0700_devices.c | 24 +++---
drivers/media/usb/dvb-usb/dw2102.c | 7 +-
drivers/media/usb/dvb-usb/m920x.c | 2
drivers/media/usb/dvb-usb/pctv452e.c | 8 +-
drivers/media/usb/dvb-usb/ttusb2.c | 6 +
drivers/media/usb/em28xx/em28xx-input.c | 98 ++++++++++++++----------
drivers/media/usb/tm6000/tm6000-input.c | 51 ++++++++----
include/media/ir-kbd-i2c.h | 6 +
include/media/rc-core.h | 6 +
include/media/rc-map.h | 10 ++
43 files changed, 512 insertions(+), 366 deletions(-)
--
Signature
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH 0/3] Series short description 2014-03-25 23:39 David Härdeman @ 2014-03-25 23:40 ` David Härdeman 0 siblings, 0 replies; 21+ messages in thread From: David Härdeman @ 2014-03-25 23:40 UTC (permalink / raw) To: linux-media; +Cc: m.chehab On Wed, Mar 26, 2014 at 12:39:23AM +0100, David Härdeman wrote: >The following series implements... Nothing...sorry, I'll send the real patchset soon :) ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 0/3] Series short description
@ 2014-09-05 1:00 ` Leonid Yegoshin
0 siblings, 0 replies; 21+ messages in thread
From: Leonid Yegoshin @ 2014-09-05 1:00 UTC (permalink / raw)
To: linux-mips, hauke, yanh, zajec5, ralf, alex.smith, taohl, chenhc
The following series implements...
---
Leonid Yegoshin (3):
MIPS: rearrange PTE bits into fixed positions
MIPS: PTE bit positions slightly changed to prepare a more simple swap/file presentation
MIPS: bugfix of PTE formats for swap and file entries
arch/mips/include/asm/pgtable-32.h | 107 ++++++++-----------
arch/mips/include/asm/pgtable-64.h | 25 +++-
arch/mips/include/asm/pgtable-bits.h | 189 ++++++++++++++++++++++++++++++----
3 files changed, 232 insertions(+), 89 deletions(-)
--
Signature
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 0/3] Series short description @ 2014-09-05 1:00 ` Leonid Yegoshin 0 siblings, 0 replies; 21+ messages in thread From: Leonid Yegoshin @ 2014-09-05 1:00 UTC (permalink / raw) To: linux-mips, hauke, yanh, zajec5, ralf, alex.smith, taohl, chenhc The following series implements... --- Leonid Yegoshin (3): MIPS: rearrange PTE bits into fixed positions MIPS: PTE bit positions slightly changed to prepare a more simple swap/file presentation MIPS: bugfix of PTE formats for swap and file entries arch/mips/include/asm/pgtable-32.h | 107 ++++++++----------- arch/mips/include/asm/pgtable-64.h | 25 +++- arch/mips/include/asm/pgtable-bits.h | 189 ++++++++++++++++++++++++++++++---- 3 files changed, 232 insertions(+), 89 deletions(-) -- Signature ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2014-09-05 1:00 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-05-29 12:42 [PATCH 0/3] Series short description Alexey Starikovskiy 2007-05-29 12:42 ` [PATCH 1/3] ACPI EC: Re-factor EC space handler to avoid using label/goto for cycle Alexey Starikovskiy 2007-06-23 20:02 ` Len Brown 2007-05-29 12:42 ` [PATCH 2/3] ACPI EC: drop usage of ACPI_DEBUG_PRINT as too heavy weight Alexey Starikovskiy 2007-06-23 20:03 ` Len Brown 2007-05-29 12:43 ` [PATCH 3/3] ACPI EC: Add support for non-AML EC query handlers Alexey Starikovskiy 2007-06-23 20:07 ` Len Brown -- strict thread matches above, loose matches on Subject: below -- 2009-04-01 6:16 [PATCH 0/3] Series short description Grant Likely 2009-04-02 7:57 ` David Miller 2009-04-02 13:41 ` Grant Likely 2009-04-02 13:41 ` Grant Likely 2009-07-10 22:59 Ben Blum 2009-07-10 22:59 Ben Blum 2010-11-30 10:14 Balbir Singh 2010-11-30 10:14 ` Balbir Singh 2011-09-19 16:52 Lukasz Orlowski 2012-04-04 23:10 Dave Jiang 2014-03-25 23:39 David Härdeman 2014-03-25 23:40 ` David Härdeman 2014-09-05 1:00 Leonid Yegoshin 2014-09-05 1:00 ` Leonid Yegoshin
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.