linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] net: Replace custom page based bitmap with IDA
@ 2017-02-12  2:57 Tobin C. Harding
  2017-02-12  2:57 ` [PATCH 1/2] include: Fix checkpatch whitespace error and warning Tobin C. Harding
  2017-02-12  2:57 ` [PATCH 2/2] net: Replace custom page based bitmap with IDA Tobin C. Harding
  0 siblings, 2 replies; 5+ messages in thread
From: Tobin C. Harding @ 2017-02-12  2:57 UTC (permalink / raw)
  To: David S . Miller; +Cc: mawilcox, netdev, linux-kernel, Tobin C. Harding

Current implementation of __dev_alloc_name uses a custom bitmap of
a single page to iterate network device id's and allocate an
unused id. This is seemingly the same task that the IDA does. Also the
current implementation leads to a upper limit of 8 * PAGE_SIZE on the
number of network id's (for each name format i.e eth0).

This patch uses the kernel's IDA as a replacement to the page based
bitmap. This has the effect of simplifying the code and removing
the upper limit.

Testing was carried out using a simple network device module, the
core of which is;

#define NDEVICES 32768     /* current implementation hard limit */

/* test driver */
static int tm_init_module(void)
{
	int result;
	int i;
	unsigned long before, after, diff, msec;

	pr_debug("tm: init module");

	before = jiffies;

	for (i = 0; i < NDEVICES; i++) {

		devs[i] = alloc_netdev(0, "sn%d",
				NET_NAME_UNKNOWN, tm_init);

		if (!devs[i])
			return -ENOMEM;

		result = register_netdev(devs[i]);
		if (result) {
			pr_err("tm: error %i registering device \"%s\"\n",
				result, devs[i]->name);
			tm_cleanup();
			return -ENODEV;
		}
	}

	after = jiffies;
	diff = (long)after - (long)before;
	msec = diff * 1000 / HZ;
	pr_debug("tm: Total milliseconds: %ld\n", msec);

	return 0;
}
module_init(tm_init_module);

The main objective of this patch is to simplify the code of __dev_alloc_name.
As a side effect the hard limit is also removed. Results from running the,
admittedly convoluted, test module show that the patched version is slightly slower.


Benchmarks
==========

System: core i5 Linux 4.10.0-rc7+ #18 SMP

$ qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=/home/tobin/build/imgs/qemu-image.img,index=0,media=disk,format=raw -append "root=/dev/sda console=ttyS0" --enable-kvm --nographic -m 12G


Current implementation

#define NDEVICES 30000

[  134.376741] tm: Total milliseconds: 127152

Patched version

#define NDEVICES 30000

[  226.960212] tm: Total milliseconds: 220756

#define NDEVICES 35000

[  276.590994] tm: Total milliseconds: 270620


Tobin C. Harding (2):
  include: Fix checkpatch whitespace error and warning
  net: Replace custom page based bitmap with IDA

 include/linux/idr.h |  4 ++--
 net/core/dev.c      | 20 ++++++--------------
 2 files changed, 8 insertions(+), 16 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] include: Fix checkpatch whitespace error and warning
  2017-02-12  2:57 [PATCH 0/2] net: Replace custom page based bitmap with IDA Tobin C. Harding
@ 2017-02-12  2:57 ` Tobin C. Harding
  2017-02-12 10:39   ` Sergei Shtylyov
  2017-02-12 12:17   ` Matthew Wilcox
  2017-02-12  2:57 ` [PATCH 2/2] net: Replace custom page based bitmap with IDA Tobin C. Harding
  1 sibling, 2 replies; 5+ messages in thread
From: Tobin C. Harding @ 2017-02-12  2:57 UTC (permalink / raw)
  To: David S . Miller; +Cc: mawilcox, netdev, linux-kernel, Tobin C. Harding

This patch fixes two trivial whitespace messages (ERROR/WARNING).
Fixes trailing whitespace ERROR and fixes space before tabs WARNING.

Signed-off-by: Tobin C. Harding <me@tobin.cc>
---
 include/linux/idr.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/idr.h b/include/linux/idr.h
index 3c01b89..4a8de2f 100644
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -1,6 +1,6 @@
 /*
  * include/linux/idr.h
- * 
+ *
  * 2002-10-18  written by Jim Houston jim.houston@ccur.com
  *	Copyright (C) 2002 by Concurrent Computer Corporation
  *	Distributed under the GNU GPL license version 2.
@@ -183,7 +183,7 @@ static inline void *idr_find(struct idr *idr, int id)
  */
 #define IDA_CHUNK_SIZE		128	/* 128 bytes per chunk */
 #define IDA_BITMAP_LONGS	(IDA_CHUNK_SIZE / sizeof(long) - 1)
-#define IDA_BITMAP_BITS 	(IDA_BITMAP_LONGS * sizeof(long) * 8)
+#define IDA_BITMAP_BITS         (IDA_BITMAP_LONGS * sizeof(long) * 8)
 
 struct ida_bitmap {
 	long			nr_busy;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] net: Replace custom page based bitmap with IDA
  2017-02-12  2:57 [PATCH 0/2] net: Replace custom page based bitmap with IDA Tobin C. Harding
  2017-02-12  2:57 ` [PATCH 1/2] include: Fix checkpatch whitespace error and warning Tobin C. Harding
@ 2017-02-12  2:57 ` Tobin C. Harding
  1 sibling, 0 replies; 5+ messages in thread
From: Tobin C. Harding @ 2017-02-12  2:57 UTC (permalink / raw)
  To: David S . Miller; +Cc: mawilcox, netdev, linux-kernel, Tobin C. Harding

Current implementation of __dev_alloc_name uses a custom bitmap of
a single page to iterate network device id's and allocate an unused id.
This leads to a upper limit of 8 * PAGE_SIZE network device id's (for
each name format i.e eth0).

This patch uses the kernel's IDA as a replacement to the page based
bitmap. This has the effect of simplifying the code and removing
the upper limit.

Signed-off-by: Tobin C. Harding <me@tobin.cc>
---
 net/core/dev.c | 20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 29101c9..b16ea84 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1025,39 +1025,31 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf)
 {
 	int i = 0;
 	const char *p;
-	const int max_netdevices = 8*PAGE_SIZE;
-	unsigned long *inuse;
 	struct net_device *d;
+	DEFINE_IDA(ida);
+	const int end = 0;
 
 	p = strnchr(name, IFNAMSIZ-1, '%');
 	if (p) {
-		/*
-		 * Verify the string as this thing may have come from
+		/* Verify the string as this thing may have come from
 		 * the user.  There must be either one "%d" and no other "%"
 		 * characters.
 		 */
 		if (p[1] != 'd' || strchr(p + 2, '%'))
 			return -EINVAL;
 
-		/* Use one page as a bit array of possible slots */
-		inuse = (unsigned long *) get_zeroed_page(GFP_ATOMIC);
-		if (!inuse)
-			return -ENOMEM;
-
 		for_each_netdev(net, d) {
 			if (!sscanf(d->name, name, &i))
 				continue;
-			if (i < 0 || i >= max_netdevices)
+			if (i < 0)
 				continue;
 
 			/*  avoid cases where sscanf is not exact inverse of printf */
 			snprintf(buf, IFNAMSIZ, name, i);
 			if (!strncmp(buf, d->name, IFNAMSIZ))
-				set_bit(i, inuse);
+				ida_simple_get(&ida, i, end, GFP_KERNEL);
 		}
-
-		i = find_first_zero_bit(inuse, max_netdevices);
-		free_page((unsigned long) inuse);
+		i = ida_simple_get(&ida, 0, end, GFP_KERNEL);
 	}
 
 	if (buf != name)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] include: Fix checkpatch whitespace error and warning
  2017-02-12  2:57 ` [PATCH 1/2] include: Fix checkpatch whitespace error and warning Tobin C. Harding
@ 2017-02-12 10:39   ` Sergei Shtylyov
  2017-02-12 12:17   ` Matthew Wilcox
  1 sibling, 0 replies; 5+ messages in thread
From: Sergei Shtylyov @ 2017-02-12 10:39 UTC (permalink / raw)
  To: Tobin C. Harding, David S . Miller; +Cc: mawilcox, netdev, linux-kernel

Hello!

On 2/12/2017 5:57 AM, Tobin C. Harding wrote:

> This patch fixes two trivial whitespace messages (ERROR/WARNING).
> Fixes trailing whitespace ERROR and fixes space before tabs WARNING.
>
> Signed-off-by: Tobin C. Harding <me@tobin.cc>
> ---
>  include/linux/idr.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/idr.h b/include/linux/idr.h
> index 3c01b89..4a8de2f 100644
> --- a/include/linux/idr.h
> +++ b/include/linux/idr.h
> @@ -1,6 +1,6 @@
>  /*
>   * include/linux/idr.h
> - *
> + *
>   * 2002-10-18  written by Jim Houston jim.houston@ccur.com
>   *	Copyright (C) 2002 by Concurrent Computer Corporation
>   *	Distributed under the GNU GPL license version 2.
> @@ -183,7 +183,7 @@ static inline void *idr_find(struct idr *idr, int id)
>   */
>  #define IDA_CHUNK_SIZE		128	/* 128 bytes per chunk */
>  #define IDA_BITMAP_LONGS	(IDA_CHUNK_SIZE / sizeof(long) - 1)
> -#define IDA_BITMAP_BITS 	(IDA_BITMAP_LONGS * sizeof(long) * 8)
> +#define IDA_BITMAP_BITS         (IDA_BITMAP_LONGS * sizeof(long) * 8)

    Why replace tab with spaces?!

[...]

MBR, Sergei

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH 1/2] include: Fix checkpatch whitespace error and warning
  2017-02-12  2:57 ` [PATCH 1/2] include: Fix checkpatch whitespace error and warning Tobin C. Harding
  2017-02-12 10:39   ` Sergei Shtylyov
@ 2017-02-12 12:17   ` Matthew Wilcox
  1 sibling, 0 replies; 5+ messages in thread
From: Matthew Wilcox @ 2017-02-12 12:17 UTC (permalink / raw)
  To: Tobin C. Harding, David S . Miller; +Cc: netdev, linux-kernel

Don't worry about this file; I have a complete rewrite already queued.

> -----Original Message-----
> From: Tobin C. Harding [mailto:me@tobin.cc]
> Sent: Saturday, February 11, 2017 9:58 PM
> To: David S . Miller <davem@davemloft.net>
> Cc: Matthew Wilcox <mawilcox@microsoft.com>; netdev@vger.kernel.org;
> linux-kernel@vger.kernel.org; Tobin C. Harding <me@tobin.cc>
> Subject: [PATCH 1/2] include: Fix checkpatch whitespace error and warning
> 
> This patch fixes two trivial whitespace messages (ERROR/WARNING).
> Fixes trailing whitespace ERROR and fixes space before tabs WARNING.
> 
> Signed-off-by: Tobin C. Harding <me@tobin.cc>
> ---
>  include/linux/idr.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/idr.h b/include/linux/idr.h
> index 3c01b89..4a8de2f 100644
> --- a/include/linux/idr.h
> +++ b/include/linux/idr.h
> @@ -1,6 +1,6 @@
>  /*
>   * include/linux/idr.h
> - *
> + *
>   * 2002-10-18  written by Jim Houston jim.houston@ccur.com
>   *	Copyright (C) 2002 by Concurrent Computer Corporation
>   *	Distributed under the GNU GPL license version 2.
> @@ -183,7 +183,7 @@ static inline void *idr_find(struct idr *idr, int id)
>   */
>  #define IDA_CHUNK_SIZE		128	/* 128 bytes per chunk */
>  #define IDA_BITMAP_LONGS	(IDA_CHUNK_SIZE / sizeof(long) - 1)
> -#define IDA_BITMAP_BITS 	(IDA_BITMAP_LONGS * sizeof(long) * 8)
> +#define IDA_BITMAP_BITS         (IDA_BITMAP_LONGS * sizeof(long) * 8)
> 
>  struct ida_bitmap {
>  	long			nr_busy;
> --
> 2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-02-12 12:17 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-12  2:57 [PATCH 0/2] net: Replace custom page based bitmap with IDA Tobin C. Harding
2017-02-12  2:57 ` [PATCH 1/2] include: Fix checkpatch whitespace error and warning Tobin C. Harding
2017-02-12 10:39   ` Sergei Shtylyov
2017-02-12 12:17   ` Matthew Wilcox
2017-02-12  2:57 ` [PATCH 2/2] net: Replace custom page based bitmap with IDA Tobin C. Harding

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).