Convert vma assignment in vm_area_dup() to a memcpy() to prevent compiler
errors when we add a const modifier to vma->vm_flags.
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
---
kernel/fork.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/fork.c b/kernel/fork.c
index 6683c1b0f460..a531901859d9 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -482,7 +482,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig)
* orig->shared.rb may be modified concurrently, but the clone
* will be reinitialized.
*/
- *new = data_race(*orig);
+ memcpy(new, orig, sizeof(*new));
INIT_LIST_HEAD(&new->anon_vma_chain);
dup_anon_vma_name(orig, new);
}
--
2.39.1
On Wed, 25 Jan 2023 15:35:48 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > Convert vma assignment in vm_area_dup() to a memcpy() to prevent compiler > errors when we add a const modifier to vma->vm_flags. > > ... > > --- a/kernel/fork.c > +++ b/kernel/fork.c > @@ -482,7 +482,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) > * orig->shared.rb may be modified concurrently, but the clone > * will be reinitialized. > */ > - *new = data_race(*orig); > + memcpy(new, orig, sizeof(*new)); The data_race() removal is unchangelogged? > INIT_LIST_HEAD(&new->anon_vma_chain); > dup_anon_vma_name(orig, new); > }
On Wed, Jan 25, 2023 at 4:22 PM Andrew Morton <akpm@linux-foundation.org> wrote: > > On Wed, 25 Jan 2023 15:35:48 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > > > Convert vma assignment in vm_area_dup() to a memcpy() to prevent compiler > > errors when we add a const modifier to vma->vm_flags. > > > > ... > > > > --- a/kernel/fork.c > > +++ b/kernel/fork.c > > @@ -482,7 +482,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) > > * orig->shared.rb may be modified concurrently, but the clone > > * will be reinitialized. > > */ > > - *new = data_race(*orig); > > + memcpy(new, orig, sizeof(*new)); > > The data_race() removal is unchangelogged? True. I'll add a note in the changelog about that. Ideally I would like to preserve it but I could not find a way to do that. > > > INIT_LIST_HEAD(&new->anon_vma_chain); > > dup_anon_vma_name(orig, new); > > } >
On Wed, 25 Jan 2023 16:50:01 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > On Wed, Jan 25, 2023 at 4:22 PM Andrew Morton <akpm@linux-foundation.org> wrote: > > > > On Wed, 25 Jan 2023 15:35:48 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > > > > > Convert vma assignment in vm_area_dup() to a memcpy() to prevent compiler > > > errors when we add a const modifier to vma->vm_flags. > > > > > > ... > > > > > > --- a/kernel/fork.c > > > +++ b/kernel/fork.c > > > @@ -482,7 +482,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) > > > * orig->shared.rb may be modified concurrently, but the clone > > > * will be reinitialized. > > > */ > > > - *new = data_race(*orig); > > > + memcpy(new, orig, sizeof(*new)); > > > > The data_race() removal is unchangelogged? > > True. I'll add a note in the changelog about that. Ideally I would > like to preserve it but I could not find a way to do that. > Perhaps Paul can comment? I wonder if KCSAN knows how to detect this race, given that it's now in a memcpy. I assume so.
On Wed, Jan 25, 2023 at 05:34:49PM -0800, Andrew Morton wrote: > On Wed, 25 Jan 2023 16:50:01 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > > > On Wed, Jan 25, 2023 at 4:22 PM Andrew Morton <akpm@linux-foundation.org> wrote: > > > > > > On Wed, 25 Jan 2023 15:35:48 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > > > > > > > Convert vma assignment in vm_area_dup() to a memcpy() to prevent compiler > > > > errors when we add a const modifier to vma->vm_flags. > > > > > > > > ... > > > > > > > > --- a/kernel/fork.c > > > > +++ b/kernel/fork.c > > > > @@ -482,7 +482,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) > > > > * orig->shared.rb may be modified concurrently, but the clone > > > > * will be reinitialized. > > > > */ > > > > - *new = data_race(*orig); > > > > + memcpy(new, orig, sizeof(*new)); > > > > > > The data_race() removal is unchangelogged? > > > > True. I'll add a note in the changelog about that. Ideally I would > > like to preserve it but I could not find a way to do that. > > > > Perhaps Paul can comment? > > I wonder if KCSAN knows how to detect this race, given that it's now in > a memcpy. I assume so. data_race() is just wrapping an expression around __kcsan_[en|dis]able_current and ensuring the expression is evaluated once and returning the correct type. I believe the following should be sufficient. diff --git a/kernel/fork.c b/kernel/fork.c index 9f7fe3541897..1b30ee568e02 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -472,7 +472,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) * orig->shared.rb may be modified concurrently, but the clone * will be reinitialized. */ - *new = data_race(*orig); + data_race(memcpy(new, orig, sizeof(*new))); INIT_LIST_HEAD(&new->anon_vma_chain); dup_anon_vma_name(orig, new); } I don't see how memcpy could automagically figure out whether the memcpy is prone to races or not in an arbitrary context. Assuming using data_race this way is ok then Acked-by: Mel Gorman <mgorman@techsingularity.net> -- Mel Gorman SUSE Labs
On Thu, Jan 26, 2023 at 3:52 AM Mel Gorman <mgorman@techsingularity.net> wrote: > > On Wed, Jan 25, 2023 at 05:34:49PM -0800, Andrew Morton wrote: > > On Wed, 25 Jan 2023 16:50:01 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > > > > > On Wed, Jan 25, 2023 at 4:22 PM Andrew Morton <akpm@linux-foundation.org> wrote: > > > > > > > > On Wed, 25 Jan 2023 15:35:48 -0800 Suren Baghdasaryan <surenb@google.com> wrote: > > > > > > > > > Convert vma assignment in vm_area_dup() to a memcpy() to prevent compiler > > > > > errors when we add a const modifier to vma->vm_flags. > > > > > > > > > > ... > > > > > > > > > > --- a/kernel/fork.c > > > > > +++ b/kernel/fork.c > > > > > @@ -482,7 +482,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) > > > > > * orig->shared.rb may be modified concurrently, but the clone > > > > > * will be reinitialized. > > > > > */ > > > > > - *new = data_race(*orig); > > > > > + memcpy(new, orig, sizeof(*new)); > > > > > > > > The data_race() removal is unchangelogged? > > > > > > True. I'll add a note in the changelog about that. Ideally I would > > > like to preserve it but I could not find a way to do that. > > > > > > > Perhaps Paul can comment? > > > > I wonder if KCSAN knows how to detect this race, given that it's now in > > a memcpy. I assume so. > > data_race() is just wrapping an expression around > __kcsan_[en|dis]able_current and ensuring the expression is evaluated once > and returning the correct type. I believe the following should be sufficient. Thanks for the suggestion, Mel! I'll try that. > > diff --git a/kernel/fork.c b/kernel/fork.c > index 9f7fe3541897..1b30ee568e02 100644 > --- a/kernel/fork.c > +++ b/kernel/fork.c > @@ -472,7 +472,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) > * orig->shared.rb may be modified concurrently, but the clone > * will be reinitialized. > */ > - *new = data_race(*orig); > + data_race(memcpy(new, orig, sizeof(*new))); > INIT_LIST_HEAD(&new->anon_vma_chain); > dup_anon_vma_name(orig, new); > } > > I don't see how memcpy could automagically figure out whether the memcpy > is prone to races or not in an arbitrary context. > > Assuming using data_race this way is ok then > > Acked-by: Mel Gorman <mgorman@techsingularity.net> Thanks! > > -- > Mel Gorman > SUSE Labs
© 2016 - 2025 Red Hat, Inc.