mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'akpm' (incoming from Andrew)
Merge first batch of fixes from Andrew Morton: - A couple of kthread changes - A few minor audit patches - A number of fbdev patches. Florian remains AWOL so I'm picking up some of these. - A few kbuild things - ocfs2 updates - Almost all of the MM queue (And in the meantime, I already have the second big batch from Andrew pending in my mailbox ;^) * emailed patches from Andrew Morton <[email protected]>: (149 commits) memcg: take reference before releasing rcu_read_lock mem hotunplug: fix kfree() of bootmem memory mmKconfig: add an option to disable bounce mm, nobootmem: do memset() after memblock_reserve() mm, nobootmem: clean-up of free_low_memory_core_early() fs/buffer.c: remove unnecessary init operation after allocating buffer_head. numa, cpu hotplug: change links of CPU and node when changing node number by onlining CPU mm: fix memory_hotplug.c printk format warning mm: swap: mark swap pages writeback before queueing for direct IO swap: redirty page if page write fails on swap file mm, memcg: give exiting processes access to memory reserves thp: fix huge zero page logic for page with pfn == 0 memcg: avoid accessing memcg after releasing reference fs: fix fsync() error reporting memblock: fix missing comment of memblock_insert_region() mm: Remove unused parameter of pages_correctly_reserved() firmware, memmap: fix firmware_map_entry leak mm/vmstat: add note on safety of drain_zonestat mm: thp: add split tail pages to shrink page list in page reclaim mm: allow for outstanding swap writeback accounting ...
This commit is contained in:
commit
73154383f0
166 changed files with 3438 additions and 2177 deletions
|
|
@ -25,6 +25,15 @@ EXPORT_SYMBOL_GPL(cpu_subsys);
|
|||
static DEFINE_PER_CPU(struct device *, cpu_sys_devices);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void change_cpu_under_node(struct cpu *cpu,
|
||||
unsigned int from_nid, unsigned int to_nid)
|
||||
{
|
||||
int cpuid = cpu->dev.id;
|
||||
unregister_cpu_under_node(cpuid, from_nid);
|
||||
register_cpu_under_node(cpuid, to_nid);
|
||||
cpu->node_id = to_nid;
|
||||
}
|
||||
|
||||
static ssize_t show_online(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
|
@ -39,17 +48,29 @@ static ssize_t __ref store_online(struct device *dev,
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
struct cpu *cpu = container_of(dev, struct cpu, dev);
|
||||
int cpuid = cpu->dev.id;
|
||||
int from_nid, to_nid;
|
||||
ssize_t ret;
|
||||
|
||||
cpu_hotplug_driver_lock();
|
||||
switch (buf[0]) {
|
||||
case '0':
|
||||
ret = cpu_down(cpu->dev.id);
|
||||
ret = cpu_down(cpuid);
|
||||
if (!ret)
|
||||
kobject_uevent(&dev->kobj, KOBJ_OFFLINE);
|
||||
break;
|
||||
case '1':
|
||||
ret = cpu_up(cpu->dev.id);
|
||||
from_nid = cpu_to_node(cpuid);
|
||||
ret = cpu_up(cpuid);
|
||||
|
||||
/*
|
||||
* When hot adding memory to memoryless node and enabling a cpu
|
||||
* on the node, node number of the cpu may internally change.
|
||||
*/
|
||||
to_nid = cpu_to_node(cpuid);
|
||||
if (from_nid != to_nid)
|
||||
change_cpu_under_node(cpu, from_nid, to_nid);
|
||||
|
||||
if (!ret)
|
||||
kobject_uevent(&dev->kobj, KOBJ_ONLINE);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -93,16 +93,6 @@ int register_memory(struct memory_block *memory)
|
|||
return error;
|
||||
}
|
||||
|
||||
static void
|
||||
unregister_memory(struct memory_block *memory)
|
||||
{
|
||||
BUG_ON(memory->dev.bus != &memory_subsys);
|
||||
|
||||
/* drop the ref. we got in remove_memory_block() */
|
||||
kobject_put(&memory->dev.kobj);
|
||||
device_unregister(&memory->dev);
|
||||
}
|
||||
|
||||
unsigned long __weak memory_block_size_bytes(void)
|
||||
{
|
||||
return MIN_MEMORY_BLOCK_SIZE;
|
||||
|
|
@ -217,8 +207,7 @@ int memory_isolate_notify(unsigned long val, void *v)
|
|||
* The probe routines leave the pages reserved, just as the bootmem code does.
|
||||
* Make sure they're still that way.
|
||||
*/
|
||||
static bool pages_correctly_reserved(unsigned long start_pfn,
|
||||
unsigned long nr_pages)
|
||||
static bool pages_correctly_reserved(unsigned long start_pfn)
|
||||
{
|
||||
int i, j;
|
||||
struct page *page;
|
||||
|
|
@ -266,7 +255,7 @@ memory_block_action(unsigned long phys_index, unsigned long action, int online_t
|
|||
|
||||
switch (action) {
|
||||
case MEM_ONLINE:
|
||||
if (!pages_correctly_reserved(start_pfn, nr_pages))
|
||||
if (!pages_correctly_reserved(start_pfn))
|
||||
return -EBUSY;
|
||||
|
||||
ret = online_pages(start_pfn, nr_pages, online_type);
|
||||
|
|
@ -637,8 +626,28 @@ static int add_memory_section(int nid, struct mem_section *section,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int remove_memory_block(unsigned long node_id, struct mem_section *section,
|
||||
int phys_device)
|
||||
/*
|
||||
* need an interface for the VM to add new memory regions,
|
||||
* but without onlining it.
|
||||
*/
|
||||
int register_new_memory(int nid, struct mem_section *section)
|
||||
{
|
||||
return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||
static void
|
||||
unregister_memory(struct memory_block *memory)
|
||||
{
|
||||
BUG_ON(memory->dev.bus != &memory_subsys);
|
||||
|
||||
/* drop the ref. we got in remove_memory_block() */
|
||||
kobject_put(&memory->dev.kobj);
|
||||
device_unregister(&memory->dev);
|
||||
}
|
||||
|
||||
static int remove_memory_block(unsigned long node_id,
|
||||
struct mem_section *section, int phys_device)
|
||||
{
|
||||
struct memory_block *mem;
|
||||
|
||||
|
|
@ -661,15 +670,6 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* need an interface for the VM to add new memory regions,
|
||||
* but without onlining it.
|
||||
*/
|
||||
int register_new_memory(int nid, struct mem_section *section)
|
||||
{
|
||||
return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG);
|
||||
}
|
||||
|
||||
int unregister_memory_section(struct mem_section *section)
|
||||
{
|
||||
if (!present_section(section))
|
||||
|
|
@ -677,6 +677,7 @@ int unregister_memory_section(struct mem_section *section)
|
|||
|
||||
return remove_memory_block(0, section, 0);
|
||||
}
|
||||
#endif /* CONFIG_MEMORY_HOTREMOVE */
|
||||
|
||||
/*
|
||||
* offline one memory block. If the memory block has been offlined, do nothing.
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/memory.h>
|
||||
#include <linux/vmstat.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/node.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/compaction.h>
|
||||
|
|
@ -683,8 +684,11 @@ static int __init register_node_type(void)
|
|||
|
||||
ret = subsys_system_register(&node_subsys, cpu_root_attr_groups);
|
||||
if (!ret) {
|
||||
hotplug_memory_notifier(node_memory_callback,
|
||||
NODE_CALLBACK_PRI);
|
||||
static struct notifier_block node_memory_callback_nb = {
|
||||
.notifier_call = node_memory_callback,
|
||||
.priority = NODE_CALLBACK_PRI,
|
||||
};
|
||||
register_hotmemory_notifier(&node_memory_callback_nb);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue