* tun mq failure
@ 2013-01-23 10:05 Michael S. Tsirkin
2013-01-23 11:06 ` Hannes Frederic Sowa
0 siblings, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-01-23 10:05 UTC (permalink / raw)
To: Jason Wang; +Cc: netdev
I see this with -rc3:
[531261.470349] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
[531276.878261] openvpn: page allocation failure: order:7, mode:0x10c0d0
[531276.878270] Pid: 10421, comm: openvpn Tainted: G W
3.8.0-rc3-mst #216
[531276.878274] Call Trace:
[531276.878289] [<ffffffff8113c08b>] warn_alloc_failed+0xfb/0x180
[531276.878297] [<ffffffff8113e9a0>] ? page_alloc_cpu_notify+0x60/0x60
[531276.878303] [<ffffffff8113e9b6>] ? drain_local_pages+0x16/0x20
[531276.878312] [<ffffffff810c3823>] ? on_each_cpu_mask+0x53/0x70
[531276.878318] [<ffffffff8113f155>] __alloc_pages_nodemask+0x5a5/0x990
[531276.878329] [<ffffffff8117c2b8>] alloc_pages_current+0xe8/0x200
[531276.878334] [<ffffffff8113bf34>] __get_free_pages+0x14/0x50
[531276.878341] [<ffffffff811856bf>] kmalloc_order_trace+0x3f/0xb0
[531276.878347] [<ffffffff811888df>] __kmalloc+0x17f/0x190
[531276.878356] [<ffffffff8154e7f5>] alloc_netdev_mqs+0x155/0x300
[531276.878395] [<ffffffffa03761c0>] ? tun_chr_poll+0xf0/0xf0 [tun]
[531276.878420] [<ffffffffa037904c>] __tun_chr_ioctl+0xa6c/0x1080 [tun]
[531276.878440] [<ffffffffa0379694>] tun_chr_compat_ioctl+0x34/0x40
[tun]
[531276.878460] [<ffffffff811e8cad>] compat_sys_ioctl+0x10d/0x1520
[531276.878468] [<ffffffff81186f65>] ? kmem_cache_free+0x35/0x150
[531276.878476] [<ffffffff811a2456>] ? final_putname+0x26/0x50
[531276.878487] [<ffffffff810e51f3>] ? __audit_syscall_exit+0x1a3/0x2c0
[531276.878496] [<ffffffff8165d72c>] sysenter_dispatch+0x7/0x21
[531276.878501] Mem-Info:
[531276.878505] Node 0 DMA per-cpu:
[531276.878513] CPU 0: hi: 0, btch: 1 usd: 0
[531276.878517] CPU 1: hi: 0, btch: 1 usd: 0
[531276.878522] CPU 2: hi: 0, btch: 1 usd: 0
[531276.878526] CPU 3: hi: 0, btch: 1 usd: 0
[531276.878530] Node 0 DMA32 per-cpu:
[531276.878536] CPU 0: hi: 186, btch: 31 usd: 0
[531276.878540] CPU 1: hi: 186, btch: 31 usd: 0
[531276.878544] CPU 2: hi: 186, btch: 31 usd: 0
[531276.878549] CPU 3: hi: 186, btch: 31 usd: 0
[531276.878552] Node 0 Normal per-cpu:
[531276.878557] CPU 0: hi: 186, btch: 31 usd: 0
[531276.878561] CPU 1: hi: 186, btch: 31 usd: 0
[531276.878565] CPU 2: hi: 186, btch: 31 usd: 0
[531276.878570] CPU 3: hi: 186, btch: 31 usd: 0
[531276.878581] active_anon:295155 inactive_anon:139890 isolated_anon:0
[531276.878581] active_file:698789 inactive_file:703169 isolated_file:0
[531276.878581] unevictable:0 dirty:35015 writeback:105138 unstable:0
[531276.878581] free:39426 slab_reclaimable:76276
slab_unreclaimable:41668
[531276.878581] mapped:37045 shmem:141260 pagetables:4302 bounce:0
[531276.878581] free_cma:0
[531276.878593] Node 0 DMA free:15880kB min:128kB low:160kB high:192kB
active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB
unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15640kB
managed:15896kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB
slab_reclaimable:0kB slab_unreclaimable:16kB kernel_stack:0kB
pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB
pages_scanned:0 all_unreclaimable? yes
[531276.878609] lowmem_reserve[]: 0 3423 7933 7933
[531276.878618] Node 0 DMA32 free:81400kB min:29104kB low:36380kB
high:43656kB active_anon:214676kB inactive_anon:50704kB
active_file:1489740kB inactive_file:1496792kB unevictable:0kB
isolated(anon):0kB isolated(file):0kB present:3505444kB
managed:3465472kB mlocked:0kB dirty:61408kB writeback:132556kB
mapped:73704kB shmem:50844kB slab_reclaimable:115032kB
slab_unreclaimable:33400kB kernel_stack:112kB pagetables:1052kB
unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0
all_unreclaimable? no
[531276.878645] lowmem_reserve[]: 0 0 4510 4510
[531276.878700] Node 0 Normal free:60424kB min:38348kB low:47932kB
high:57520kB active_anon:965944kB inactive_anon:508856kB
active_file:1305416kB inactive_file:1315884kB unevictable:0kB
isolated(anon):0kB isolated(file):0kB present:4618656kB
managed:4559280kB mlocked:0kB dirty:78652kB writeback:287996kB
mapped:74476kB shmem:514196kB slab_reclaimable:190072kB
slab_unreclaimable:133256kB kernel_stack:2920kB pagetables:16156kB
unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0
all_unreclaimable? no
[531276.878721] lowmem_reserve[]: 0 0 0 0
[531276.878730] Node 0 DMA: 0*4kB 1*8kB (U) 0*16kB 0*32kB 2*64kB (U)
1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (R) 3*4096kB (M) =
15880kB
[531276.878762] Node 0 DMA32: 1464*4kB (UEMR) 1824*8kB (UEMR) 1051*16kB
(UEM) 833*32kB (EM) 252*64kB (UEM) 5*128kB (UEM) 4*256kB (E) 0*512kB
0*1024kB 0*2048kB 0*4096kB = 81712kB
[531276.878794] Node 0 Normal: 5035*4kB (UEM) 1907*8kB (UEM) 999*16kB
(UEM) 253*32kB (UEM) 8*64kB (EM) 4*128kB (EM) 1*256kB (M) 0*512kB
0*1024kB 0*2048kB 0*4096kB = 60756kB
[531276.878825] 1543233 total pagecache pages
[531276.878829] 0 pages in swap cache
[531276.878834] Swap cache stats: add 0, delete 0, find 0/0
[531276.878837] Free swap = 0kB
[531276.878841] Total swap = 0kB
[531276.899643] 2090480 pages RAM
[531276.899645] 75724 pages reserved
[531276.899646] 2248928 pages shared
[531276.899646] 974316 pages non-shared
[531276.899648] netdev: Unable to allocate 1024 tx queues
This is when trying to start a VPN using some old openvpn binary so MQ
is not set.
So
1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
memory. This is quite likely to fail.
Let's start with a small limit on number of queues, like 8?
Then we know it will succeed.
Longer term we might want to solve it differently.
--
MST
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 10:05 tun mq failure Michael S. Tsirkin
@ 2013-01-23 11:06 ` Hannes Frederic Sowa
2013-01-23 11:41 ` Michael S. Tsirkin
2013-01-23 12:08 ` Jason Wang
0 siblings, 2 replies; 8+ messages in thread
From: Hannes Frederic Sowa @ 2013-01-23 11:06 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: Jason Wang, netdev
On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
> This is when trying to start a VPN using some old openvpn binary so MQ
> is not set.
>
> So
> 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
> 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
> memory. This is quite likely to fail.
> Let's start with a small limit on number of queues, like 8?
> Then we know it will succeed.
> Longer term we might want to solve it differently.
This has been come up before:
http://thread.gmane.org/gmane.linux.network/255647/focus=255902
I think a solution to this problem is still outstanding.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 11:06 ` Hannes Frederic Sowa
@ 2013-01-23 11:41 ` Michael S. Tsirkin
2013-01-23 12:10 ` Jason Wang
2013-01-23 12:08 ` Jason Wang
1 sibling, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-01-23 11:41 UTC (permalink / raw)
To: Jason Wang, netdev
On Wed, Jan 23, 2013 at 12:06:40PM +0100, Hannes Frederic Sowa wrote:
> On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
> > This is when trying to start a VPN using some old openvpn binary so MQ
> > is not set.
> >
> > So
> > 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
> > 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
> > memory. This is quite likely to fail.
> > Let's start with a small limit on number of queues, like 8?
> > Then we know it will succeed.
> > Longer term we might want to solve it differently.
>
> This has been come up before:
> http://thread.gmane.org/gmane.linux.network/255647/focus=255902
>
> I think a solution to this problem is still outstanding.
Right. What (at least I) missed is that it's the
queue array allocation that fails here.
So I think something like the following will sort the first issue
(compiled only):
For the second, for 3.8 maybe the prudent thing to do is
to set MAX_TAP_QUEUES to a small value, like 8, to avoid
userspace relying on a large number of queues being available,
and look at a better way to do this longer term, like
using an array of pointers.
--->
tun: don't waste memory on unused queues
If MQ flag is off, we never attach more than 1 queue.
So let's not allocate memory for the unused ones.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index af372d0..813d303 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1577,6 +1577,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
else {
char *name;
unsigned long flags = 0;
+ unsigned int max_tap_queues;
if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
return -EPERM;
@@ -1599,9 +1600,13 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
if (*ifr->ifr_name)
name = ifr->ifr_name;
+ if (ifr->ifr_flags & IFF_MULTI_QUEUE)
+ max_tap_queues = MAX_TAP_QUEUES;
+ else
+ max_tap_queues = 1;
dev = alloc_netdev_mqs(sizeof(struct tun_struct), name,
tun_setup,
- MAX_TAP_QUEUES, MAX_TAP_QUEUES);
+ max_tap_queues, max_tap_queues);
if (!dev)
return -ENOMEM;
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 11:06 ` Hannes Frederic Sowa
2013-01-23 11:41 ` Michael S. Tsirkin
@ 2013-01-23 12:08 ` Jason Wang
2013-01-23 13:18 ` Michael S. Tsirkin
1 sibling, 1 reply; 8+ messages in thread
From: Jason Wang @ 2013-01-23 12:08 UTC (permalink / raw)
To: Michael S. Tsirkin, netdev
On 01/23/2013 07:06 PM, Hannes Frederic Sowa wrote:
> On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
>> This is when trying to start a VPN using some old openvpn binary so MQ
>> is not set.
>>
>> So
>> 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
>> 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
>> memory. This is quite likely to fail.
>> Let's start with a small limit on number of queues, like 8?
>> Then we know it will succeed.
>> Longer term we might want to solve it differently.
> This has been come up before:
> http://thread.gmane.org/gmane.linux.network/255647/focus=255902
>
> I think a solution to this problem is still outstanding.
>
I draft a patch in the reply of in that thread, but didn't get feedback
from reporter.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 11:41 ` Michael S. Tsirkin
@ 2013-01-23 12:10 ` Jason Wang
2013-01-23 13:18 ` Michael S. Tsirkin
0 siblings, 1 reply; 8+ messages in thread
From: Jason Wang @ 2013-01-23 12:10 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: netdev
On 01/23/2013 07:41 PM, Michael S. Tsirkin wrote:
> On Wed, Jan 23, 2013 at 12:06:40PM +0100, Hannes Frederic Sowa wrote:
>> On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
>>> This is when trying to start a VPN using some old openvpn binary so MQ
>>> is not set.
>>>
>>> So
>>> 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
>>> 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
>>> memory. This is quite likely to fail.
>>> Let's start with a small limit on number of queues, like 8?
>>> Then we know it will succeed.
>>> Longer term we might want to solve it differently.
>> This has been come up before:
>> http://thread.gmane.org/gmane.linux.network/255647/focus=255902
>>
>> I think a solution to this problem is still outstanding.
> Right. What (at least I) missed is that it's the
> queue array allocation that fails here.
> So I think something like the following will sort the first issue
> (compiled only):
>
> For the second, for 3.8 maybe the prudent thing to do is
> to set MAX_TAP_QUEUES to a small value, like 8, to avoid
> userspace relying on a large number of queues being available,
> and look at a better way to do this longer term, like
> using an array of pointers.
Sure, this is just the method I reply in that thread. Not sure 8 is the
best, but since it fit into one page, should be ok. Maybe we can use
flex array to avoid high order memory allocation in the longer term.
>
> --->
>
> tun: don't waste memory on unused queues
>
> If MQ flag is off, we never attach more than 1 queue.
> So let's not allocate memory for the unused ones.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>
> ---
>
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index af372d0..813d303 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
> @@ -1577,6 +1577,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
> else {
> char *name;
> unsigned long flags = 0;
> + unsigned int max_tap_queues;
>
> if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
> return -EPERM;
> @@ -1599,9 +1600,13 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
> if (*ifr->ifr_name)
> name = ifr->ifr_name;
>
> + if (ifr->ifr_flags & IFF_MULTI_QUEUE)
> + max_tap_queues = MAX_TAP_QUEUES;
> + else
> + max_tap_queues = 1;
> dev = alloc_netdev_mqs(sizeof(struct tun_struct), name,
> tun_setup,
> - MAX_TAP_QUEUES, MAX_TAP_QUEUES);
> + max_tap_queues, max_tap_queues);
> if (!dev)
> return -ENOMEM;
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 12:10 ` Jason Wang
@ 2013-01-23 13:18 ` Michael S. Tsirkin
0 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-01-23 13:18 UTC (permalink / raw)
To: Jason Wang; +Cc: netdev
On Wed, Jan 23, 2013 at 08:10:35PM +0800, Jason Wang wrote:
> On 01/23/2013 07:41 PM, Michael S. Tsirkin wrote:
> > On Wed, Jan 23, 2013 at 12:06:40PM +0100, Hannes Frederic Sowa wrote:
> >> On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
> >>> This is when trying to start a VPN using some old openvpn binary so MQ
> >>> is not set.
> >>>
> >>> So
> >>> 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
> >>> 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
> >>> memory. This is quite likely to fail.
> >>> Let's start with a small limit on number of queues, like 8?
> >>> Then we know it will succeed.
> >>> Longer term we might want to solve it differently.
> >> This has been come up before:
> >> http://thread.gmane.org/gmane.linux.network/255647/focus=255902
> >>
> >> I think a solution to this problem is still outstanding.
> > Right. What (at least I) missed is that it's the
> > queue array allocation that fails here.
> > So I think something like the following will sort the first issue
> > (compiled only):
> >
> > For the second, for 3.8 maybe the prudent thing to do is
> > to set MAX_TAP_QUEUES to a small value, like 8, to avoid
> > userspace relying on a large number of queues being available,
> > and look at a better way to do this longer term, like
> > using an array of pointers.
>
> Sure, this is just the method I reply in that thread. Not sure 8 is the
> best, but since it fit into one page, should be ok. Maybe we can use
> flex array to avoid high order memory allocation in the longer term.
Right so let's for now use DEFAULT_MAX_NUM_RSS_QUEUES as Eric suggested.
> >
> > --->
> >
> > tun: don't waste memory on unused queues
> >
> > If MQ flag is off, we never attach more than 1 queue.
> > So let's not allocate memory for the unused ones.
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> >
> > ---
> >
> > diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> > index af372d0..813d303 100644
> > --- a/drivers/net/tun.c
> > +++ b/drivers/net/tun.c
> > @@ -1577,6 +1577,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
> > else {
> > char *name;
> > unsigned long flags = 0;
> > + unsigned int max_tap_queues;
> >
> > if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
> > return -EPERM;
> > @@ -1599,9 +1600,13 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
> > if (*ifr->ifr_name)
> > name = ifr->ifr_name;
> >
> > + if (ifr->ifr_flags & IFF_MULTI_QUEUE)
> > + max_tap_queues = MAX_TAP_QUEUES;
> > + else
> > + max_tap_queues = 1;
> > dev = alloc_netdev_mqs(sizeof(struct tun_struct), name,
> > tun_setup,
> > - MAX_TAP_QUEUES, MAX_TAP_QUEUES);
> > + max_tap_queues, max_tap_queues);
> > if (!dev)
> > return -ENOMEM;
> >
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 12:08 ` Jason Wang
@ 2013-01-23 13:18 ` Michael S. Tsirkin
2013-01-23 13:20 ` Jason Wang
0 siblings, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-01-23 13:18 UTC (permalink / raw)
To: Jason Wang; +Cc: netdev
On Wed, Jan 23, 2013 at 08:08:07PM +0800, Jason Wang wrote:
> On 01/23/2013 07:06 PM, Hannes Frederic Sowa wrote:
> > On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
> >> This is when trying to start a VPN using some old openvpn binary so MQ
> >> is not set.
> >>
> >> So
> >> 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
> >> 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
> >> memory. This is quite likely to fail.
> >> Let's start with a small limit on number of queues, like 8?
> >> Then we know it will succeed.
> >> Longer term we might want to solve it differently.
> > This has been come up before:
> > http://thread.gmane.org/gmane.linux.network/255647/focus=255902
> >
> > I think a solution to this problem is still outstanding.
> >
> I draft a patch in the reply of in that thread, but didn't get feedback
> from reporter.
Yes it's essentialy same.
So can you please submit an official patch with proper
subject commit log and signature?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: tun mq failure
2013-01-23 13:18 ` Michael S. Tsirkin
@ 2013-01-23 13:20 ` Jason Wang
0 siblings, 0 replies; 8+ messages in thread
From: Jason Wang @ 2013-01-23 13:20 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: netdev
On 01/23/2013 09:18 PM, Michael S. Tsirkin wrote:
> On Wed, Jan 23, 2013 at 08:08:07PM +0800, Jason Wang wrote:
>> On 01/23/2013 07:06 PM, Hannes Frederic Sowa wrote:
>>> On Wed, Jan 23, 2013 at 12:05:16PM +0200, Michael S. Tsirkin wrote:
>>>> This is when trying to start a VPN using some old openvpn binary so MQ
>>>> is not set.
>>>>
>>>> So
>>>> 1. I think we should limit allocation of MQ to when MQ flag is set in SETIFF.
>>>> 2. order 7 allocation is 2^^7 pages - about half a megabyte of contigious
>>>> memory. This is quite likely to fail.
>>>> Let's start with a small limit on number of queues, like 8?
>>>> Then we know it will succeed.
>>>> Longer term we might want to solve it differently.
>>> This has been come up before:
>>> http://thread.gmane.org/gmane.linux.network/255647/focus=255902
>>>
>>> I think a solution to this problem is still outstanding.
>>>
>> I draft a patch in the reply of in that thread, but didn't get feedback
>> from reporter.
> Yes it's essentialy same.
> So can you please submit an official patch with proper
> subject commit log and signature?
Ok, will post the patch soon.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-01-23 13:38 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-23 10:05 tun mq failure Michael S. Tsirkin
2013-01-23 11:06 ` Hannes Frederic Sowa
2013-01-23 11:41 ` Michael S. Tsirkin
2013-01-23 12:10 ` Jason Wang
2013-01-23 13:18 ` Michael S. Tsirkin
2013-01-23 12:08 ` Jason Wang
2013-01-23 13:18 ` Michael S. Tsirkin
2013-01-23 13:20 ` Jason Wang
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).