mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
Merge branch 'akpm' (Fixups from Andrew)
Merge misc fixes from Andrew Morton: "Followups, fixes and some random stuff I found on the internet." * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (11 patches) perf: fix duplicate header inclusion memcg, kmem: fix build error when CONFIG_INET is disabled rtc: kconfig: fix RTC_INTF defaults connected to RTC_CLASS rapidio: fix comment lib/kasprintf.c: use kmalloc_track_caller() to get accurate traces for kvasprintf rapidio: update for destination ID allocation rapidio: update asynchronous discovery initialization rapidio: use msleep in discovery wait mm: compaction: fix bit ranges in {get,clear,set}_pageblock_skip() arch/powerpc/platforms/pseries/hotplug-memory.c: section removal cleanups arch/powerpc/platforms/pseries/hotplug-memory.c: fix section handling code
This commit is contained in:
commit
14ffe009ca
@ -77,8 +77,9 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz
|
||||
{
|
||||
unsigned long start, start_pfn;
|
||||
struct zone *zone;
|
||||
int i, ret;
|
||||
int sections_to_remove;
|
||||
int ret;
|
||||
unsigned long section;
|
||||
unsigned long sections_to_remove;
|
||||
|
||||
start_pfn = base >> PAGE_SHIFT;
|
||||
|
||||
@ -99,9 +100,9 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz
|
||||
* while writing to it. So we have to defer it to here.
|
||||
*/
|
||||
sections_to_remove = (memblock_size >> PAGE_SHIFT) / PAGES_PER_SECTION;
|
||||
for (i = 0; i < sections_to_remove; i++) {
|
||||
unsigned long pfn = start_pfn + i * PAGES_PER_SECTION;
|
||||
ret = __remove_pages(zone, start_pfn, PAGES_PER_SECTION);
|
||||
for (section = 0; section < sections_to_remove; section++) {
|
||||
unsigned long pfn = start_pfn + section * PAGES_PER_SECTION;
|
||||
ret = __remove_pages(zone, pfn, PAGES_PER_SECTION);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
@ -55,9 +55,9 @@ static int rio_mport_phys_table[] = {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
* rio_destid_alloc - Allocate next available destID for given network
|
||||
* net: RIO network
|
||||
* @net: RIO network
|
||||
*
|
||||
* Returns next available device destination ID for the specified RIO network.
|
||||
* Marks allocated ID as one in use.
|
||||
@ -69,14 +69,9 @@ static u16 rio_destid_alloc(struct rio_net *net)
|
||||
struct rio_id_table *idtab = &net->destid_table;
|
||||
|
||||
spin_lock(&idtab->lock);
|
||||
destid = find_next_zero_bit(idtab->table, idtab->max, idtab->next);
|
||||
if (destid >= idtab->max)
|
||||
destid = find_first_zero_bit(idtab->table, idtab->max);
|
||||
destid = find_first_zero_bit(idtab->table, idtab->max);
|
||||
|
||||
if (destid < idtab->max) {
|
||||
idtab->next = destid + 1;
|
||||
if (idtab->next >= idtab->max)
|
||||
idtab->next = 0;
|
||||
set_bit(destid, idtab->table);
|
||||
destid += idtab->start;
|
||||
} else
|
||||
@ -86,10 +81,10 @@ static u16 rio_destid_alloc(struct rio_net *net)
|
||||
return (u16)destid;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* rio_destid_reserve - Reserve the specivied destID
|
||||
* net: RIO network
|
||||
* destid: destID to reserve
|
||||
* @net: RIO network
|
||||
* @destid: destID to reserve
|
||||
*
|
||||
* Tries to reserve the specified destID.
|
||||
* Returns 0 if successfull.
|
||||
@ -106,10 +101,10 @@ static int rio_destid_reserve(struct rio_net *net, u16 destid)
|
||||
return oldbit;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* rio_destid_free - free a previously allocated destID
|
||||
* net: RIO network
|
||||
* destid: destID to free
|
||||
* @net: RIO network
|
||||
* @destid: destID to free
|
||||
*
|
||||
* Makes the specified destID available for use.
|
||||
*/
|
||||
@ -123,9 +118,9 @@ static void rio_destid_free(struct rio_net *net, u16 destid)
|
||||
spin_unlock(&idtab->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* rio_destid_first - return first destID in use
|
||||
* net: RIO network
|
||||
* @net: RIO network
|
||||
*/
|
||||
static u16 rio_destid_first(struct rio_net *net)
|
||||
{
|
||||
@ -142,10 +137,10 @@ static u16 rio_destid_first(struct rio_net *net)
|
||||
return (u16)destid;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* rio_destid_next - return next destID in use
|
||||
* net: RIO network
|
||||
* from: destination ID from which search shall continue
|
||||
* @net: RIO network
|
||||
* @from: destination ID from which search shall continue
|
||||
*/
|
||||
static u16 rio_destid_next(struct rio_net *net, u16 from)
|
||||
{
|
||||
@ -1163,8 +1158,8 @@ static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port,
|
||||
|
||||
net = kzalloc(sizeof(struct rio_net), GFP_KERNEL);
|
||||
if (net && do_enum) {
|
||||
net->destid_table.table = kzalloc(
|
||||
BITS_TO_LONGS(RIO_MAX_ROUTE_ENTRIES(port->sys_size)) *
|
||||
net->destid_table.table = kcalloc(
|
||||
BITS_TO_LONGS(RIO_MAX_ROUTE_ENTRIES(port->sys_size)),
|
||||
sizeof(long),
|
||||
GFP_KERNEL);
|
||||
|
||||
@ -1174,7 +1169,6 @@ static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port,
|
||||
net = NULL;
|
||||
} else {
|
||||
net->destid_table.start = start;
|
||||
net->destid_table.next = 0;
|
||||
net->destid_table.max =
|
||||
RIO_MAX_ROUTE_ENTRIES(port->sys_size);
|
||||
spin_lock_init(&net->destid_table.lock);
|
||||
@ -1391,7 +1385,7 @@ int __devinit rio_disc_mport(struct rio_mport *mport)
|
||||
while (time_before(jiffies, to_end)) {
|
||||
if (rio_enum_complete(mport))
|
||||
goto enum_done;
|
||||
schedule_timeout_uninterruptible(msecs_to_jiffies(10));
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
pr_debug("RIO: discovery timeout on mport %d %s\n",
|
||||
|
@ -1275,49 +1275,68 @@ static void __devinit disc_work_handler(struct work_struct *_work)
|
||||
pr_debug("RIO: discovery work for mport %d %s\n",
|
||||
work->mport->id, work->mport->name);
|
||||
rio_disc_mport(work->mport);
|
||||
|
||||
kfree(work);
|
||||
}
|
||||
|
||||
int __devinit rio_init_mports(void)
|
||||
{
|
||||
struct rio_mport *port;
|
||||
struct rio_disc_work *work;
|
||||
int no_disc = 0;
|
||||
int n = 0;
|
||||
|
||||
if (!next_portid)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* First, run enumerations and check if we need to perform discovery
|
||||
* on any of the registered mports.
|
||||
*/
|
||||
list_for_each_entry(port, &rio_mports, node) {
|
||||
if (port->host_deviceid >= 0)
|
||||
rio_enum_mport(port);
|
||||
else if (!no_disc) {
|
||||
if (!rio_wq) {
|
||||
rio_wq = alloc_workqueue("riodisc", 0, 0);
|
||||
if (!rio_wq) {
|
||||
pr_err("RIO: unable allocate rio_wq\n");
|
||||
no_disc = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
n++;
|
||||
}
|
||||
|
||||
work = kzalloc(sizeof *work, GFP_KERNEL);
|
||||
if (!work) {
|
||||
pr_err("RIO: no memory for work struct\n");
|
||||
no_disc = 1;
|
||||
continue;
|
||||
}
|
||||
if (!n)
|
||||
goto no_disc;
|
||||
|
||||
work->mport = port;
|
||||
INIT_WORK(&work->work, disc_work_handler);
|
||||
queue_work(rio_wq, &work->work);
|
||||
/*
|
||||
* If we have mports that require discovery schedule a discovery work
|
||||
* for each of them. If the code below fails to allocate needed
|
||||
* resources, exit without error to keep results of enumeration
|
||||
* process (if any).
|
||||
* TODO: Implement restart of dicovery process for all or
|
||||
* individual discovering mports.
|
||||
*/
|
||||
rio_wq = alloc_workqueue("riodisc", 0, 0);
|
||||
if (!rio_wq) {
|
||||
pr_err("RIO: unable allocate rio_wq\n");
|
||||
goto no_disc;
|
||||
}
|
||||
|
||||
work = kcalloc(n, sizeof *work, GFP_KERNEL);
|
||||
if (!work) {
|
||||
pr_err("RIO: no memory for work struct\n");
|
||||
destroy_workqueue(rio_wq);
|
||||
goto no_disc;
|
||||
}
|
||||
|
||||
n = 0;
|
||||
list_for_each_entry(port, &rio_mports, node) {
|
||||
if (port->host_deviceid < 0) {
|
||||
work[n].mport = port;
|
||||
INIT_WORK(&work[n].work, disc_work_handler);
|
||||
queue_work(rio_wq, &work[n].work);
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
if (rio_wq) {
|
||||
pr_debug("RIO: flush discovery workqueue\n");
|
||||
flush_workqueue(rio_wq);
|
||||
pr_debug("RIO: flush discovery workqueue finished\n");
|
||||
destroy_workqueue(rio_wq);
|
||||
}
|
||||
flush_workqueue(rio_wq);
|
||||
pr_debug("RIO: destroy discovery workqueue\n");
|
||||
destroy_workqueue(rio_wq);
|
||||
kfree(work);
|
||||
|
||||
no_disc:
|
||||
rio_init();
|
||||
|
||||
return 0;
|
||||
|
@ -59,6 +59,7 @@ comment "RTC interfaces"
|
||||
config RTC_INTF_SYSFS
|
||||
boolean "/sys/class/rtc/rtcN (sysfs)"
|
||||
depends on SYSFS
|
||||
default RTC_CLASS
|
||||
help
|
||||
Say yes here if you want to use your RTCs using sysfs interfaces,
|
||||
/sys/class/rtc/rtc0 through /sys/.../rtcN.
|
||||
@ -68,6 +69,7 @@ config RTC_INTF_SYSFS
|
||||
config RTC_INTF_PROC
|
||||
boolean "/proc/driver/rtc (procfs for rtcN)"
|
||||
depends on PROC_FS
|
||||
default RTC_CLASS
|
||||
help
|
||||
Say yes here if you want to use your system clock RTC through
|
||||
the proc interface, /proc/driver/rtc.
|
||||
@ -79,6 +81,7 @@ config RTC_INTF_PROC
|
||||
|
||||
config RTC_INTF_DEV
|
||||
boolean "/dev/rtcN (character devices)"
|
||||
default RTC_CLASS
|
||||
help
|
||||
Say yes here if you want to use your RTCs using the /dev
|
||||
interfaces, which "udev" sets up as /dev/rtc0 through
|
||||
|
@ -396,7 +396,7 @@ enum {
|
||||
};
|
||||
|
||||
struct sock;
|
||||
#ifdef CONFIG_MEMCG_KMEM
|
||||
#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM)
|
||||
void sock_update_memcg(struct sock *sk);
|
||||
void sock_release_memcg(struct sock *sk);
|
||||
#else
|
||||
@ -406,6 +406,6 @@ static inline void sock_update_memcg(struct sock *sk)
|
||||
static inline void sock_release_memcg(struct sock *sk)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_MEMCG_KMEM */
|
||||
#endif /* CONFIG_INET && CONFIG_MEMCG_KMEM */
|
||||
#endif /* _LINUX_MEMCONTROL_H */
|
||||
|
||||
|
@ -71,13 +71,13 @@ void set_pageblock_flags_group(struct page *page, unsigned long flags,
|
||||
#ifdef CONFIG_COMPACTION
|
||||
#define get_pageblock_skip(page) \
|
||||
get_pageblock_flags_group(page, PB_migrate_skip, \
|
||||
PB_migrate_skip + 1)
|
||||
PB_migrate_skip)
|
||||
#define clear_pageblock_skip(page) \
|
||||
set_pageblock_flags_group(page, 0, PB_migrate_skip, \
|
||||
PB_migrate_skip + 1)
|
||||
PB_migrate_skip)
|
||||
#define set_pageblock_skip(page) \
|
||||
set_pageblock_flags_group(page, 1, PB_migrate_skip, \
|
||||
PB_migrate_skip + 1)
|
||||
PB_migrate_skip)
|
||||
#endif /* CONFIG_COMPACTION */
|
||||
|
||||
#define get_pageblock_flags(page) \
|
||||
|
@ -63,7 +63,7 @@
|
||||
*
|
||||
* 0 RapidIO inbound doorbells
|
||||
* 1 RapidIO inbound mailboxes
|
||||
* 1 RapidIO outbound mailboxes
|
||||
* 2 RapidIO outbound mailboxes
|
||||
*/
|
||||
#define RIO_DOORBELL_RESOURCE 0
|
||||
#define RIO_INB_MBOX_RESOURCE 1
|
||||
@ -266,7 +266,6 @@ struct rio_mport {
|
||||
|
||||
struct rio_id_table {
|
||||
u16 start; /* logical minimal id */
|
||||
u16 next; /* hint for find */
|
||||
u32 max; /* max number of IDs in table */
|
||||
spinlock_t lock;
|
||||
unsigned long *table;
|
||||
|
@ -21,7 +21,7 @@ char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
|
||||
len = vsnprintf(NULL, 0, fmt, aq);
|
||||
va_end(aq);
|
||||
|
||||
p = kmalloc(len+1, gfp);
|
||||
p = kmalloc_track_caller(len+1, gfp);
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
|
@ -1,3 +1,2 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdbool.h>
|
||||
#include "../../../../include/linux/rbtree.h"
|
||||
|
Loading…
Reference in New Issue
Block a user