Re: [PATCH v3 1/7] kernel/fork: convert vma assignment to a memcpy
From: "Paul E. McKenney" <paulmck@kernel.org>
Date: 2023-01-26 17:28:23
Also in:
linux-arm-kernel, linux-mm, lkml
On Wed, Jan 25, 2023 at 05:34:49PM -0800, Andrew Morton wrote:
On Wed, 25 Jan 2023 16:50:01 -0800 Suren Baghdasaryan [off-list ref] wrote:quoted
On Wed, Jan 25, 2023 at 4:22 PM Andrew Morton [off-list ref] wrote:quoted
On Wed, 25 Jan 2023 15:35:48 -0800 Suren Baghdasaryan [off-list ref] wrote:quoted
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.
I ran an experiment memcpy()ing between a static array and an onstack
array, and KCSAN did not complain. But maybe I was setting it up wrong.
This is what I did:
long myid = (long)arg; /* different value for each task */
static unsigned long z1[10] = { 0 };
unsigned long z2[10];
...
memcpy(z1, z2, ARRAY_SIZE(z1) * sizeof(z1[0]));
for (zi = 0; zi < ARRAY_SIZE(z1); zi++)
z2[zi] += myid;
memcpy(z2, z1, ARRAY_SIZE(z1) * sizeof(z1[0]));
Adding Marco on CC for his thoughts.
Thanx, Paul