* [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).