Commit 14ffe009 authored by Linus Torvalds's avatar Linus Torvalds

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
parents ce40be7a ec073619
...@@ -77,8 +77,9 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz ...@@ -77,8 +77,9 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz
{ {
unsigned long start, start_pfn; unsigned long start, start_pfn;
struct zone *zone; struct zone *zone;
int i, ret; int ret;
int sections_to_remove; unsigned long section;
unsigned long sections_to_remove;
start_pfn = base >> PAGE_SHIFT; start_pfn = base >> PAGE_SHIFT;
...@@ -99,9 +100,9 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz ...@@ -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. * while writing to it. So we have to defer it to here.
*/ */
sections_to_remove = (memblock_size >> PAGE_SHIFT) / PAGES_PER_SECTION; sections_to_remove = (memblock_size >> PAGE_SHIFT) / PAGES_PER_SECTION;
for (i = 0; i < sections_to_remove; i++) { for (section = 0; section < sections_to_remove; section++) {
unsigned long pfn = start_pfn + i * PAGES_PER_SECTION; unsigned long pfn = start_pfn + section * PAGES_PER_SECTION;
ret = __remove_pages(zone, start_pfn, PAGES_PER_SECTION); ret = __remove_pages(zone, pfn, PAGES_PER_SECTION);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -55,9 +55,9 @@ static int rio_mport_phys_table[] = { ...@@ -55,9 +55,9 @@ static int rio_mport_phys_table[] = {
}; };
/* /**
* rio_destid_alloc - Allocate next available destID for given network * 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. * Returns next available device destination ID for the specified RIO network.
* Marks allocated ID as one in use. * Marks allocated ID as one in use.
...@@ -69,14 +69,9 @@ static u16 rio_destid_alloc(struct rio_net *net) ...@@ -69,14 +69,9 @@ static u16 rio_destid_alloc(struct rio_net *net)
struct rio_id_table *idtab = &net->destid_table; struct rio_id_table *idtab = &net->destid_table;
spin_lock(&idtab->lock); 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) { if (destid < idtab->max) {
idtab->next = destid + 1;
if (idtab->next >= idtab->max)
idtab->next = 0;
set_bit(destid, idtab->table); set_bit(destid, idtab->table);
destid += idtab->start; destid += idtab->start;
} else } else
...@@ -86,10 +81,10 @@ static u16 rio_destid_alloc(struct rio_net *net) ...@@ -86,10 +81,10 @@ static u16 rio_destid_alloc(struct rio_net *net)
return (u16)destid; return (u16)destid;
} }
/* /**
* rio_destid_reserve - Reserve the specivied destID * rio_destid_reserve - Reserve the specivied destID
* net: RIO network * @net: RIO network
* destid: destID to reserve * @destid: destID to reserve
* *
* Tries to reserve the specified destID. * Tries to reserve the specified destID.
* Returns 0 if successfull. * Returns 0 if successfull.
...@@ -106,10 +101,10 @@ static int rio_destid_reserve(struct rio_net *net, u16 destid) ...@@ -106,10 +101,10 @@ static int rio_destid_reserve(struct rio_net *net, u16 destid)
return oldbit; return oldbit;
} }
/* /**
* rio_destid_free - free a previously allocated destID * rio_destid_free - free a previously allocated destID
* net: RIO network * @net: RIO network
* destid: destID to free * @destid: destID to free
* *
* Makes the specified destID available for use. * Makes the specified destID available for use.
*/ */
...@@ -123,9 +118,9 @@ static void rio_destid_free(struct rio_net *net, u16 destid) ...@@ -123,9 +118,9 @@ static void rio_destid_free(struct rio_net *net, u16 destid)
spin_unlock(&idtab->lock); spin_unlock(&idtab->lock);
} }
/* /**
* rio_destid_first - return first destID in use * rio_destid_first - return first destID in use
* net: RIO network * @net: RIO network
*/ */
static u16 rio_destid_first(struct rio_net *net) static u16 rio_destid_first(struct rio_net *net)
{ {
...@@ -142,10 +137,10 @@ 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; return (u16)destid;
} }
/* /**
* rio_destid_next - return next destID in use * rio_destid_next - return next destID in use
* net: RIO network * @net: RIO network
* from: destination ID from which search shall continue * @from: destination ID from which search shall continue
*/ */
static u16 rio_destid_next(struct rio_net *net, u16 from) 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, ...@@ -1163,8 +1158,8 @@ static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port,
net = kzalloc(sizeof(struct rio_net), GFP_KERNEL); net = kzalloc(sizeof(struct rio_net), GFP_KERNEL);
if (net && do_enum) { if (net && do_enum) {
net->destid_table.table = kzalloc( net->destid_table.table = kcalloc(
BITS_TO_LONGS(RIO_MAX_ROUTE_ENTRIES(port->sys_size)) * BITS_TO_LONGS(RIO_MAX_ROUTE_ENTRIES(port->sys_size)),
sizeof(long), sizeof(long),
GFP_KERNEL); GFP_KERNEL);
...@@ -1174,7 +1169,6 @@ static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port, ...@@ -1174,7 +1169,6 @@ static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port,
net = NULL; net = NULL;
} else { } else {
net->destid_table.start = start; net->destid_table.start = start;
net->destid_table.next = 0;
net->destid_table.max = net->destid_table.max =
RIO_MAX_ROUTE_ENTRIES(port->sys_size); RIO_MAX_ROUTE_ENTRIES(port->sys_size);
spin_lock_init(&net->destid_table.lock); spin_lock_init(&net->destid_table.lock);
...@@ -1391,7 +1385,7 @@ int __devinit rio_disc_mport(struct rio_mport *mport) ...@@ -1391,7 +1385,7 @@ int __devinit rio_disc_mport(struct rio_mport *mport)
while (time_before(jiffies, to_end)) { while (time_before(jiffies, to_end)) {
if (rio_enum_complete(mport)) if (rio_enum_complete(mport))
goto enum_done; goto enum_done;
schedule_timeout_uninterruptible(msecs_to_jiffies(10)); msleep(10);
} }
pr_debug("RIO: discovery timeout on mport %d %s\n", pr_debug("RIO: discovery timeout on mport %d %s\n",
......
...@@ -1275,49 +1275,68 @@ static void __devinit disc_work_handler(struct work_struct *_work) ...@@ -1275,49 +1275,68 @@ static void __devinit disc_work_handler(struct work_struct *_work)
pr_debug("RIO: discovery work for mport %d %s\n", pr_debug("RIO: discovery work for mport %d %s\n",
work->mport->id, work->mport->name); work->mport->id, work->mport->name);
rio_disc_mport(work->mport); rio_disc_mport(work->mport);
kfree(work);
} }
int __devinit rio_init_mports(void) int __devinit rio_init_mports(void)
{ {
struct rio_mport *port; struct rio_mport *port;
struct rio_disc_work *work; 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) { list_for_each_entry(port, &rio_mports, node) {
if (port->host_deviceid >= 0) if (port->host_deviceid >= 0)
rio_enum_mport(port); rio_enum_mport(port);
else if (!no_disc) { else
if (!rio_wq) { n++;
}
if (!n)
goto no_disc;
/*
* 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); rio_wq = alloc_workqueue("riodisc", 0, 0);
if (!rio_wq) { if (!rio_wq) {
pr_err("RIO: unable allocate rio_wq\n"); pr_err("RIO: unable allocate rio_wq\n");
no_disc = 1; goto no_disc;
continue;
}
} }
work = kzalloc(sizeof *work, GFP_KERNEL); work = kcalloc(n, sizeof *work, GFP_KERNEL);
if (!work) { if (!work) {
pr_err("RIO: no memory for work struct\n"); pr_err("RIO: no memory for work struct\n");
no_disc = 1; destroy_workqueue(rio_wq);
continue; goto no_disc;
} }
work->mport = port; n = 0;
INIT_WORK(&work->work, disc_work_handler); list_for_each_entry(port, &rio_mports, node) {
queue_work(rio_wq, &work->work); 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); flush_workqueue(rio_wq);
pr_debug("RIO: flush discovery workqueue finished\n"); pr_debug("RIO: destroy discovery workqueue\n");
destroy_workqueue(rio_wq); destroy_workqueue(rio_wq);
} kfree(work);
no_disc:
rio_init(); rio_init();
return 0; return 0;
......
...@@ -59,6 +59,7 @@ comment "RTC interfaces" ...@@ -59,6 +59,7 @@ comment "RTC interfaces"
config RTC_INTF_SYSFS config RTC_INTF_SYSFS
boolean "/sys/class/rtc/rtcN (sysfs)" boolean "/sys/class/rtc/rtcN (sysfs)"
depends on SYSFS depends on SYSFS
default RTC_CLASS
help help
Say yes here if you want to use your RTCs using sysfs interfaces, Say yes here if you want to use your RTCs using sysfs interfaces,
/sys/class/rtc/rtc0 through /sys/.../rtcN. /sys/class/rtc/rtc0 through /sys/.../rtcN.
...@@ -68,6 +69,7 @@ config RTC_INTF_SYSFS ...@@ -68,6 +69,7 @@ config RTC_INTF_SYSFS
config RTC_INTF_PROC config RTC_INTF_PROC
boolean "/proc/driver/rtc (procfs for rtcN)" boolean "/proc/driver/rtc (procfs for rtcN)"
depends on PROC_FS depends on PROC_FS
default RTC_CLASS
help help
Say yes here if you want to use your system clock RTC through Say yes here if you want to use your system clock RTC through
the proc interface, /proc/driver/rtc. the proc interface, /proc/driver/rtc.
...@@ -79,6 +81,7 @@ config RTC_INTF_PROC ...@@ -79,6 +81,7 @@ config RTC_INTF_PROC
config RTC_INTF_DEV config RTC_INTF_DEV
boolean "/dev/rtcN (character devices)" boolean "/dev/rtcN (character devices)"
default RTC_CLASS
help help
Say yes here if you want to use your RTCs using the /dev Say yes here if you want to use your RTCs using the /dev
interfaces, which "udev" sets up as /dev/rtc0 through interfaces, which "udev" sets up as /dev/rtc0 through
......
...@@ -396,7 +396,7 @@ enum { ...@@ -396,7 +396,7 @@ enum {
}; };
struct sock; struct sock;
#ifdef CONFIG_MEMCG_KMEM #if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM)
void sock_update_memcg(struct sock *sk); void sock_update_memcg(struct sock *sk);
void sock_release_memcg(struct sock *sk); void sock_release_memcg(struct sock *sk);
#else #else
...@@ -406,6 +406,6 @@ static inline void sock_update_memcg(struct sock *sk) ...@@ -406,6 +406,6 @@ static inline void sock_update_memcg(struct sock *sk)
static inline void sock_release_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 */ #endif /* _LINUX_MEMCONTROL_H */
...@@ -71,13 +71,13 @@ void set_pageblock_flags_group(struct page *page, unsigned long flags, ...@@ -71,13 +71,13 @@ void set_pageblock_flags_group(struct page *page, unsigned long flags,
#ifdef CONFIG_COMPACTION #ifdef CONFIG_COMPACTION
#define get_pageblock_skip(page) \ #define get_pageblock_skip(page) \
get_pageblock_flags_group(page, PB_migrate_skip, \ get_pageblock_flags_group(page, PB_migrate_skip, \
PB_migrate_skip + 1) PB_migrate_skip)
#define clear_pageblock_skip(page) \ #define clear_pageblock_skip(page) \
set_pageblock_flags_group(page, 0, PB_migrate_skip, \ set_pageblock_flags_group(page, 0, PB_migrate_skip, \
PB_migrate_skip + 1) PB_migrate_skip)
#define set_pageblock_skip(page) \ #define set_pageblock_skip(page) \
set_pageblock_flags_group(page, 1, PB_migrate_skip, \ set_pageblock_flags_group(page, 1, PB_migrate_skip, \
PB_migrate_skip + 1) PB_migrate_skip)
#endif /* CONFIG_COMPACTION */ #endif /* CONFIG_COMPACTION */
#define get_pageblock_flags(page) \ #define get_pageblock_flags(page) \
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
* *
* 0 RapidIO inbound doorbells * 0 RapidIO inbound doorbells
* 1 RapidIO inbound mailboxes * 1 RapidIO inbound mailboxes
* 1 RapidIO outbound mailboxes * 2 RapidIO outbound mailboxes
*/ */
#define RIO_DOORBELL_RESOURCE 0 #define RIO_DOORBELL_RESOURCE 0
#define RIO_INB_MBOX_RESOURCE 1 #define RIO_INB_MBOX_RESOURCE 1
...@@ -266,7 +266,6 @@ struct rio_mport { ...@@ -266,7 +266,6 @@ struct rio_mport {
struct rio_id_table { struct rio_id_table {
u16 start; /* logical minimal id */ u16 start; /* logical minimal id */
u16 next; /* hint for find */
u32 max; /* max number of IDs in table */ u32 max; /* max number of IDs in table */
spinlock_t lock; spinlock_t lock;
unsigned long *table; unsigned long *table;
......
...@@ -21,7 +21,7 @@ char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap) ...@@ -21,7 +21,7 @@ char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
len = vsnprintf(NULL, 0, fmt, aq); len = vsnprintf(NULL, 0, fmt, aq);
va_end(aq); va_end(aq);
p = kmalloc(len+1, gfp); p = kmalloc_track_caller(len+1, gfp);
if (!p) if (!p)
return NULL; return NULL;
......
#include <stdbool.h> #include <stdbool.h>
#include <stdbool.h>
#include "../../../../include/linux/rbtree.h" #include "../../../../include/linux/rbtree.h"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment