Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1569507 > unrolled thread
| Started by | Michal Hocko <mhocko@kernel.org> |
|---|---|
| First post | 2017-01-30 11:00 +0100 |
| Last post | 2017-02-05 11:30 +0100 |
| Articles | 17 — 5 participants |
Back to article view | Back to linux.kernel
[PATCH 0/6 v3] kvmalloc Michal Hocko <mhocko@kernel.org> - 2017-01-30 11:00 +0100
[PATCH 8/9] bcache: use kvmalloc Michal Hocko <mhocko@kernel.org> - 2017-01-30 11:00 +0100
Re: [PATCH 8/9] bcache: use kvmalloc Vlastimil Babka <vbabka@suse.cz> - 2017-01-30 18:00 +0100
Re: [PATCH 8/9] bcache: use kvmalloc Michal Hocko <mhocko@kernel.org> - 2017-01-30 18:30 +0100
[PATCH 9/9] net, bpf: use kvzalloc helper Michal Hocko <mhocko@kernel.org> - 2017-01-30 11:00 +0100
Re: [PATCH 9/9] net, bpf: use kvzalloc helper Michal Hocko <mhocko@kernel.org> - 2017-01-30 18:30 +0100
[PATCH 4/9] ila: simplify a strange allocation pattern Michal Hocko <mhocko@kernel.org> - 2017-01-30 11:00 +0100
Re: [PATCH 4/9] ila: simplify a strange allocation pattern Vlastimil Babka <vbabka@suse.cz> - 2017-01-30 16:30 +0100
[PATCH 2/9] mm: support __GFP_REPEAT in kvmalloc_node for >32kB Michal Hocko <mhocko@kernel.org> - 2017-01-30 11:00 +0100
[PATCH 7/9] md: use kvmalloc rather than opencoded variant Michal Hocko <mhocko@kernel.org> - 2017-01-30 11:00 +0100
Re: [PATCH 7/9] md: use kvmalloc rather than opencoded variant Vlastimil Babka <vbabka@suse.cz> - 2017-01-30 18:00 +0100
Re: [PATCH 7/9] md: use kvmalloc rather than opencoded variant Mikulas Patocka <mpatocka@redhat.com> - 2017-02-01 18:40 +0100
Re: [PATCH 7/9] md: use kvmalloc rather than opencoded variant Michal Hocko <mhocko@kernel.org> - 2017-02-01 19:00 +0100
Re: [PATCH 5/9] treewide: use kv[mz]alloc* rather than opencoded variants Leon Romanovsky <leon@kernel.org> - 2017-01-30 11:40 +0100
Re: [PATCH 5/9] treewide: use kv[mz]alloc* rather than opencoded variants Vlastimil Babka <vbabka@suse.cz> - 2017-01-30 17:40 +0100
Re: [PATCH 5/9] treewide: use kv[mz]alloc* rather than opencoded variants Kees Cook <keescook@chromium.org> - 2017-01-30 20:30 +0100
Re: [PATCH 0/6 v3] kvmalloc Michal Hocko <mhocko@kernel.org> - 2017-02-05 11:30 +0100
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 11:00 +0100 |
| Subject | [PATCH 0/6 v3] kvmalloc |
| Message-ID | <t5gUF-2oF-3@gated-at.bofh.it> |
Hi,
this has been previously posted here [1] and it received quite some
feedback. As a result the number of patches has grown again. We are at
9 patches right now. I have rebased the series on top of the current
next-20170130. There were some changes since the last posting, namely
a7f6c1b63b86 ("AppArmor: Use GFP_KERNEL for __aa_kvmalloc().") which
dropped GFP_NOIO from __aa_kvmalloc and d407bd25a204 ("bpf: don't
trigger OOM killer under pressure with map alloc") which has created a
kvmalloc alternative for bpf code. Both have been changed to use the mm
kvmalloc but it is worth noting this dependency during the merge window.
I hope there are no further obstacles to have this merged into the mmotm
tree and go in in the next merge window.
Original cover:
There are many open coded kmalloc with vmalloc fallback instances in
the tree. Most of them are not careful enough or simply do not care
about the underlying semantic of the kmalloc/page allocator which means
that a) some vmalloc fallbacks are basically unreachable because the
kmalloc part will keep retrying until it succeeds b) the page allocator
can invoke a really disruptive steps like the OOM killer to move forward
which doesn't sound appropriate when we consider that the vmalloc
fallback is available.
As it can be seen implementing kvmalloc requires quite an intimate
knowledge if the page allocator and the memory reclaim internals which
strongly suggests that a helper should be implemented in the memory
subsystem proper.
Most callers, I could find, have been converted to use the helper
instead. This is patch 5. There are some more relying on __GFP_REPEAT
in the networking stack which I have converted as well and Eric Dumazet
was not opposed [2] to convert them as well.
[1] http://lkml.kernel.org/r/20170112153717.28943-1-mhocko@kernel.org
[2] http://lkml.kernel.org/r/1485273626.16328.301.camel@edumazet-glaptop3.roam.corp.google.com
Michal Hocko (9):
mm: introduce kv[mz]alloc helpers
mm: support __GFP_REPEAT in kvmalloc_node for >32kB
rhashtable: simplify a strange allocation pattern
ila: simplify a strange allocation pattern
treewide: use kv[mz]alloc* rather than opencoded variants
net: use kvmalloc with __GFP_REPEAT rather than open coded variant
md: use kvmalloc rather than opencoded variant
bcache: use kvmalloc
net, bpf: use kvzalloc helper
arch/s390/kvm/kvm-s390.c | 10 +---
arch/x86/kvm/lapic.c | 4 +-
arch/x86/kvm/page_track.c | 4 +-
arch/x86/kvm/x86.c | 4 +-
crypto/lzo.c | 4 +-
drivers/acpi/apei/erst.c | 8 +--
drivers/char/agp/generic.c | 8 +--
drivers/gpu/drm/nouveau/nouveau_gem.c | 4 +-
drivers/md/bcache/super.c | 8 +--
drivers/md/bcache/util.h | 12 +----
drivers/md/dm-ioctl.c | 13 ++---
drivers/md/dm-stats.c | 7 +--
drivers/net/ethernet/chelsio/cxgb3/cxgb3_defs.h | 3 --
drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c | 29 ++---------
drivers/net/ethernet/chelsio/cxgb3/l2t.c | 8 +--
drivers/net/ethernet/chelsio/cxgb3/l2t.h | 1 -
drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c | 12 ++---
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 3 --
drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | 10 ++--
drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c | 8 +--
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 31 ++----------
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32.c | 13 +++--
drivers/net/ethernet/chelsio/cxgb4/l2t.c | 2 +-
drivers/net/ethernet/chelsio/cxgb4/sched.c | 12 ++---
drivers/net/ethernet/mellanox/mlx4/en_tx.c | 9 ++--
drivers/net/ethernet/mellanox/mlx4/mr.c | 9 ++--
drivers/nvdimm/dimm_devs.c | 5 +-
.../staging/lustre/lnet/libcfs/linux/linux-mem.c | 11 +----
drivers/vhost/net.c | 9 ++--
drivers/vhost/vhost.c | 15 ++----
drivers/vhost/vsock.c | 9 ++--
drivers/xen/evtchn.c | 14 +-----
fs/btrfs/ctree.c | 9 ++--
fs/btrfs/ioctl.c | 9 ++--
fs/btrfs/send.c | 27 ++++------
fs/ceph/file.c | 9 ++--
fs/ext4/mballoc.c | 2 +-
fs/ext4/super.c | 4 +-
fs/f2fs/f2fs.h | 20 --------
fs/f2fs/file.c | 4 +-
fs/f2fs/segment.c | 14 +++---
fs/select.c | 5 +-
fs/seq_file.c | 16 +-----
fs/xattr.c | 27 ++++------
include/linux/kvm_host.h | 2 -
include/linux/mlx5/driver.h | 7 +--
include/linux/mm.h | 22 +++++++++
include/linux/vmalloc.h | 1 +
ipc/util.c | 7 +--
kernel/bpf/syscall.c | 19 ++------
lib/iov_iter.c | 5 +-
lib/rhashtable.c | 13 ++---
mm/frame_vector.c | 5 +-
mm/nommu.c | 5 ++
mm/util.c | 57 ++++++++++++++++++++++
mm/vmalloc.c | 9 +++-
net/core/dev.c | 24 ++++-----
net/ipv4/inet_hashtables.c | 6 +--
net/ipv4/tcp_metrics.c | 5 +-
net/ipv6/ila/ila_xlat.c | 8 +--
net/mpls/af_mpls.c | 5 +-
net/netfilter/x_tables.c | 37 ++++----------
net/netfilter/xt_recent.c | 5 +-
net/sched/sch_choke.c | 5 +-
net/sched/sch_fq.c | 12 +----
net/sched/sch_fq_codel.c | 26 +++-------
net/sched/sch_hhf.c | 33 ++++---------
net/sched/sch_netem.c | 6 +--
net/sched/sch_sfq.c | 6 +--
security/apparmor/apparmorfs.c | 2 +-
security/apparmor/include/lib.h | 11 -----
security/apparmor/lib.c | 30 ------------
security/apparmor/match.c | 2 +-
security/apparmor/policy_unpack.c | 2 +-
security/keys/keyctl.c | 22 +++------
virt/kvm/kvm_main.c | 18 ++-----
76 files changed, 279 insertions(+), 583 deletions(-)
[toc] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 11:00 +0100 |
| Subject | [PATCH 8/9] bcache: use kvmalloc |
| Message-ID | <t5gUG-2oF-19@gated-at.bofh.it> |
| In reply to | #1569507 |
From: Michal Hocko <mhocko@suse.com> bcache_device_init uses kmalloc for small requests and vmalloc for those which are larger than 64 pages. This alone is a strange criterion. Moreover kmalloc can fallback to vmalloc on the failure. Let's simply use kvmalloc instead as it knows how to handle the fallback properly Cc: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Michal Hocko <mhocko@suse.com> --- drivers/md/bcache/super.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 3a19cbc8b230..4cb6b88a1465 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -767,16 +767,12 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size, } n = d->nr_stripes * sizeof(atomic_t); - d->stripe_sectors_dirty = n < PAGE_SIZE << 6 - ? kzalloc(n, GFP_KERNEL) - : vzalloc(n); + d->stripe_sectors_dirty = kvzalloc(n, GFP_KERNEL); if (!d->stripe_sectors_dirty) return -ENOMEM; n = BITS_TO_LONGS(d->nr_stripes) * sizeof(unsigned long); - d->full_dirty_stripes = n < PAGE_SIZE << 6 - ? kzalloc(n, GFP_KERNEL) - : vzalloc(n); + d->full_dirty_stripes = kvzalloc(n, GFP_KERNEL); if (!d->full_dirty_stripes) return -ENOMEM; -- 2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2017-01-30 18:00 +0100 |
| Subject | Re: [PATCH 8/9] bcache: use kvmalloc |
| Message-ID | <t5nt9-6kA-33@gated-at.bofh.it> |
| In reply to | #1569508 |
On 01/30/2017 10:49 AM, Michal Hocko wrote: > From: Michal Hocko <mhocko@suse.com> > > bcache_device_init uses kmalloc for small requests and vmalloc for those > which are larger than 64 pages. This alone is a strange criterion. > Moreover kmalloc can fallback to vmalloc on the failure. Let's simply > use kvmalloc instead as it knows how to handle the fallback properly I don't see why separate patch, some of the conversions in 5/9 were quite similar (except comparing with PAGE_SIZE, not 64*PAGE_SIZE), but nevermind. > Cc: Kent Overstreet <kent.overstreet@gmail.com> > Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> > --- > drivers/md/bcache/super.c | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c > index 3a19cbc8b230..4cb6b88a1465 100644 > --- a/drivers/md/bcache/super.c > +++ b/drivers/md/bcache/super.c > @@ -767,16 +767,12 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size, > } > > n = d->nr_stripes * sizeof(atomic_t); > - d->stripe_sectors_dirty = n < PAGE_SIZE << 6 > - ? kzalloc(n, GFP_KERNEL) > - : vzalloc(n); > + d->stripe_sectors_dirty = kvzalloc(n, GFP_KERNEL); > if (!d->stripe_sectors_dirty) > return -ENOMEM; > > n = BITS_TO_LONGS(d->nr_stripes) * sizeof(unsigned long); > - d->full_dirty_stripes = n < PAGE_SIZE << 6 > - ? kzalloc(n, GFP_KERNEL) > - : vzalloc(n); > + d->full_dirty_stripes = kvzalloc(n, GFP_KERNEL); > if (!d->full_dirty_stripes) > return -ENOMEM; > >
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 18:30 +0100 |
| Subject | Re: [PATCH 8/9] bcache: use kvmalloc |
| Message-ID | <t5nWa-6Jm-9@gated-at.bofh.it> |
| In reply to | #1569899 |
On Mon 30-01-17 17:47:31, Vlastimil Babka wrote: > On 01/30/2017 10:49 AM, Michal Hocko wrote: > > From: Michal Hocko <mhocko@suse.com> > > > > bcache_device_init uses kmalloc for small requests and vmalloc for those > > which are larger than 64 pages. This alone is a strange criterion. > > Moreover kmalloc can fallback to vmalloc on the failure. Let's simply > > use kvmalloc instead as it knows how to handle the fallback properly > > I don't see why separate patch, some of the conversions in 5/9 were quite > similar (except comparing with PAGE_SIZE, not 64*PAGE_SIZE), but nevermind. I just found it later so I kept it separate. It can be folded to 5/9 if that makes more sense. > > Cc: Kent Overstreet <kent.overstreet@gmail.com> > > Signed-off-by: Michal Hocko <mhocko@suse.com> > > Acked-by: Vlastimil Babka <vbabka@suse.cz> Thanks! > > --- > > drivers/md/bcache/super.c | 8 ++------ > > 1 file changed, 2 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c > > index 3a19cbc8b230..4cb6b88a1465 100644 > > --- a/drivers/md/bcache/super.c > > +++ b/drivers/md/bcache/super.c > > @@ -767,16 +767,12 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size, > > } > > > > n = d->nr_stripes * sizeof(atomic_t); > > - d->stripe_sectors_dirty = n < PAGE_SIZE << 6 > > - ? kzalloc(n, GFP_KERNEL) > > - : vzalloc(n); > > + d->stripe_sectors_dirty = kvzalloc(n, GFP_KERNEL); > > if (!d->stripe_sectors_dirty) > > return -ENOMEM; > > > > n = BITS_TO_LONGS(d->nr_stripes) * sizeof(unsigned long); > > - d->full_dirty_stripes = n < PAGE_SIZE << 6 > > - ? kzalloc(n, GFP_KERNEL) > > - : vzalloc(n); > > + d->full_dirty_stripes = kvzalloc(n, GFP_KERNEL); > > if (!d->full_dirty_stripes) > > return -ENOMEM; > > > > -- Michal Hocko SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 11:00 +0100 |
| Subject | [PATCH 9/9] net, bpf: use kvzalloc helper |
| Message-ID | <t5gUG-2oF-9@gated-at.bofh.it> |
| In reply to | #1569507 |
From: Michal Hocko <mhocko@suse.com>
both bpf_map_area_alloc and xt_alloc_table_info try really hard to
play nicely with large memory requests which can be triggered from
the userspace (by an admin). See 5bad87348c70 ("netfilter: x_tables:
avoid warn and OOM killer on vmalloc call") resp. d407bd25a204 ("bpf:
don't trigger OOM killer under pressure with map alloc").
The current allocation pattern strongly resembles kvmalloc helper except
for one thing __GFP_NORETRY is not used for the vmalloc fallback. The
main reason why kvmalloc doesn't really support __GFP_NORETRY is
because vmalloc doesn't support this flag properly and it is far from
straightforward to make it understand it because there are some hard
coded GFP_KERNEL allocation deep in the call chains. This patch simply
replaces the open coded variants with kvmalloc and puts a note to
push on MM people to support __GFP_NORETRY in kvmalloc it this turns out
to be really needed along with OOM report pointing at vmalloc.
If there is an immediate need and no full support yet then
kvmalloc(size, gfp | __GFP_NORETRY)
will work as good as __vmalloc(gfp | __GFP_NORETRY) - in other words it
might trigger the OOM in some cases.
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andrey Konovalov <andreyknvl@google.com>
Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
kernel/bpf/syscall.c | 19 +++++--------------
net/netfilter/x_tables.c | 16 ++++++----------
2 files changed, 11 insertions(+), 24 deletions(-)
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 08a4d287226b..3d38c7a51e1a 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -54,21 +54,12 @@ void bpf_register_map_type(struct bpf_map_type_list *tl)
void *bpf_map_area_alloc(size_t size)
{
- /* We definitely need __GFP_NORETRY, so OOM killer doesn't
- * trigger under memory pressure as we really just want to
- * fail instead.
+ /*
+ * FIXME: we would really like to not trigger the OOM killer and rather
+ * fail instead. This is not supported right now. Please nag MM people
+ * if these OOM start bothering people.
*/
- const gfp_t flags = __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO;
- void *area;
-
- if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
- area = kmalloc(size, GFP_USER | flags);
- if (area != NULL)
- return area;
- }
-
- return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | flags,
- PAGE_KERNEL);
+ return kvzalloc(size, GFP_USER);
}
void bpf_map_area_free(void *area)
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index d529989f5791..ba8ba633da72 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -995,16 +995,12 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size)
if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
return NULL;
- if (sz <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
- info = kmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
- if (!info) {
- info = __vmalloc(sz, GFP_KERNEL | __GFP_NOWARN |
- __GFP_NORETRY | __GFP_HIGHMEM,
- PAGE_KERNEL);
- if (!info)
- return NULL;
- }
- memset(info, 0, sizeof(*info));
+ /*
+ * FIXME: we would really like to not trigger the OOM killer and rather
+ * fail instead. This is not supported right now. Please nag MM people
+ * if these OOM start bothering people.
+ */
+ info = kvzalloc(sz, GFP_KERNEL);
info->size = size;
return info;
}
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 18:30 +0100 |
| Subject | Re: [PATCH 9/9] net, bpf: use kvzalloc helper |
| Message-ID | <t5nWb-6Jm-31@gated-at.bofh.it> |
| In reply to | #1569509 |
Andrew, please ignore this one.
On Mon 30-01-17 10:49:40, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> both bpf_map_area_alloc and xt_alloc_table_info try really hard to
> play nicely with large memory requests which can be triggered from
> the userspace (by an admin). See 5bad87348c70 ("netfilter: x_tables:
> avoid warn and OOM killer on vmalloc call") resp. d407bd25a204 ("bpf:
> don't trigger OOM killer under pressure with map alloc").
>
> The current allocation pattern strongly resembles kvmalloc helper except
> for one thing __GFP_NORETRY is not used for the vmalloc fallback. The
> main reason why kvmalloc doesn't really support __GFP_NORETRY is
> because vmalloc doesn't support this flag properly and it is far from
> straightforward to make it understand it because there are some hard
> coded GFP_KERNEL allocation deep in the call chains. This patch simply
> replaces the open coded variants with kvmalloc and puts a note to
> push on MM people to support __GFP_NORETRY in kvmalloc it this turns out
> to be really needed along with OOM report pointing at vmalloc.
>
> If there is an immediate need and no full support yet then
> kvmalloc(size, gfp | __GFP_NORETRY)
> will work as good as __vmalloc(gfp | __GFP_NORETRY) - in other words it
> might trigger the OOM in some cases.
>
> Cc: Alexei Starovoitov <ast@kernel.org>
> Cc: Andrey Konovalov <andreyknvl@google.com>
> Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
> Cc: Pablo Neira Ayuso <pablo@netfilter.org>
> Acked-by: Daniel Borkmann <daniel@iogearbox.net>
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> ---
> kernel/bpf/syscall.c | 19 +++++--------------
> net/netfilter/x_tables.c | 16 ++++++----------
> 2 files changed, 11 insertions(+), 24 deletions(-)
>
> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> index 08a4d287226b..3d38c7a51e1a 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -54,21 +54,12 @@ void bpf_register_map_type(struct bpf_map_type_list *tl)
>
> void *bpf_map_area_alloc(size_t size)
> {
> - /* We definitely need __GFP_NORETRY, so OOM killer doesn't
> - * trigger under memory pressure as we really just want to
> - * fail instead.
> + /*
> + * FIXME: we would really like to not trigger the OOM killer and rather
> + * fail instead. This is not supported right now. Please nag MM people
> + * if these OOM start bothering people.
> */
> - const gfp_t flags = __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO;
> - void *area;
> -
> - if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
> - area = kmalloc(size, GFP_USER | flags);
> - if (area != NULL)
> - return area;
> - }
> -
> - return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | flags,
> - PAGE_KERNEL);
> + return kvzalloc(size, GFP_USER);
> }
>
> void bpf_map_area_free(void *area)
> diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
> index d529989f5791..ba8ba633da72 100644
> --- a/net/netfilter/x_tables.c
> +++ b/net/netfilter/x_tables.c
> @@ -995,16 +995,12 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size)
> if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
> return NULL;
>
> - if (sz <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
> - info = kmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
> - if (!info) {
> - info = __vmalloc(sz, GFP_KERNEL | __GFP_NOWARN |
> - __GFP_NORETRY | __GFP_HIGHMEM,
> - PAGE_KERNEL);
> - if (!info)
> - return NULL;
> - }
> - memset(info, 0, sizeof(*info));
> + /*
> + * FIXME: we would really like to not trigger the OOM killer and rather
> + * fail instead. This is not supported right now. Please nag MM people
> + * if these OOM start bothering people.
> + */
> + info = kvzalloc(sz, GFP_KERNEL);
> info->size = size;
> return info;
> }
> --
> 2.11.0
>
--
Michal Hocko
SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 11:00 +0100 |
| Subject | [PATCH 4/9] ila: simplify a strange allocation pattern |
| Message-ID | <t5gUG-2oF-21@gated-at.bofh.it> |
| In reply to | #1569507 |
From: Michal Hocko <mhocko@suse.com>
alloc_ila_locks seemed to c&p from alloc_bucket_locks allocation
pattern which is quite unusual. The default allocation size is 320 *
sizeof(spinlock_t) which is sub page unless lockdep is enabled when the
performance benefit is really questionable and not worth the subtle code
IMHO. Also note that the context when we call ila_init_net (modprobe or
a task creating a net namespace) has to be properly configured.
Let's just simplify the code and use kvmalloc helper which is a
transparent way to use kmalloc with vmalloc fallback.
Cc: Tom Herbert <tom@herbertland.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
net/ipv6/ila/ila_xlat.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c
index af8f52ee7180..2fd5ca151dcf 100644
--- a/net/ipv6/ila/ila_xlat.c
+++ b/net/ipv6/ila/ila_xlat.c
@@ -41,13 +41,7 @@ static int alloc_ila_locks(struct ila_net *ilan)
size = roundup_pow_of_two(nr_pcpus * LOCKS_PER_CPU);
if (sizeof(spinlock_t) != 0) {
-#ifdef CONFIG_NUMA
- if (size * sizeof(spinlock_t) > PAGE_SIZE)
- ilan->locks = vmalloc(size * sizeof(spinlock_t));
- else
-#endif
- ilan->locks = kmalloc_array(size, sizeof(spinlock_t),
- GFP_KERNEL);
+ ilan->locks = kvmalloc(size * sizeof(spinlock_t), GFP_KERNEL);
if (!ilan->locks)
return -ENOMEM;
for (i = 0; i < size; i++)
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2017-01-30 16:30 +0100 |
| Subject | Re: [PATCH 4/9] ila: simplify a strange allocation pattern |
| Message-ID | <t5m42-5BN-19@gated-at.bofh.it> |
| In reply to | #1569510 |
On 01/30/2017 10:49 AM, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> alloc_ila_locks seemed to c&p from alloc_bucket_locks allocation
> pattern which is quite unusual. The default allocation size is 320 *
> sizeof(spinlock_t) which is sub page unless lockdep is enabled when the
> performance benefit is really questionable and not worth the subtle code
> IMHO. Also note that the context when we call ila_init_net (modprobe or
> a task creating a net namespace) has to be properly configured.
>
> Let's just simplify the code and use kvmalloc helper which is a
> transparent way to use kmalloc with vmalloc fallback.
>
> Cc: Tom Herbert <tom@herbertland.com>
> Cc: Eric Dumazet <eric.dumazet@gmail.com>
> Signed-off-by: Michal Hocko <mhocko@suse.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> net/ipv6/ila/ila_xlat.c | 8 +-------
> 1 file changed, 1 insertion(+), 7 deletions(-)
>
> diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c
> index af8f52ee7180..2fd5ca151dcf 100644
> --- a/net/ipv6/ila/ila_xlat.c
> +++ b/net/ipv6/ila/ila_xlat.c
> @@ -41,13 +41,7 @@ static int alloc_ila_locks(struct ila_net *ilan)
> size = roundup_pow_of_two(nr_pcpus * LOCKS_PER_CPU);
>
> if (sizeof(spinlock_t) != 0) {
> -#ifdef CONFIG_NUMA
> - if (size * sizeof(spinlock_t) > PAGE_SIZE)
> - ilan->locks = vmalloc(size * sizeof(spinlock_t));
> - else
> -#endif
> - ilan->locks = kmalloc_array(size, sizeof(spinlock_t),
> - GFP_KERNEL);
> + ilan->locks = kvmalloc(size * sizeof(spinlock_t), GFP_KERNEL);
> if (!ilan->locks)
> return -ENOMEM;
> for (i = 0; i < size; i++)
>
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 11:00 +0100 |
| Subject | [PATCH 2/9] mm: support __GFP_REPEAT in kvmalloc_node for >32kB |
| Message-ID | <t5gUG-2oF-11@gated-at.bofh.it> |
| In reply to | #1569507 |
From: Michal Hocko <mhocko@suse.com>
vhost code uses __GFP_REPEAT when allocating vhost_virtqueue resp.
vhost_vsock because it would really like to prefer kmalloc to the
vmalloc fallback - see 23cc5a991c7a ("vhost-net: extend device
allocation to vmalloc") for more context. Michael Tsirkin has also
noted:
"
__GFP_REPEAT overhead is during allocation time. Using vmalloc means all
accesses are slowed down. Allocation is not on data path, accesses are.
"
The similar applies to other vhost_kvzalloc users.
Let's teach kvmalloc_node to handle __GFP_REPEAT properly. There are two
things to be careful about. First we should prevent from the OOM killer
and so have to involve __GFP_NORETRY by default and secondly override
__GFP_REPEAT for !costly order requests as the __GFP_REPEAT is ignored
for !costly orders.
Supporting __GFP_REPEAT like semantic for !costly request is possible
it would require changes in the page allocator. This is out of scope of
this patch.
This patch shouldn't introduce any functional change.
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
drivers/vhost/net.c | 9 +++------
drivers/vhost/vhost.c | 15 +++------------
drivers/vhost/vsock.c | 9 +++------
mm/util.c | 20 ++++++++++++++++----
4 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index c42e9c305134..f40e0150ca37 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -814,12 +814,9 @@ static int vhost_net_open(struct inode *inode, struct file *f)
struct vhost_virtqueue **vqs;
int i;
- n = kmalloc(sizeof *n, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
- if (!n) {
- n = vmalloc(sizeof *n);
- if (!n)
- return -ENOMEM;
- }
+ n = kvmalloc(sizeof *n, GFP_KERNEL | __GFP_REPEAT);
+ if (!n)
+ return -ENOMEM;
vqs = kmalloc(VHOST_NET_VQ_MAX * sizeof(*vqs), GFP_KERNEL);
if (!vqs) {
kvfree(n);
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 9f118388a5b7..596099c645ff 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -515,18 +515,9 @@ long vhost_dev_set_owner(struct vhost_dev *dev)
}
EXPORT_SYMBOL_GPL(vhost_dev_set_owner);
-static void *vhost_kvzalloc(unsigned long size)
-{
- void *n = kzalloc(size, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
-
- if (!n)
- n = vzalloc(size);
- return n;
-}
-
struct vhost_umem *vhost_dev_reset_owner_prepare(void)
{
- return vhost_kvzalloc(sizeof(struct vhost_umem));
+ return kvzalloc(sizeof(struct vhost_umem), GFP_KERNEL);
}
EXPORT_SYMBOL_GPL(vhost_dev_reset_owner_prepare);
@@ -1190,7 +1181,7 @@ EXPORT_SYMBOL_GPL(vhost_vq_access_ok);
static struct vhost_umem *vhost_umem_alloc(void)
{
- struct vhost_umem *umem = vhost_kvzalloc(sizeof(*umem));
+ struct vhost_umem *umem = kvzalloc(sizeof(*umem), GFP_KERNEL);
if (!umem)
return NULL;
@@ -1216,7 +1207,7 @@ static long vhost_set_memory(struct vhost_dev *d, struct vhost_memory __user *m)
return -EOPNOTSUPP;
if (mem.nregions > max_mem_regions)
return -E2BIG;
- newmem = vhost_kvzalloc(size + mem.nregions * sizeof(*m->regions));
+ newmem = kvzalloc(size + mem.nregions * sizeof(*m->regions), GFP_KERNEL);
if (!newmem)
return -ENOMEM;
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index ce5e63d2c66a..d403c647ba56 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -460,12 +460,9 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file)
/* This struct is large and allocation could fail, fall back to vmalloc
* if there is no other way.
*/
- vsock = kzalloc(sizeof(*vsock), GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
- if (!vsock) {
- vsock = vmalloc(sizeof(*vsock));
- if (!vsock)
- return -ENOMEM;
- }
+ vsock = kvmalloc(sizeof(*vsock), GFP_KERNEL | __GFP_REPEAT);
+ if (!vsock)
+ return -ENOMEM;
vqs = kmalloc_array(ARRAY_SIZE(vsock->vqs), sizeof(*vqs), GFP_KERNEL);
if (!vqs) {
diff --git a/mm/util.c b/mm/util.c
index ef72e2554edb..f23cf264e21d 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -333,8 +333,10 @@ EXPORT_SYMBOL(vm_mmap);
*
* Uses kmalloc to get the memory but if the allocation fails then falls back
* to the vmalloc allocator. Use kvfree for freeing the memory.
- *
- * Reclaim modifiers - __GFP_NORETRY, __GFP_REPEAT and __GFP_NOFAIL are not supported
+ *
+ * Reclaim modifiers - __GFP_NORETRY and __GFP_NOFAIL are not supported. __GFP_REPEAT
+ * is supported only for large (>32kB) allocations, and it should be used only if
+ * kmalloc is preferable to the vmalloc fallback, due to visible performance drawbacks.
*
* Any use of gfp flags outside of GFP_KERNEL should be consulted with mm people.
*/
@@ -353,8 +355,18 @@ void *kvmalloc_node(size_t size, gfp_t flags, int node)
* Make sure that larger requests are not too disruptive - no OOM
* killer and no allocation failure warnings as we have a fallback
*/
- if (size > PAGE_SIZE)
- kmalloc_flags |= __GFP_NORETRY | __GFP_NOWARN;
+ if (size > PAGE_SIZE) {
+ kmalloc_flags |= __GFP_NOWARN;
+
+ /*
+ * We have to override __GFP_REPEAT by __GFP_NORETRY for !costly
+ * requests because there is no other way to tell the allocator
+ * that we want to fail rather than retry endlessly.
+ */
+ if (!(kmalloc_flags & __GFP_REPEAT) ||
+ (size <= PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
+ kmalloc_flags |= __GFP_NORETRY;
+ }
ret = kmalloc_node(size, kmalloc_flags, node);
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-01-30 11:00 +0100 |
| Subject | [PATCH 7/9] md: use kvmalloc rather than opencoded variant |
| Message-ID | <t5gUG-2oF-27@gated-at.bofh.it> |
| In reply to | #1569507 |
From: Michal Hocko <mhocko@suse.com>
copy_params uses kmalloc with vmalloc fallback. We already have a helper
for that - kvmalloc. This caller requires GFP_NOIO semantic so it hasn't
been converted with many others by previous patches. All we need to
achieve this semantic is to use the scope memalloc_noio_{save,restore}
around kvmalloc.
Cc: Mikulas Patocka <mpatocka@redhat.com>
Cc: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
drivers/md/dm-ioctl.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index a5a9b17f0f7f..dbf5b981f7d7 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1698,6 +1698,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
struct dm_ioctl *dmi;
int secure_data;
const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
+ unsigned noio_flag;
if (copy_from_user(param_kernel, user, minimum_data_size))
return -EFAULT;
@@ -1720,15 +1721,9 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
* Use kmalloc() rather than vmalloc() when we can.
*/
dmi = NULL;
- if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
- dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
-
- if (!dmi) {
- unsigned noio_flag;
- noio_flag = memalloc_noio_save();
- dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL);
- memalloc_noio_restore(noio_flag);
- }
+ noio_flag = memalloc_noio_save();
+ dmi = kvmalloc(param_kernel->data_size, GFP_KERNEL);
+ memalloc_noio_restore(noio_flag);
if (!dmi) {
if (secure_data && clear_user(user, param_kernel->data_size))
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2017-01-30 18:00 +0100 |
| Subject | Re: [PATCH 7/9] md: use kvmalloc rather than opencoded variant |
| Message-ID | <t5nt9-6kA-39@gated-at.bofh.it> |
| In reply to | #1569512 |
On 01/30/2017 10:49 AM, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> copy_params uses kmalloc with vmalloc fallback. We already have a helper
> for that - kvmalloc. This caller requires GFP_NOIO semantic so it hasn't
> been converted with many others by previous patches. All we need to
> achieve this semantic is to use the scope memalloc_noio_{save,restore}
> around kvmalloc.
>
> Cc: Mikulas Patocka <mpatocka@redhat.com>
> Cc: Mike Snitzer <snitzer@redhat.com>
> Signed-off-by: Michal Hocko <mhocko@suse.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> drivers/md/dm-ioctl.c | 13 ++++---------
> 1 file changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
> index a5a9b17f0f7f..dbf5b981f7d7 100644
> --- a/drivers/md/dm-ioctl.c
> +++ b/drivers/md/dm-ioctl.c
> @@ -1698,6 +1698,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
> struct dm_ioctl *dmi;
> int secure_data;
> const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
> + unsigned noio_flag;
>
> if (copy_from_user(param_kernel, user, minimum_data_size))
> return -EFAULT;
> @@ -1720,15 +1721,9 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
> * Use kmalloc() rather than vmalloc() when we can.
> */
> dmi = NULL;
> - if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
> - dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
> -
> - if (!dmi) {
> - unsigned noio_flag;
> - noio_flag = memalloc_noio_save();
> - dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL);
> - memalloc_noio_restore(noio_flag);
> - }
> + noio_flag = memalloc_noio_save();
> + dmi = kvmalloc(param_kernel->data_size, GFP_KERNEL);
> + memalloc_noio_restore(noio_flag);
>
> if (!dmi) {
> if (secure_data && clear_user(user, param_kernel->data_size))
>
[toc] | [prev] | [next] | [standalone]
| From | Mikulas Patocka <mpatocka@redhat.com> |
|---|---|
| Date | 2017-02-01 18:40 +0100 |
| Subject | Re: [PATCH 7/9] md: use kvmalloc rather than opencoded variant |
| Message-ID | <t672X-pD-29@gated-at.bofh.it> |
| In reply to | #1569512 |
On Mon, 30 Jan 2017, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> copy_params uses kmalloc with vmalloc fallback. We already have a helper
> for that - kvmalloc. This caller requires GFP_NOIO semantic so it hasn't
> been converted with many others by previous patches. All we need to
> achieve this semantic is to use the scope memalloc_noio_{save,restore}
> around kvmalloc.
>
> Cc: Mikulas Patocka <mpatocka@redhat.com>
> Cc: Mike Snitzer <snitzer@redhat.com>
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> ---
> drivers/md/dm-ioctl.c | 13 ++++---------
> 1 file changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
> index a5a9b17f0f7f..dbf5b981f7d7 100644
> --- a/drivers/md/dm-ioctl.c
> +++ b/drivers/md/dm-ioctl.c
> @@ -1698,6 +1698,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
> struct dm_ioctl *dmi;
> int secure_data;
> const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
> + unsigned noio_flag;
>
> if (copy_from_user(param_kernel, user, minimum_data_size))
> return -EFAULT;
> @@ -1720,15 +1721,9 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
> * Use kmalloc() rather than vmalloc() when we can.
> */
> dmi = NULL;
> - if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
> - dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
> -
> - if (!dmi) {
> - unsigned noio_flag;
> - noio_flag = memalloc_noio_save();
> - dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL);
> - memalloc_noio_restore(noio_flag);
> - }
> + noio_flag = memalloc_noio_save();
> + dmi = kvmalloc(param_kernel->data_size, GFP_KERNEL);
> + memalloc_noio_restore(noio_flag);
>
> if (!dmi) {
> if (secure_data && clear_user(user, param_kernel->data_size))
> --
> 2.11.0
I would push these memalloc_noio_save/memalloc_noio_restore calls to
kvmalloc, so that the othe callers can use them too.
Something like
if ((flags & (__GFP_IO | __GFP_FS)) != (__GFP_IO | __GFP_FS))
noio_flag = memalloc_noio_save();
ptr = __vmalloc_node_flags(size, node, flags);
if ((flags & (__GFP_IO | __GFP_FS)) != (__GFP_IO | __GFP_FS))
memalloc_noio_restore(noio_flag)
Or perhaps even better - push memalloc_noio_save/memalloc_noio_restore
directly to __vmalloc, so that __vmalloc respects the gfp flags properly -
note that there are 14 places in the kernel where __vmalloc is called with
GFP_NOFS and they are all buggy because __vmalloc doesn't respect the
GFP_NOFS flag.
Mikulas
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-02-01 19:00 +0100 |
| Subject | Re: [PATCH 7/9] md: use kvmalloc rather than opencoded variant |
| Message-ID | <t67mi-x1-7@gated-at.bofh.it> |
| In reply to | #1571821 |
On Wed 01-02-17 12:29:56, Mikulas Patocka wrote:
>
>
> On Mon, 30 Jan 2017, Michal Hocko wrote:
>
> > From: Michal Hocko <mhocko@suse.com>
> >
> > copy_params uses kmalloc with vmalloc fallback. We already have a helper
> > for that - kvmalloc. This caller requires GFP_NOIO semantic so it hasn't
> > been converted with many others by previous patches. All we need to
> > achieve this semantic is to use the scope memalloc_noio_{save,restore}
> > around kvmalloc.
> >
> > Cc: Mikulas Patocka <mpatocka@redhat.com>
> > Cc: Mike Snitzer <snitzer@redhat.com>
> > Signed-off-by: Michal Hocko <mhocko@suse.com>
> > ---
> > drivers/md/dm-ioctl.c | 13 ++++---------
> > 1 file changed, 4 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
> > index a5a9b17f0f7f..dbf5b981f7d7 100644
> > --- a/drivers/md/dm-ioctl.c
> > +++ b/drivers/md/dm-ioctl.c
> > @@ -1698,6 +1698,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
> > struct dm_ioctl *dmi;
> > int secure_data;
> > const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
> > + unsigned noio_flag;
> >
> > if (copy_from_user(param_kernel, user, minimum_data_size))
> > return -EFAULT;
> > @@ -1720,15 +1721,9 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
> > * Use kmalloc() rather than vmalloc() when we can.
> > */
> > dmi = NULL;
> > - if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
> > - dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
> > -
> > - if (!dmi) {
> > - unsigned noio_flag;
> > - noio_flag = memalloc_noio_save();
> > - dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL);
> > - memalloc_noio_restore(noio_flag);
> > - }
> > + noio_flag = memalloc_noio_save();
> > + dmi = kvmalloc(param_kernel->data_size, GFP_KERNEL);
> > + memalloc_noio_restore(noio_flag);
> >
> > if (!dmi) {
> > if (secure_data && clear_user(user, param_kernel->data_size))
> > --
> > 2.11.0
>
> I would push these memalloc_noio_save/memalloc_noio_restore calls to
> kvmalloc, so that the othe callers can use them too.
>
> Something like
> if ((flags & (__GFP_IO | __GFP_FS)) != (__GFP_IO | __GFP_FS))
> noio_flag = memalloc_noio_save();
> ptr = __vmalloc_node_flags(size, node, flags);
> if ((flags & (__GFP_IO | __GFP_FS)) != (__GFP_IO | __GFP_FS))
> memalloc_noio_restore(noio_flag)
>
> Or perhaps even better - push memalloc_noio_save/memalloc_noio_restore
> directly to __vmalloc, so that __vmalloc respects the gfp flags properly -
> note that there are 14 places in the kernel where __vmalloc is called with
> GFP_NOFS and they are all buggy because __vmalloc doesn't respect the
> GFP_NOFS flag.
That is out of scope of this patch series. I would like to deal with
NOIO an NOFS contexts separately.
--
Michal Hocko
SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | Leon Romanovsky <leon@kernel.org> |
|---|---|
| Date | 2017-01-30 11:40 +0100 |
| Subject | Re: [PATCH 5/9] treewide: use kv[mz]alloc* rather than opencoded variants |
| Message-ID | <t5hxn-2QU-1@gated-at.bofh.it> |
| In reply to | #1569507 |
[Multipart message — attachments visible in raw view] — view raw
On Mon, Jan 30, 2017 at 10:49:36AM +0100, Michal Hocko wrote: > From: Michal Hocko <mhocko@suse.com> > > There are many code paths opencoding kvmalloc. Let's use the helper > instead. The main difference to kvmalloc is that those users are usually > not considering all the aspects of the memory allocator. E.g. allocation > requests <= 32kB (with 4kB pages) are basically never failing and invoke > OOM killer to satisfy the allocation. This sounds too disruptive for > something that has a reasonable fallback - the vmalloc. On the other > hand those requests might fallback to vmalloc even when the memory > allocator would succeed after several more reclaim/compaction attempts > previously. There is no guarantee something like that happens though. > > This patch converts many of those places to kv[mz]alloc* helpers because > they are more conservative. > > Changes since v1 > - add kvmalloc_array - this might silently fix some overflow issues > because most users simply didn't check the overflow for the vmalloc > fallback. > > Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> > Cc: Heiko Carstens <heiko.carstens@de.ibm.com> > Cc: Herbert Xu <herbert@gondor.apana.org.au> > Cc: Anton Vorontsov <anton@enomsg.org> > Cc: Colin Cross <ccross@android.com> > Cc: Kees Cook <keescook@chromium.org> > Cc: Tony Luck <tony.luck@intel.com> > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> > Cc: Ben Skeggs <bskeggs@redhat.com> > Cc: Kent Overstreet <kent.overstreet@gmail.com> > Cc: Santosh Raspatur <santosh@chelsio.com> > Cc: Hariprasad S <hariprasad@chelsio.com> > Cc: Yishai Hadas <yishaih@mellanox.com> > Cc: Oleg Drokin <oleg.drokin@intel.com> > Cc: "Yan, Zheng" <zyan@redhat.com> > Cc: Alexander Viro <viro@zeniv.linux.org.uk> > Cc: Alexei Starovoitov <ast@kernel.org> > Cc: Eric Dumazet <eric.dumazet@gmail.com> > Cc: netdev@vger.kernel.org > Acked-by: Andreas Dilger <andreas.dilger@intel.com> # Lustre > Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> # Xen bits > Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> # KVM/s390 > Acked-by: Dan Williams <dan.j.williams@intel.com> # nvdim > Acked-by: David Sterba <dsterba@suse.com> # btrfs > Acked-by: Ilya Dryomov <idryomov@gmail.com> # Ceph > Acked-by: Tariq Toukan <tariqt@mellanox.com> # mlx4 > Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Leon Romanovsky <leonro@mellanox.com> # mlx5
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2017-01-30 17:40 +0100 |
| Subject | Re: [PATCH 5/9] treewide: use kv[mz]alloc* rather than opencoded variants |
| Message-ID | <t5n9M-6e5-27@gated-at.bofh.it> |
| In reply to | #1569507 |
On 01/30/2017 10:49 AM, Michal Hocko wrote: > From: Michal Hocko <mhocko@suse.com> > > There are many code paths opencoding kvmalloc. Let's use the helper > instead. The main difference to kvmalloc is that those users are usually > not considering all the aspects of the memory allocator. E.g. allocation > requests <= 32kB (with 4kB pages) are basically never failing and invoke > OOM killer to satisfy the allocation. This sounds too disruptive for > something that has a reasonable fallback - the vmalloc. On the other > hand those requests might fallback to vmalloc even when the memory > allocator would succeed after several more reclaim/compaction attempts > previously. There is no guarantee something like that happens though. > > This patch converts many of those places to kv[mz]alloc* helpers because > they are more conservative. > > Changes since v1 > - add kvmalloc_array - this might silently fix some overflow issues > because most users simply didn't check the overflow for the vmalloc > fallback. > > Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> > Cc: Heiko Carstens <heiko.carstens@de.ibm.com> > Cc: Herbert Xu <herbert@gondor.apana.org.au> > Cc: Anton Vorontsov <anton@enomsg.org> > Cc: Colin Cross <ccross@android.com> > Cc: Kees Cook <keescook@chromium.org> > Cc: Tony Luck <tony.luck@intel.com> > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> > Cc: Ben Skeggs <bskeggs@redhat.com> > Cc: Kent Overstreet <kent.overstreet@gmail.com> > Cc: Santosh Raspatur <santosh@chelsio.com> > Cc: Hariprasad S <hariprasad@chelsio.com> > Cc: Yishai Hadas <yishaih@mellanox.com> > Cc: Oleg Drokin <oleg.drokin@intel.com> > Cc: "Yan, Zheng" <zyan@redhat.com> > Cc: Alexander Viro <viro@zeniv.linux.org.uk> > Cc: Alexei Starovoitov <ast@kernel.org> > Cc: Eric Dumazet <eric.dumazet@gmail.com> > Cc: netdev@vger.kernel.org > Acked-by: Andreas Dilger <andreas.dilger@intel.com> # Lustre > Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> # Xen bits > Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> # KVM/s390 > Acked-by: Dan Williams <dan.j.williams@intel.com> # nvdim > Acked-by: David Sterba <dsterba@suse.com> # btrfs > Acked-by: Ilya Dryomov <idryomov@gmail.com> # Ceph > Acked-by: Tariq Toukan <tariqt@mellanox.com> # mlx4 > Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Vlastimil Babka <vbabka@suse.cz>
[toc] | [prev] | [next] | [standalone]
| From | Kees Cook <keescook@chromium.org> |
|---|---|
| Date | 2017-01-30 20:30 +0100 |
| Subject | Re: [PATCH 5/9] treewide: use kv[mz]alloc* rather than opencoded variants |
| Message-ID | <t5pOi-7RS-11@gated-at.bofh.it> |
| In reply to | #1569507 |
On Mon, Jan 30, 2017 at 1:49 AM, Michal Hocko <mhocko@kernel.org> wrote: > From: Michal Hocko <mhocko@suse.com> > > There are many code paths opencoding kvmalloc. Let's use the helper > instead. The main difference to kvmalloc is that those users are usually > not considering all the aspects of the memory allocator. E.g. allocation > requests <= 32kB (with 4kB pages) are basically never failing and invoke > OOM killer to satisfy the allocation. This sounds too disruptive for > something that has a reasonable fallback - the vmalloc. On the other > hand those requests might fallback to vmalloc even when the memory > allocator would succeed after several more reclaim/compaction attempts > previously. There is no guarantee something like that happens though. > > This patch converts many of those places to kv[mz]alloc* helpers because > they are more conservative. > > Changes since v1 > - add kvmalloc_array - this might silently fix some overflow issues > because most users simply didn't check the overflow for the vmalloc > fallback. Awesome, thanks for adding that API. :) Acked-by: Kees Cook <keescook@chromium.org> -Kees -- Kees Cook Nexus Security
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2017-02-05 11:30 +0100 |
| Message-ID | <t7seZ-630-1@gated-at.bofh.it> |
| In reply to | #1569507 |
Is there anything more to be done before this can get merged? I would relly like to target this to the next merge window. I already have some more changes which depend on this. -- Michal Hocko SUSE Labs
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web