Message ID | 20240327160520.791322-5-samuel.holland@sifive.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | riscv: Various text patching improvements | expand |
Context | Check | Description |
---|---|---|
conchuod/vmtest-fixes-PR | fail | merge-conflict |
Samuel Holland <samuel.holland@sifive.com> writes: > This reduces the number of variables and makes the code easier to parse. > > Signed-off-by: Samuel Holland <samuel.holland@sifive.com> > --- > > Changes in v2: > - Further simplify patch_insn_set()/patch_insn_write() loop conditions > - Use min() instead of min_t() since both sides are unsigned long Thanks for addressing the changes! Nice cleanup! Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
On Wed, Mar 27, 2024 at 09:04:43AM -0700, Samuel Holland wrote: > This reduces the number of variables and makes the code easier to parse. > > Signed-off-by: Samuel Holland <samuel.holland@sifive.com> > --- > > Changes in v2: > - Further simplify patch_insn_set()/patch_insn_write() loop conditions > - Use min() instead of min_t() since both sides are unsigned long > > arch/riscv/kernel/patch.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-) > > diff --git a/arch/riscv/kernel/patch.c b/arch/riscv/kernel/patch.c > index 9a1bce1adf5a..0d1700d1934c 100644 > --- a/arch/riscv/kernel/patch.c > +++ b/arch/riscv/kernel/patch.c > @@ -155,22 +155,24 @@ NOKPROBE_SYMBOL(__patch_insn_write); > > static int patch_insn_set(void *addr, u8 c, size_t len) > { > - size_t patched = 0; > size_t size; > - int ret = 0; > > /* > * __patch_insn_set() can only work on 2 pages at a time so call it in a > * loop with len <= 2 * PAGE_SIZE. > */ > - while (patched < len && !ret) { > - size = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(addr + patched), len - patched); > - ret = __patch_insn_set(addr + patched, c, size); > - > - patched += size; > } > > - return ret; > } Weren't these actively wrong before, if a non-ultimate __patch_insn_set() failed we'd just ignore the error? Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Thanks, Conor.
On Wed, Apr 24, 2024 at 11:44:17AM +0100, Conor Dooley wrote: > On Wed, Mar 27, 2024 at 09:04:43AM -0700, Samuel Holland wrote: > > This reduces the number of variables and makes the code easier to parse. > > > > Signed-off-by: Samuel Holland <samuel.holland@sifive.com> > > --- > > > > Changes in v2: > > - Further simplify patch_insn_set()/patch_insn_write() loop conditions > > - Use min() instead of min_t() since both sides are unsigned long > > > > arch/riscv/kernel/patch.c | 37 +++++++++++++++++++++---------------- > > 1 file changed, 21 insertions(+), 16 deletions(-) > > > > diff --git a/arch/riscv/kernel/patch.c b/arch/riscv/kernel/patch.c > > index 9a1bce1adf5a..0d1700d1934c 100644 > > --- a/arch/riscv/kernel/patch.c > > +++ b/arch/riscv/kernel/patch.c > > @@ -155,22 +155,24 @@ NOKPROBE_SYMBOL(__patch_insn_write); > > > > static int patch_insn_set(void *addr, u8 c, size_t len) > > { > > - size_t patched = 0; > > size_t size; > > - int ret = 0; > > > > /* > > * __patch_insn_set() can only work on 2 pages at a time so call it in a > > * loop with len <= 2 * PAGE_SIZE. > > */ > > - while (patched < len && !ret) { > > - size = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(addr + patched), len - patched); > > - ret = __patch_insn_set(addr + patched, c, size); > > - > > - patched += size; > > } > > > > - return ret; > > } > > Weren't these actively wrong before, if a non-ultimate > __patch_insn_set() failed we'd just ignore the error? nvm, failure to read on my part..
diff --git a/arch/riscv/kernel/patch.c b/arch/riscv/kernel/patch.c index 9a1bce1adf5a..0d1700d1934c 100644 --- a/arch/riscv/kernel/patch.c +++ b/arch/riscv/kernel/patch.c @@ -155,22 +155,24 @@ NOKPROBE_SYMBOL(__patch_insn_write); static int patch_insn_set(void *addr, u8 c, size_t len) { - size_t patched = 0; size_t size; - int ret = 0; + int ret; /* * __patch_insn_set() can only work on 2 pages at a time so call it in a * loop with len <= 2 * PAGE_SIZE. */ - while (patched < len && !ret) { - size = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(addr + patched), len - patched); - ret = __patch_insn_set(addr + patched, c, size); - - patched += size; + while (len) { + size = min(len, PAGE_SIZE * 2 - offset_in_page(addr)); + ret = __patch_insn_set(addr, c, size); + if (ret) + return ret; + + addr += size; + len -= size; } - return ret; + return 0; } NOKPROBE_SYMBOL(patch_insn_set); @@ -190,22 +192,25 @@ NOKPROBE_SYMBOL(patch_text_set_nosync); int patch_insn_write(void *addr, const void *insn, size_t len) { - size_t patched = 0; size_t size; - int ret = 0; + int ret; /* * Copy the instructions to the destination address, two pages at a time * because __patch_insn_write() can only handle len <= 2 * PAGE_SIZE. */ - while (patched < len && !ret) { - size = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(addr + patched), len - patched); - ret = __patch_insn_write(addr + patched, insn + patched, size); - - patched += size; + while (len) { + size = min(len, PAGE_SIZE * 2 - offset_in_page(addr)); + ret = __patch_insn_write(addr, insn, size); + if (ret) + return ret; + + addr += size; + insn += size; + len -= size; } - return ret; + return 0; } NOKPROBE_SYMBOL(patch_insn_write);
This reduces the number of variables and makes the code easier to parse. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> --- Changes in v2: - Further simplify patch_insn_set()/patch_insn_write() loop conditions - Use min() instead of min_t() since both sides are unsigned long arch/riscv/kernel/patch.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-)