Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1283024 > unrolled thread
| Started by | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| First post | 2015-12-03 14:00 +0100 |
| Last post | 2015-12-06 04:50 +0100 |
| Articles | 18 — 6 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
rhashtable: ENOMEM errors when hit with a flood of insertions Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-03 14:00 +0100
RE: rhashtable: ENOMEM errors when hit with a flood of insertions David Laight <David.Laight@ACULAB.COM> - 2015-12-03 16:20 +0100
Re: rhashtable: ENOMEM errors when hit with a flood of insertions Eric Dumazet <eric.dumazet@gmail.com> - 2015-12-03 17:10 +0100
Re: rhashtable: ENOMEM errors when hit with a flood of insertions Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-04 01:10 +0100
rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-04 15:50 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Eric Dumazet <eric.dumazet@gmail.com> - 2015-12-04 18:50 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Phil Sutter <phil@nwl.cc> - 2015-12-04 19:20 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-05 08:10 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Thomas Graf <tgraf@suug.ch> - 2015-12-07 16:40 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation David Miller <davem@davemloft.net> - 2015-12-07 20:40 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Thomas Graf <tgraf@suug.ch> - 2015-12-09 03:20 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-09 03:30 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-09 03:40 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Thomas Graf <tgraf@suug.ch> - 2015-12-09 03:50 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Thomas Graf <tgraf@suug.ch> - 2015-12-09 03:40 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation David Miller <davem@davemloft.net> - 2015-12-04 23:00 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation Herbert Xu <herbert@gondor.apana.org.au> - 2015-12-05 08:10 +0100
Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation David Miller <davem@davemloft.net> - 2015-12-06 04:50 +0100
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-03 14:00 +0100 |
| Subject | rhashtable: ENOMEM errors when hit with a flood of insertions |
| Message-ID | <qBBEn-58q-15@gated-at.bofh.it> |
On Mon, Nov 30, 2015 at 06:18:59PM +0800, Herbert Xu wrote: > > OK that's better. I think I see the problem. The test in > rhashtable_insert_rehash is racy and if two threads both try > to grow the table one of them may be tricked into doing a rehash > instead. > > I'm working on a fix. While the EBUSY errors are gone for me, I can still see plenty of ENOMEM errors. In fact it turns out that the reason is quite understandable. When you pound the rhashtable hard so that it doesn't actually get a chance to grow the table in process context, then the table will only grow with GFP_ATOMIC allocations. For me this starts failing regularly at around 2^19 entries, which requires about 1024 contiguous pages if I'm not mistaken. I've got fairly straightforward solution for this, but it does mean that we have to add another level of complexity to the rhashtable implementation. So before I go there I want to be absolutely sure that we need it. I guess the question is do we care about users that pound rhashtable in this fashion? My answer would be yes but I'd like to hear your opinions. My solution is to use a slightly more complex/less efficient hash table when we fail the allocation in interrupt context. Instead of allocating contiguous pages, we'll simply switch to allocating individual pages and have a master page that points to them. On a 64-bit platform, each page can accomodate 512 entries. So with a two-level deep setup (meaning one extra access for a hash lookup), this would accomodate 2^18 entries. Three levels (two extra lookups) will give us 2^27 entries, which should be enough. When we do this we should of course schedule an async rehash so that as soon as we get a chance we can move the entries into a normal hash table that needs only a single lookup. Cheers, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | David Laight <David.Laight@ACULAB.COM> |
|---|---|
| Date | 2015-12-03 16:20 +0100 |
| Message-ID | <qBDPQ-6Rh-25@gated-at.bofh.it> |
| In reply to | #1283024 |
From: Herbert Xu > Sent: 03 December 2015 12:51 > On Mon, Nov 30, 2015 at 06:18:59PM +0800, Herbert Xu wrote: > > > > OK that's better. I think I see the problem. The test in > > rhashtable_insert_rehash is racy and if two threads both try > > to grow the table one of them may be tricked into doing a rehash > > instead. > > > > I'm working on a fix. > > While the EBUSY errors are gone for me, I can still see plenty > of ENOMEM errors. In fact it turns out that the reason is quite > understandable. When you pound the rhashtable hard so that it > doesn't actually get a chance to grow the table in process context, > then the table will only grow with GFP_ATOMIC allocations. > > For me this starts failing regularly at around 2^19 entries, which > requires about 1024 contiguous pages if I'm not mistaken. ISTM that you should always let the insert succeed - even if it makes the average/maximum chain length increase beyond some limit. Any limit on the number of hashed items should have been done earlier by the calling code. The slight performance decrease caused by scanning longer chains is almost certainly more 'user friendly' than an error return. Hoping to get 1024+ contiguous VA pages does seem over-optimistic. With a 2-level lookup you could make all the 2nd level tables a fixed size (maybe 4 or 8 pages?) and extend the first level table as needed. David -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Eric Dumazet <eric.dumazet@gmail.com> |
|---|---|
| Date | 2015-12-03 17:10 +0100 |
| Message-ID | <qBECe-7oz-17@gated-at.bofh.it> |
| In reply to | #1283024 |
On Thu, 2015-12-03 at 20:51 +0800, Herbert Xu wrote: > On Mon, Nov 30, 2015 at 06:18:59PM +0800, Herbert Xu wrote: > > > > OK that's better. I think I see the problem. The test in > > rhashtable_insert_rehash is racy and if two threads both try > > to grow the table one of them may be tricked into doing a rehash > > instead. > > > > I'm working on a fix. > > While the EBUSY errors are gone for me, I can still see plenty > of ENOMEM errors. In fact it turns out that the reason is quite > understandable. When you pound the rhashtable hard so that it > doesn't actually get a chance to grow the table in process context, > then the table will only grow with GFP_ATOMIC allocations. > > For me this starts failing regularly at around 2^19 entries, which > requires about 1024 contiguous pages if I'm not mistaken. Well, it will fail before this point if memory is fragmented. Anyway, __vmalloc() can be used with GFP_ATOMIC, have you tried this ? diff --git a/lib/rhashtable.c b/lib/rhashtable.c index a54ff8949f91..9ef5d74963b2 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c @@ -120,8 +120,9 @@ static struct bucket_table *bucket_table_alloc(struct rhashtable *ht, if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER) || gfp != GFP_KERNEL) tbl = kzalloc(size, gfp | __GFP_NOWARN | __GFP_NORETRY); - if (tbl == NULL && gfp == GFP_KERNEL) - tbl = vzalloc(size); + if (tbl == NULL) + tbl = __vmalloc(size, gfp | __GFP_HIGHMEM | __GFP_ZERO, + PAGE_KERNEL); if (tbl == NULL) return NULL; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-04 01:10 +0100 |
| Message-ID | <qBM6K-3He-5@gated-at.bofh.it> |
| In reply to | #1283159 |
On Thu, Dec 03, 2015 at 08:08:39AM -0800, Eric Dumazet wrote: > > Well, it will fail before this point if memory is fragmented. Indeed, I was surprised that it even worked up to that point, possibly because the previous resizes might have actually been done in process context. > Anyway, __vmalloc() can be used with GFP_ATOMIC, have you tried this ? Ah I didn't know that. That would be much simpler. I'll give it a try. Thanks Eric! -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-04 15:50 +0100 |
| Subject | rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qBZQm-3Yo-27@gated-at.bofh.it> |
| In reply to | #1283159 |
On Thu, Dec 03, 2015 at 08:08:39AM -0800, Eric Dumazet wrote: > > Anyway, __vmalloc() can be used with GFP_ATOMIC, have you tried this ? OK I've tried it and I no longer get any ENOMEM errors! ---8<--- When an rhashtable user pounds rhashtable hard with back-to-back insertions we may end up growing the table in GFP_ATOMIC context. Unfortunately when the table reaches a certain size this often fails because we don't have enough physically contiguous pages to hold the new table. Eric Dumazet suggested (and in fact wrote this patch) using __vmalloc instead which can be used in GFP_ATOMIC context. Reported-by: Phil Sutter <phil@nwl.cc> Suggested-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> diff --git a/lib/rhashtable.c b/lib/rhashtable.c index a54ff89..1c624db 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c @@ -120,8 +120,9 @@ static struct bucket_table *bucket_table_alloc(struct rhashtable *ht, if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER) || gfp != GFP_KERNEL) tbl = kzalloc(size, gfp | __GFP_NOWARN | __GFP_NORETRY); - if (tbl == NULL && gfp == GFP_KERNEL) - tbl = vzalloc(size); + if (tbl == NULL) + tbl = __vmalloc(size, gfp | __GFP_HIGHMEM | __GFP_ZERO, + PAGE_KERNEL); if (tbl == NULL) return NULL; -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Eric Dumazet <eric.dumazet@gmail.com> |
|---|---|
| Date | 2015-12-04 18:50 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qC2Ez-5Oo-55@gated-at.bofh.it> |
| In reply to | #1283881 |
On Fri, 2015-12-04 at 18:01 +0100, Phil Sutter wrote: > On Fri, Dec 04, 2015 at 10:39:56PM +0800, Herbert Xu wrote: > > On Thu, Dec 03, 2015 at 08:08:39AM -0800, Eric Dumazet wrote: > > > > > > Anyway, __vmalloc() can be used with GFP_ATOMIC, have you tried this ? > > > > OK I've tried it and I no longer get any ENOMEM errors! > > I can't confirm this, sadly. Using 50 threads, results seem to be stable > and good. But increasing the number of threads I can provoke ENOMEM > condition again. See attached log which shows a failing test run with > 100 threads. > > I tried to extract logs of a test run with as few as possible failing > threads, but wasn't successful. It seems like the error amplifies > itself: While having stable success with less than 70 threads, going > beyond a margin I could not identify exactly, much more threads failed > than expected. For instance, the attached log shows 70 out of 100 > threads failing, while for me every single test with 50 threads was > successful. > > HTH, Phil But this patch is about GFP_ATOMIC allocations, I doubt your test is using GFP_ATOMIC. Threads (process context) should use GFP_KERNEL allocations. BTW, if 100 threads are simultaneously trying to vmalloc(32 MB), this might not be very wise :( Only one should really do this, while others are waiting. If we really want parallelism (multiple cpus coordinating their effort), it should be done very differently. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Phil Sutter <phil@nwl.cc> |
|---|---|
| Date | 2015-12-04 19:20 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qC37B-6ec-23@gated-at.bofh.it> |
| In reply to | #1284119 |
On Fri, Dec 04, 2015 at 09:45:20AM -0800, Eric Dumazet wrote: > On Fri, 2015-12-04 at 18:01 +0100, Phil Sutter wrote: > > On Fri, Dec 04, 2015 at 10:39:56PM +0800, Herbert Xu wrote: > > > On Thu, Dec 03, 2015 at 08:08:39AM -0800, Eric Dumazet wrote: > > > > > > > > Anyway, __vmalloc() can be used with GFP_ATOMIC, have you tried this ? > > > > > > OK I've tried it and I no longer get any ENOMEM errors! > > > > I can't confirm this, sadly. Using 50 threads, results seem to be stable > > and good. But increasing the number of threads I can provoke ENOMEM > > condition again. See attached log which shows a failing test run with > > 100 threads. > > > > I tried to extract logs of a test run with as few as possible failing > > threads, but wasn't successful. It seems like the error amplifies > > itself: While having stable success with less than 70 threads, going > > beyond a margin I could not identify exactly, much more threads failed > > than expected. For instance, the attached log shows 70 out of 100 > > threads failing, while for me every single test with 50 threads was > > successful. > > But this patch is about GFP_ATOMIC allocations, I doubt your test is > using GFP_ATOMIC. > > Threads (process context) should use GFP_KERNEL allocations. Well, I assumed Herbert did his tests using test_rhashtable, and therefore fixed whatever code-path that triggers. Maybe I'm wrong, though. Looking at the vmalloc allocation failure trace, it seems like it's trying to indeed use GFP_ATOMIC from inside those threads: If I don't miss anything, bucket_table_alloc is called from rhashtable_insert_rehash, which passes GFP_ATOMIC unconditionally. But then again bucket_table_alloc should use kzalloc if 'gfp != GFP_KERNEL', so I'm probably just cross-eyed right now. > BTW, if 100 threads are simultaneously trying to vmalloc(32 MB), this > might not be very wise :( > > Only one should really do this, while others are waiting. Sure, that was my previous understanding of how this thing works. > If we really want parallelism (multiple cpus coordinating their effort), > it should be done very differently. Maybe my approach of stress-testing rhashtable was too naive in the first place. Thanks, Phil -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-05 08:10 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qCf8K-5AQ-3@gated-at.bofh.it> |
| In reply to | #1284139 |
On Fri, Dec 04, 2015 at 07:15:55PM +0100, Phil Sutter wrote: > > > Only one should really do this, while others are waiting. > > Sure, that was my previous understanding of how this thing works. Yes that's clearly how it should be. Unfortunately while adding the locking to do this, I found out that you can't actually call __vmalloc with BH disabled so this is a no-go. Unless we can make __vmalloc work with BH disabled, I guess we'll have to go back to multi-level lookups unless someone has a better suggestion. Cheers, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Thomas Graf <tgraf@suug.ch> |
|---|---|
| Date | 2015-12-07 16:40 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qD63o-6mE-13@gated-at.bofh.it> |
| In reply to | #1284471 |
On 12/05/15 at 03:06pm, Herbert Xu wrote: > On Fri, Dec 04, 2015 at 07:15:55PM +0100, Phil Sutter wrote: > > > > > Only one should really do this, while others are waiting. > > > > Sure, that was my previous understanding of how this thing works. > > Yes that's clearly how it should be. Unfortunately while adding > the locking to do this, I found out that you can't actually call > __vmalloc with BH disabled so this is a no-go. > > Unless we can make __vmalloc work with BH disabled, I guess we'll > have to go back to multi-level lookups unless someone has a better > suggestion. Thanks for fixing the race. As for the remaining problem, I think we'll have to find a way to serve a hard pounding user if we want to convert TCP hashtables later on. Did you look into what __vmalloc prevents to work with BH disabled? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | David Miller <davem@davemloft.net> |
|---|---|
| Date | 2015-12-07 20:40 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qD9NE-lE-33@gated-at.bofh.it> |
| In reply to | #1285612 |
From: Thomas Graf <tgraf@suug.ch> Date: Mon, 7 Dec 2015 16:35:24 +0100 > Did you look into what __vmalloc prevents to work with BH disabled? You can't issue the cross-cpu TLB flushes from atomic contexts. It's the kernel page table updates that create the restriction. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Thomas Graf <tgraf@suug.ch> |
|---|---|
| Date | 2015-12-09 03:20 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qDCwj-25G-27@gated-at.bofh.it> |
| In reply to | #1285873 |
On 12/05/15 at 03:06pm, Herbert Xu wrote: > Unless we can make __vmalloc work with BH disabled, I guess we'll > have to go back to multi-level lookups unless someone has a better > suggestion. Assuming that we only encounter this scenario with very large table sizes, it might be OK to assume that deferring the actual resize via the worker thread while continuing to insert above 100% utilization in atomic context is safe. On 12/07/15 at 02:29pm, David Miller wrote: > You can't issue the cross-cpu TLB flushes from atomic contexts. > It's the kernel page table updates that create the restriction. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-09 03:30 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qDCFY-295-17@gated-at.bofh.it> |
| In reply to | #1286995 |
On Wed, Dec 09, 2015 at 03:18:26AM +0100, Thomas Graf wrote: > > Assuming that we only encounter this scenario with very large > table sizes, it might be OK to assume that deferring the actual > resize via the worker thread while continuing to insert above > 100% utilization in atomic context is safe. As test_rhashtable has demonstrated already this approach doesn't work. There is nothing in the kernel that will ensure that the worker thread gets to run at all. Cheers, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-09 03:40 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qDCPD-2c5-3@gated-at.bofh.it> |
| In reply to | #1287006 |
On Wed, Dec 09, 2015 at 03:36:32AM +0100, Thomas Graf wrote: > > Without knowing your exact implementation plans: introducing an > additional reference indirection for every lookup will have a > huge performance penalty as well. > > Is your plan to only introduce the master table after an > allocation has failed? Right, obviously the extra indirections would only come into play after a failed allocation. As soon as we can run the worker thread it'll try to remove the extra indirections by doing vmalloc. Cheers, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Thomas Graf <tgraf@suug.ch> |
|---|---|
| Date | 2015-12-09 03:50 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qDCZj-2fi-7@gated-at.bofh.it> |
| In reply to | #1287016 |
On 12/09/15 at 10:38am, Herbert Xu wrote: > On Wed, Dec 09, 2015 at 03:36:32AM +0100, Thomas Graf wrote: > > > > Without knowing your exact implementation plans: introducing an > > additional reference indirection for every lookup will have a > > huge performance penalty as well. > > > > Is your plan to only introduce the master table after an > > allocation has failed? > > Right, obviously the extra indirections would only come into play > after a failed allocation. As soon as we can run the worker thread > it'll try to remove the extra indirections by doing vmalloc. OK, this sounds like a good compromise. The penalty is isolated for the duration of the atomic burst. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Thomas Graf <tgraf@suug.ch> |
|---|---|
| Date | 2015-12-09 03:40 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qDCPD-2c5-5@gated-at.bofh.it> |
| In reply to | #1287006 |
On 12/09/15 at 10:24am, Herbert Xu wrote: > On Wed, Dec 09, 2015 at 03:18:26AM +0100, Thomas Graf wrote: > > > > Assuming that we only encounter this scenario with very large > > table sizes, it might be OK to assume that deferring the actual > > resize via the worker thread while continuing to insert above > > 100% utilization in atomic context is safe. > > As test_rhashtable has demonstrated already this approach doesn't > work. There is nothing in the kernel that will ensure that the > worker thread gets to run at all. If we define work assuming that an insertion in atomic context should never fail then yes. I'm not sure you can guarantee that with a segmented table either though. I agree though that the insertion behaviour is much better defined. My argument is that if we are in a situation in which a worker thread is never invoked and we've grown 2x from the original table size, do we still need entries to be inserted into the table or can we fail? Without knowing your exact implementation plans: introducing an additional reference indirection for every lookup will have a huge performance penalty as well. Is your plan to only introduce the master table after an allocation has failed? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | David Miller <davem@davemloft.net> |
|---|---|
| Date | 2015-12-04 23:00 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qC6yt-8fV-7@gated-at.bofh.it> |
| In reply to | #1283881 |
From: Herbert Xu <herbert@gondor.apana.org.au> Date: Fri, 4 Dec 2015 22:39:56 +0800 > When an rhashtable user pounds rhashtable hard with back-to-back > insertions we may end up growing the table in GFP_ATOMIC context. > Unfortunately when the table reaches a certain size this often > fails because we don't have enough physically contiguous pages > to hold the new table. > > Eric Dumazet suggested (and in fact wrote this patch) using > __vmalloc instead which can be used in GFP_ATOMIC context. > > Reported-by: Phil Sutter <phil@nwl.cc> > Suggested-by: Eric Dumazet <eric.dumazet@gmail.com> > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Applied, thanks Herbert. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Herbert Xu <herbert@gondor.apana.org.au> |
|---|---|
| Date | 2015-12-05 08:10 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qCf8K-5AQ-5@gated-at.bofh.it> |
| In reply to | #1284255 |
On Fri, Dec 04, 2015 at 04:53:34PM -0500, David Miller wrote: > From: Herbert Xu <herbert@gondor.apana.org.au> > Date: Fri, 4 Dec 2015 22:39:56 +0800 > > > When an rhashtable user pounds rhashtable hard with back-to-back > > insertions we may end up growing the table in GFP_ATOMIC context. > > Unfortunately when the table reaches a certain size this often > > fails because we don't have enough physically contiguous pages > > to hold the new table. > > > > Eric Dumazet suggested (and in fact wrote this patch) using > > __vmalloc instead which can be used in GFP_ATOMIC context. > > > > Reported-by: Phil Sutter <phil@nwl.cc> > > Suggested-by: Eric Dumazet <eric.dumazet@gmail.com> > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> > > Applied, thanks Herbert. Sorry Dave but you'll have to revert this because I've been able to trigger the following crash with the patch: Testing concurrent rhashtable access from 50 threads ------------[ cut here ]------------ kernel BUG at ../mm/vmalloc.c:1337! invalid opcode: 0000 [#1] PREEMPT SMP The reason is that because I was testing insertions with BH disabled, and __vmalloc doesn't like that, even with GFP_ATOMIC. As we obviously want to continue to support rhashtable users inserting entries with BH disabled, we'll have to look for an alternate solution. Thanks, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | David Miller <davem@davemloft.net> |
|---|---|
| Date | 2015-12-06 04:50 +0100 |
| Subject | Re: rhashtable: Use __vmalloc with GFP_ATOMIC for table allocation |
| Message-ID | <qCyuK-1Aw-25@gated-at.bofh.it> |
| In reply to | #1284472 |
From: Herbert Xu <herbert@gondor.apana.org.au> Date: Sat, 5 Dec 2015 15:03:54 +0800 > Sorry Dave but you'll have to revert this because I've been able > to trigger the following crash with the patch: > > Testing concurrent rhashtable access from 50 threads > ------------[ cut here ]------------ > kernel BUG at ../mm/vmalloc.c:1337! > invalid opcode: 0000 [#1] PREEMPT SMP > > The reason is that because I was testing insertions with BH disabled, > and __vmalloc doesn't like that, even with GFP_ATOMIC. As we > obviously want to continue to support rhashtable users inserting > entries with BH disabled, we'll have to look for an alternate > solution. Ok, reverted, thanks for the heads up. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web