Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1390166 > unrolled thread
| Started by | Michal Hocko <mhocko@kernel.org> |
|---|---|
| First post | 2016-04-28 15:30 +0200 |
| Last post | 2016-04-28 18:10 +0200 |
| Articles | 8 — 3 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.
[PATCH 19/20] md: simplify free_params for kmalloc vs vmalloc fallback Michal Hocko <mhocko@kernel.org> - 2016-04-28 15:30 +0200
[PATCH] md: simplify free_params for kmalloc vs vmalloc fallback Michal Hocko <mhocko@kernel.org> - 2016-04-28 17:00 +0200
Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback Mikulas Patocka <mpatocka@redhat.com> - 2016-04-28 17:10 +0200
Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback Michal Hocko <mhocko@kernel.org> - 2016-04-28 17:30 +0200
Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback Mikulas Patocka <mpatocka@redhat.com> - 2016-04-28 17:50 +0200
Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback Michal Hocko <mhocko@kernel.org> - 2016-04-28 19:00 +0200
Re: [PATCH 19/20] md: simplify free_params for kmalloc vs vmalloc fallback Mike Snitzer <snitzer@redhat.com> - 2016-04-28 17:40 +0200
Re: [PATCH 19/20] md: simplify free_params for kmalloc vs vmalloc fallback Michal Hocko <mhocko@kernel.org> - 2016-04-28 18:10 +0200
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-28 15:30 +0200 |
| Subject | [PATCH 19/20] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsUb0-3LP-21@gated-at.bofh.it> |
From: Michal Hocko <mhocko@suse.com>
Use kvfree rather than DM_PARAMS_[KV]MALLOC specific param flags.
Cc: Shaohua Li <shli@kernel.org>
Cc: Mikulas Patocka <mpatocka@redhat.com>
Cc: dm-devel@redhat.com
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
drivers/md/dm-ioctl.c | 19 ++++---------------
1 file changed, 4 insertions(+), 15 deletions(-)
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index fe0b57d7573c..2b48c49774bc 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1670,19 +1670,14 @@ static int check_version(unsigned int cmd, struct dm_ioctl __user *user)
return r;
}
-#define DM_PARAMS_KMALLOC 0x0001 /* Params alloced with kmalloc */
-#define DM_PARAMS_VMALLOC 0x0002 /* Params alloced with vmalloc */
-#define DM_WIPE_BUFFER 0x0010 /* Wipe input buffer before returning from ioctl */
+#define DM_WIPE_BUFFER 0x0001 /* Wipe input buffer before returning from ioctl */
static void free_params(struct dm_ioctl *param, size_t param_size, int param_flags)
{
if (param_flags & DM_WIPE_BUFFER)
memset(param, 0, param_size);
- if (param_flags & DM_PARAMS_KMALLOC)
- kfree(param);
- if (param_flags & DM_PARAMS_VMALLOC)
- vfree(param);
+ kvfree(param);
}
static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernel,
@@ -1714,17 +1709,11 @@ 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) {
+ if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
dmi = kmalloc(param_kernel->data_size, GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN);
- if (dmi)
- *param_flags |= DM_PARAMS_KMALLOC;
- }
- if (!dmi) {
+ if (!dmi)
dmi = __vmalloc(param_kernel->data_size, GFP_KERNEL | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL);
- if (dmi)
- *param_flags |= DM_PARAMS_VMALLOC;
- }
if (!dmi) {
if (secure_data && clear_user(user, param_kernel->data_size))
--
2.8.0.rc3
[toc] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-28 17:00 +0200 |
| Subject | [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsVA6-50h-13@gated-at.bofh.it> |
| In reply to | #1390166 |
From: Michal Hocko <mhocko@suse.com>
Use kvfree rather than DM_PARAMS_[KV]MALLOC specific param flags.
Cc: Shaohua Li <shli@kernel.org>
Cc: Mikulas Patocka <mpatocka@redhat.com>
Cc: dm-devel@redhat.com
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
Hi,
this is a rebase on top of dropped "dm: clean up GFP_NIO usage" which
should be dropped as per the feedback from Mikulas.
drivers/md/dm-ioctl.c | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index 2c7ca258c4e4..e66e5b43bc18 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1670,19 +1670,14 @@ static int check_version(unsigned int cmd, struct dm_ioctl __user *user)
return r;
}
-#define DM_PARAMS_KMALLOC 0x0001 /* Params alloced with kmalloc */
-#define DM_PARAMS_VMALLOC 0x0002 /* Params alloced with vmalloc */
-#define DM_WIPE_BUFFER 0x0010 /* Wipe input buffer before returning from ioctl */
+#define DM_WIPE_BUFFER 0x0001 /* Wipe input buffer before returning from ioctl */
static void free_params(struct dm_ioctl *param, size_t param_size, int param_flags)
{
if (param_flags & DM_WIPE_BUFFER)
memset(param, 0, param_size);
- if (param_flags & DM_PARAMS_KMALLOC)
- kfree(param);
- if (param_flags & DM_PARAMS_VMALLOC)
- vfree(param);
+ kvfree(param);
}
static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernel,
@@ -1714,19 +1709,14 @@ 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) {
+ if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
- if (dmi)
- *param_flags |= DM_PARAMS_KMALLOC;
- }
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);
- if (dmi)
- *param_flags |= DM_PARAMS_VMALLOC;
}
if (!dmi) {
--
2.8.0.rc3
[toc] | [prev] | [next] | [standalone]
| From | Mikulas Patocka <mpatocka@redhat.com> |
|---|---|
| Date | 2016-04-28 17:10 +0200 |
| Subject | Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsVJM-5u4-33@gated-at.bofh.it> |
| In reply to | #1390284 |
Acked-by: Mikulas Patocka <mpatocka@redhat.com>
BTW. we could also use kvmalloc to complement kvfree, proposed here:
https://www.redhat.com/archives/dm-devel/2015-July/msg00046.html
Mikulas
On Thu, 28 Apr 2016, Michal Hocko wrote:
> From: Michal Hocko <mhocko@suse.com>
>
> Use kvfree rather than DM_PARAMS_[KV]MALLOC specific param flags.
>
> Cc: Shaohua Li <shli@kernel.org>
> Cc: Mikulas Patocka <mpatocka@redhat.com>
> Cc: dm-devel@redhat.com
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> ---
> Hi,
> this is a rebase on top of dropped "dm: clean up GFP_NIO usage" which
> should be dropped as per the feedback from Mikulas.
>
> drivers/md/dm-ioctl.c | 16 +++-------------
> 1 file changed, 3 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
> index 2c7ca258c4e4..e66e5b43bc18 100644
> --- a/drivers/md/dm-ioctl.c
> +++ b/drivers/md/dm-ioctl.c
> @@ -1670,19 +1670,14 @@ static int check_version(unsigned int cmd, struct dm_ioctl __user *user)
> return r;
> }
>
> -#define DM_PARAMS_KMALLOC 0x0001 /* Params alloced with kmalloc */
> -#define DM_PARAMS_VMALLOC 0x0002 /* Params alloced with vmalloc */
> -#define DM_WIPE_BUFFER 0x0010 /* Wipe input buffer before returning from ioctl */
> +#define DM_WIPE_BUFFER 0x0001 /* Wipe input buffer before returning from ioctl */
>
> static void free_params(struct dm_ioctl *param, size_t param_size, int param_flags)
> {
> if (param_flags & DM_WIPE_BUFFER)
> memset(param, 0, param_size);
>
> - if (param_flags & DM_PARAMS_KMALLOC)
> - kfree(param);
> - if (param_flags & DM_PARAMS_VMALLOC)
> - vfree(param);
> + kvfree(param);
> }
>
> static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernel,
> @@ -1714,19 +1709,14 @@ 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) {
> + if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
> dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
> - if (dmi)
> - *param_flags |= DM_PARAMS_KMALLOC;
> - }
>
> 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);
> - if (dmi)
> - *param_flags |= DM_PARAMS_VMALLOC;
> }
>
> if (!dmi) {
> --
> 2.8.0.rc3
>
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-28 17:30 +0200 |
| Subject | Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsW37-5Ij-1@gated-at.bofh.it> |
| In reply to | #1390291 |
On Thu 28-04-16 11:04:05, Mikulas Patocka wrote: > Acked-by: Mikulas Patocka <mpatocka@redhat.com> Thanks! > BTW. we could also use kvmalloc to complement kvfree, proposed here: > https://www.redhat.com/archives/dm-devel/2015-July/msg00046.html If there are sufficient users (I haven't checked other than quick git grep on KMALLOC_MAX_SIZE and there do not seem that many) who are sharing the same fallback strategy then why not. But I suspect that some would rather fallback earlier and even do not attempt larger than e.g. order-1 requests. -- Michal Hocko SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | Mikulas Patocka <mpatocka@redhat.com> |
|---|---|
| Date | 2016-04-28 17:50 +0200 |
| Subject | Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsWmv-5UH-31@gated-at.bofh.it> |
| In reply to | #1390304 |
On Thu, 28 Apr 2016, Michal Hocko wrote: > On Thu 28-04-16 11:04:05, Mikulas Patocka wrote: > > Acked-by: Mikulas Patocka <mpatocka@redhat.com> > > Thanks! > > > BTW. we could also use kvmalloc to complement kvfree, proposed here: > > https://www.redhat.com/archives/dm-devel/2015-July/msg00046.html > > If there are sufficient users (I haven't checked other than quick git > grep on KMALLOC_MAX_SIZE the problem is that kmallocs with large sizes near KMALLOC_MAX_SIZE are unreliable, they'll randomly fail if memory is too fragmented. > and there do not seem that many) who are > sharing the same fallback strategy then why not. But I suspect that some > would rather fallback earlier and even do not attempt larger than e.g. > order-1 requests. > -- > Michal Hocko > SUSE Labs There are many users that use one of these patterns: if (size <= some_threshold) p = kmalloc(size); else p = vmalloc(size); or p = kmalloc(size); if (!p) p = vmalloc(size); For example: alloc_fdmem, seq_buf_alloc, setxattr, getxattr, ipc_alloc, pidlist_allocate, get_pages_array, alloc_bucket_locks, frame_vector_create. If you grep the kernel for vmalloc, you'll find this pattern over and over again. In alloc_large_system_hash, there is table = __vmalloc(size, GFP_ATOMIC, PAGE_KERNEL); - that is clearly wrong because __vmalloc doesn't respect GFP_ATOMIC Mikulas
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-28 19:00 +0200 |
| Subject | Re: [PATCH] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsXsf-74R-13@gated-at.bofh.it> |
| In reply to | #1390342 |
On Thu 28-04-16 11:40:59, Mikulas Patocka wrote: [...] > There are many users that use one of these patterns: > > if (size <= some_threshold) > p = kmalloc(size); > else > p = vmalloc(size); > > or > > p = kmalloc(size); > if (!p) > p = vmalloc(size); > > > For example: alloc_fdmem, seq_buf_alloc, setxattr, getxattr, ipc_alloc, > pidlist_allocate, get_pages_array, alloc_bucket_locks, > frame_vector_create. If you grep the kernel for vmalloc, you'll find this > pattern over and over again. It is certainly good to address a common pattern by a helper if it makes to code easier to follo IMHO. > > In alloc_large_system_hash, there is > table = __vmalloc(size, GFP_ATOMIC, PAGE_KERNEL); > - that is clearly wrong because __vmalloc doesn't respect GFP_ATOMIC I have seen this code some time already. I guess it was Al complaining about it but then I just forgot about it. I have no idea why GFP_ATOMIC was used there. This predates git times but it should be https://www.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.10/2.6.10-mm1/broken-out/alloc_large_system_hash-numa-interleaving.patch The changelog is quite verbose but no mention about this ugliness. So I do agree that the above should be fixed and a common helper might be interesting but I am afraid we are getting off topic here. Thanks! -- Michal Hocko SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | Mike Snitzer <snitzer@redhat.com> |
|---|---|
| Date | 2016-04-28 17:40 +0200 |
| Subject | Re: [PATCH 19/20] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsWcO-5NB-31@gated-at.bofh.it> |
| In reply to | #1390166 |
On Thu, Apr 28 2016 at 9:24am -0400, Michal Hocko <mhocko@kernel.org> wrote: > From: Michal Hocko <mhocko@suse.com> > > Use kvfree rather than DM_PARAMS_[KV]MALLOC specific param flags. > > Cc: Shaohua Li <shli@kernel.org> > Cc: Mikulas Patocka <mpatocka@redhat.com> > Cc: dm-devel@redhat.com > Signed-off-by: Michal Hocko <mhocko@suse.com> Nack, seriously, this is the 3rd time this patch has been attempted. Did you actually test the change? It'll crash very quickly, see: https://www.redhat.com/archives/dm-devel/2016-April/msg00103.html
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-04-28 18:10 +0200 |
| Subject | Re: [PATCH 19/20] md: simplify free_params for kmalloc vs vmalloc fallback |
| Message-ID | <rsWFQ-6n2-9@gated-at.bofh.it> |
| In reply to | #1390327 |
On Thu 28-04-16 11:37:31, Mike Snitzer wrote: > On Thu, Apr 28 2016 at 9:24am -0400, > Michal Hocko <mhocko@kernel.org> wrote: > > > From: Michal Hocko <mhocko@suse.com> > > > > Use kvfree rather than DM_PARAMS_[KV]MALLOC specific param flags. > > > > Cc: Shaohua Li <shli@kernel.org> > > Cc: Mikulas Patocka <mpatocka@redhat.com> > > Cc: dm-devel@redhat.com > > Signed-off-by: Michal Hocko <mhocko@suse.com> > > Nack, seriously, this is the 3rd time this patch has been attempted. > Did you actually test the change? It'll crash very quickly, see: > > https://www.redhat.com/archives/dm-devel/2016-April/msg00103.html You are right! My bad I should have checked the other callers! -- Michal Hocko SUSE Labs
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web