linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()
@ 2018-10-25 13:16 Peng Wang
  0 siblings, 0 replies; 5+ messages in thread
From: Peng Wang @ 2018-10-25 13:16 UTC (permalink / raw)
  To: linux-kernel; +Cc: Peng Wang

When initialing przs with invalid data in buffer(no PERSISTENT_RAM_SIG),
function call path is like this:

ramoops_init_prz ->
|
|-> persistent_ram_new -> persistent_ram_post_init -> persistent_ram_zap
|
|--> persistent_ram_zap

As we can see, persistent_ram_zap() is called twice.
We can avoid this by removing it in ramoops_init_prz(),
and only call it in persistent_ram_post_init().

Signed-off-by: Peng Wang <wangpeng15@xiaomi.com>
---
 fs/pstore/ram.c      | 2 --
 fs/pstore/ram_core.c | 3 +--
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index f4fd2e7..d2a3932 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -639,8 +639,6 @@ static int ramoops_init_prz(const char *name,
 		return err;
 	}
 
-	persistent_ram_zap(*prz);
-
 	*paddr += sz;
 
 	return 0;
diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c
index 0792595..3ab4f34 100644
--- a/fs/pstore/ram_core.c
+++ b/fs/pstore/ram_core.c
@@ -504,15 +504,14 @@ static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig,
 			pr_debug("found existing buffer, size %zu, start %zu\n",
 				 buffer_size(prz), buffer_start(prz));
 			persistent_ram_save_old(prz);
-			return 0;
 		}
 	} else {
 		pr_debug("no valid data in buffer (sig = 0x%08x)\n",
 			 prz->buffer->sig);
+		prz->buffer->sig = sig;
 	}
 
 	/* Rewind missing or invalid memory area. */
-	prz->buffer->sig = sig;
 	persistent_ram_zap(prz);
 
 	return 0;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()
  2018-10-27  8:52   ` Peng15 Wang 王鹏
@ 2018-10-28 15:46     ` Kees Cook
  0 siblings, 0 replies; 5+ messages in thread
From: Kees Cook @ 2018-10-28 15:46 UTC (permalink / raw)
  To: Peng15 Wang 王鹏
  Cc: anton, ccross, tony.luck, linux-kernel, Joel Fernandes

On Sat, Oct 27, 2018 at 9:52 AM, Peng15 Wang 王鹏 <wangpeng15@xiaomi.com> wrote:
>
>
> ________________________________________
>>From: Kees Cook <keescook@chromium.org>
>>Sent: Friday, October 26, 2018 17:44
>>To: Peng15 Wang 王鹏
>>Cc: anton@enomsg.org; ccross@android.com; tony.luck@intel.com; linux-kernel@vger.kernel.org
>>Subject: Re: [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()
>
>>On Fri, Oct 26, 2018 at 4:41 AM, Peng15 Wang 王鹏 <wangpeng15@xiaomi.com> wrote:
>>> From: Peng Wang <wangpeng15@xiaomi.com>
>>>
>>> When initialing przs with invalid data in buffer(no PERSISTENT_RAM_SIG),
>>> function call path is like this:
>>>
>>> ramoops_init_prz ->
>>> |
>>> |-> persistent_ram_new -> persistent_ram_post_init -> persistent_ram_zap
>>> |
>>> |--> persistent_ram_zap
>>
>>There does appear to be a duplicate call to persistent_ram_zap() in this case.
>>
>>> As we can see, persistent_ram_zap() is called twice.
>>> We can avoid this by removing it in ramoops_init_prz(),
>>>and only call it in persistent_ram_post_init().
>>
>>However, I think the proposed fix doesn't work the way it should.
>>
>>There are two prz init paths: ramoops_init_prz() (a single prz) and
>>ramoops_init_przs (multiple przs). The "dump" and "ftrace" cases use
>>the latter. In those, there is no call to persistent_ram_zap() if the
>>buffer is valid.
>>
>>In other words:
>>
>>ramoops_init_prz() unconditionally calls persistent_ram_zap(). (And
>>may call it twice if there is a mismatch of the magic header.)
>>
>>ramoops_init_przs() only calls persistent_ram_zap() when the magic
>>header is wrong.
>>
>>The proposed patch unconditionally zaps all regions, which means we'd
>>lose "dump" and "ftrace" across the next reboot.
>>
>>Perhaps we could make it an option to persistent_ram_new()?
>>
>>--
>>Kees Cook
>
> Thanks for your reply.
>
> You are right, this patch does zap regions unconditionally when it comes to "dump" and
> "ftrace". Sorry for the inconvenience owing to my previous mistake.

No problem at all! I'm glad you started this conversation, since it
was a subtle aspect of the code that I didn't understand until I took
a closer look at it. :)

> I have tried adding an option to persistent_ram_new() according to your advice and will send
> a V2 version patch later. Could you please kindly pay any attention to it? Thank you!

Yes, thanks! I've added Joel to CC as well, since he was doing clean
ups in a related area. I think we'll probably combine the efforts.

-kees

-- 
Kees Cook

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()
  2018-10-26  9:44 ` Kees Cook
@ 2018-10-27  8:52   ` Peng15 Wang 王鹏
  2018-10-28 15:46     ` Kees Cook
  0 siblings, 1 reply; 5+ messages in thread
From: Peng15 Wang 王鹏 @ 2018-10-27  8:52 UTC (permalink / raw)
  To: Kees Cook; +Cc: anton, ccross, tony.luck, linux-kernel



________________________________________
>From: Kees Cook <keescook@chromium.org>
>Sent: Friday, October 26, 2018 17:44
>To: Peng15 Wang 王鹏
>Cc: anton@enomsg.org; ccross@android.com; tony.luck@intel.com; linux-kernel@vger.kernel.org
>Subject: Re: [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()

>On Fri, Oct 26, 2018 at 4:41 AM, Peng15 Wang 王鹏 <wangpeng15@xiaomi.com> wrote:
>> From: Peng Wang <wangpeng15@xiaomi.com>
>>
>> When initialing przs with invalid data in buffer(no PERSISTENT_RAM_SIG),
>> function call path is like this:
>>
>> ramoops_init_prz ->
>> |
>> |-> persistent_ram_new -> persistent_ram_post_init -> persistent_ram_zap
>> |
>> |--> persistent_ram_zap
>
>There does appear to be a duplicate call to persistent_ram_zap() in this case.
>
>> As we can see, persistent_ram_zap() is called twice.
>> We can avoid this by removing it in ramoops_init_prz(),
>>and only call it in persistent_ram_post_init().
>
>However, I think the proposed fix doesn't work the way it should.
>
>There are two prz init paths: ramoops_init_prz() (a single prz) and
>ramoops_init_przs (multiple przs). The "dump" and "ftrace" cases use
>the latter. In those, there is no call to persistent_ram_zap() if the
>buffer is valid.
>
>In other words:
>
>ramoops_init_prz() unconditionally calls persistent_ram_zap(). (And
>may call it twice if there is a mismatch of the magic header.)
>
>ramoops_init_przs() only calls persistent_ram_zap() when the magic
>header is wrong.
>
>The proposed patch unconditionally zaps all regions, which means we'd
>lose "dump" and "ftrace" across the next reboot.
>
>Perhaps we could make it an option to persistent_ram_new()?
>
>--
>Kees Cook

Thanks for your reply. 

You are right, this patch does zap regions unconditionally when it comes to "dump" and
"ftrace". Sorry for the inconvenience owing to my previous mistake.

I have tried adding an option to persistent_ram_new() according to your advice and will send
a V2 version patch later. Could you please kindly pay any attention to it? Thank you!

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()
  2018-10-26  3:41 Peng15 Wang 王鹏
@ 2018-10-26  9:44 ` Kees Cook
  2018-10-27  8:52   ` Peng15 Wang 王鹏
  0 siblings, 1 reply; 5+ messages in thread
From: Kees Cook @ 2018-10-26  9:44 UTC (permalink / raw)
  To: Peng15 Wang 王鹏; +Cc: anton, ccross, tony.luck, linux-kernel

On Fri, Oct 26, 2018 at 4:41 AM, Peng15 Wang 王鹏 <wangpeng15@xiaomi.com> wrote:
> From: Peng Wang <wangpeng15@xiaomi.com>
>
> When initialing przs with invalid data in buffer(no PERSISTENT_RAM_SIG),
> function call path is like this:
>
> ramoops_init_prz ->
> |
> |-> persistent_ram_new -> persistent_ram_post_init -> persistent_ram_zap
> |
> |--> persistent_ram_zap

There does appear to be a duplicate call to persistent_ram_zap() in this case.

> As we can see, persistent_ram_zap() is called twice.
> We can avoid this by removing it in ramoops_init_prz(),
> and only call it in persistent_ram_post_init().

However, I think the proposed fix doesn't work the way it should.

There are two prz init paths: ramoops_init_prz() (a single prz) and
ramoops_init_przs (multiple przs). The "dump" and "ftrace" cases use
the latter. In those, there is no call to persistent_ram_zap() if the
buffer is valid.

In other words:

ramoops_init_prz() unconditionally calls persistent_ram_zap(). (And
may call it twice if there is a mismatch of the magic header.)

ramoops_init_przs() only calls persistent_ram_zap() when the magic
header is wrong.

The proposed patch unconditionally zaps all regions, which means we'd
lose "dump" and "ftrace" across the next reboot.

Perhaps we could make it an option to persistent_ram_new()?

-- 
Kees Cook

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap()
@ 2018-10-26  3:41 Peng15 Wang 王鹏
  2018-10-26  9:44 ` Kees Cook
  0 siblings, 1 reply; 5+ messages in thread
From: Peng15 Wang 王鹏 @ 2018-10-26  3:41 UTC (permalink / raw)
  To: keescook, anton, ccross, tony.luck; +Cc: linux-kernel

From: Peng Wang <wangpeng15@xiaomi.com>

When initialing przs with invalid data in buffer(no PERSISTENT_RAM_SIG),
function call path is like this:

ramoops_init_prz ->
|
|-> persistent_ram_new -> persistent_ram_post_init -> persistent_ram_zap
|
|--> persistent_ram_zap

As we can see, persistent_ram_zap() is called twice.
We can avoid this by removing it in ramoops_init_prz(),
and only call it in persistent_ram_post_init().

Signed-off-by: Peng Wang <wangpeng15@xiaomi.com>
---
 fs/pstore/ram.c      | 2 --
 fs/pstore/ram_core.c | 3 +--
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index ffcff6516e89..3f57074a4fab 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -649,8 +649,6 @@ static int ramoops_init_prz(const char *name,
 		return err;
 	}
 
-	persistent_ram_zap(*prz);
-
 	*paddr += sz;
 
 	return 0;
diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c
index 12e21f789194..3ef0fd5a7cd5 100644
--- a/fs/pstore/ram_core.c
+++ b/fs/pstore/ram_core.c
@@ -505,15 +505,14 @@ static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig,
 			pr_debug("found existing buffer, size %zu, start %zu\n",
 				 buffer_size(prz), buffer_start(prz));
 			persistent_ram_save_old(prz);
-			return 0;
 		}
 	} else {
 		pr_debug("no valid data in buffer (sig = 0x%08x)\n",
 			 prz->buffer->sig);
+		prz->buffer->sig = sig;
 	}
 
 	/* Rewind missing or invalid memory area. */
-	prz->buffer->sig = sig;
 	persistent_ram_zap(prz);
 
 	return 0;
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-10-28 15:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-25 13:16 [PATCH] pstore: Remove duplicate invoking of persistent_ram_zap() Peng Wang
2018-10-26  3:41 Peng15 Wang 王鹏
2018-10-26  9:44 ` Kees Cook
2018-10-27  8:52   ` Peng15 Wang 王鹏
2018-10-28 15:46     ` Kees Cook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).