Browse Source

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
Linus Torvalds 13 years ago
parent
commit
14ffe009ca

+ 6 - 5
arch/powerpc/platforms/pseries/hotplug-memory.c

@@ -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 sections_to_remove;
+	int ret;
+	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
 	 * 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++) {
-		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)
 		if (ret)
 			return ret;
 			return ret;
 	}
 	}

+ 17 - 23
drivers/rapidio/rio-scan.c

@@ -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)
 	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)
 	return (u16)destid;
 	return (u16)destid;
 }
 }
 
 
-/*
+/**
  * rio_destid_reserve - Reserve the specivied 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.
  * 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)
 	return oldbit;
 	return oldbit;
 }
 }
 
 
-/*
+/**
  * rio_destid_free - free a previously allocated destID
  * 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.
  * 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);
 	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)
 	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
- * 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)
 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);
 	net = kzalloc(sizeof(struct rio_net), GFP_KERNEL);
 	if (net && do_enum) {
 	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),
 			sizeof(long),
 			GFP_KERNEL);
 			GFP_KERNEL);
 
 
@@ -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)
 		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",

+ 47 - 28
drivers/rapidio/rio.c

@@ -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) {
-			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;
-				}
-			}
-
-			work = kzalloc(sizeof *work, GFP_KERNEL);
-			if (!work) {
-				pr_err("RIO: no memory for work struct\n");
-				no_disc = 1;
-				continue;
-			}
-
-			work->mport = port;
-			INIT_WORK(&work->work, disc_work_handler);
-			queue_work(rio_wq, &work->work);
-		}
+		else
+			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);
+	if (!rio_wq) {
+		pr_err("RIO: unable allocate rio_wq\n");
+		goto no_disc;
 	}
 	}
 
 
-	if (rio_wq) {
-		pr_debug("RIO: flush discovery workqueue\n");
-		flush_workqueue(rio_wq);
-		pr_debug("RIO: flush discovery workqueue finished\n");
+	work = kcalloc(n, sizeof *work, GFP_KERNEL);
+	if (!work) {
+		pr_err("RIO: no memory for work struct\n");
 		destroy_workqueue(rio_wq);
 		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++;
+		}
+	}
+
+	flush_workqueue(rio_wq);
+	pr_debug("RIO: destroy discovery workqueue\n");
+	destroy_workqueue(rio_wq);
+	kfree(work);
+
+no_disc:
 	rio_init();
 	rio_init();
 
 
 	return 0;
 	return 0;

+ 3 - 0
drivers/rtc/Kconfig

@@ -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
 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
 
 
 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

+ 2 - 2
include/linux/memcontrol.h

@@ -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)
 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 */
 
 

+ 3 - 3
include/linux/pageblock-flags.h

@@ -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) \

+ 1 - 2
include/linux/rio.h

@@ -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 {
 
 
 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;

+ 1 - 1
lib/kasprintf.c

@@ -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;
 
 

+ 0 - 1
tools/perf/util/include/linux/rbtree.h

@@ -1,3 +1,2 @@
 #include <stdbool.h>
 #include <stdbool.h>
-#include <stdbool.h>
 #include "../../../../include/linux/rbtree.h"
 #include "../../../../include/linux/rbtree.h"