From: Petr Mladek <pmladek@suse.com> Date: 2016-03-03 16:52:25
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
4. Update some comments.
Changelog v3:
1. Moved -ENOSYS to -EINVAL in klp_write_module_reloc
2. Moved klp_matchaddr to use ftrace_location_range
Changelog v2:
1. Implement review comments by Michael
2. The previous version compared _NIP from the
wrong location to check for whether we
are going to a patched location
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
Signed-off-by: Torsten Duwe <redacted>
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
arch/powerpc/Kconfig | 3 +++
arch/powerpc/include/asm/livepatch.h | 47 +++++++++++++++++++++++++++++++++
arch/powerpc/kernel/Makefile | 1 +
arch/powerpc/kernel/entry_64.S | 50 ++++++++++++++++++++++++++++++++++++
arch/powerpc/kernel/livepatch.c | 29 +++++++++++++++++++++
include/linux/ftrace.h | 1 +
include/linux/livepatch.h | 2 ++
kernel/livepatch/core.c | 28 +++++++++++++++++---
kernel/trace/ftrace.c | 14 +++++++++-
9 files changed, 171 insertions(+), 4 deletions(-)
create mode 100644 arch/powerpc/include/asm/livepatch.h
create mode 100644 arch/powerpc/kernel/livepatch.c
@@ -0,0 +1,47 @@+/*+*livepatch.h-powerpc-specificKernelLivePatchingCore+*+*Copyright(C)2015SUSE+*+*Thisprogramisfreesoftware;youcanredistributeitand/or+*modifyitunderthetermsoftheGNUGeneralPublicLicense+*aspublishedbytheFreeSoftwareFoundation;eitherversion2+*oftheLicense,or(atyouroption)anylaterversion.+*+*Thisprogramisdistributedinthehopethatitwillbeuseful,+*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof+*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe+*GNUGeneralPublicLicenseformoredetails.+*+*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense+*alongwiththisprogram;ifnot,see<http://www.gnu.org/licenses/>.+*/+#ifndef _ASM_POWERPC64_LIVEPATCH_H+#define _ASM_POWERPC64_LIVEPATCH_H++#include<linux/module.h>++#ifdef CONFIG_LIVEPATCH++staticinlineintklp_check_compiler_support(void)+{+return0;+}++staticinlineintklp_write_module_reloc(structmodule*mod,unsignedlong+type,unsignedlongloc,unsignedlongvalue)+{+/* This requires infrastructure changes; we need the loadinfos. */+return-ENOSYS;+}++staticinlinevoidklp_arch_set_pc(structpt_regs*regs,unsignedlongip)+{+regs->nip=ip;+}++#else /* CONFIG_LIVEPATCH */+#error Include linux/livepatch.h, not asm/livepatch.h+#endif /* CONFIG_LIVEPATCH */++#endif /* _ASM_POWERPC64_LIVEPATCH_H */
@@ -1281,6 +1312,25 @@ _GLOBAL(ftrace_graph_stub) _GLOBAL(ftrace_stub)blr+#ifdef CONFIG_LIVEPATCH+/*Helperfunctionforlocalcallsthatarebecomingglobal+*duetolivepatching.+*Wecan't simply patch the NOP after the original call,+*because,dependingontheconsistencymodel,somekernel+*threadsmaystillhavecalledtheoriginal,localfunction+**without*savingtheirTOCintherespectivestackframeslot,+*sothedecisionismadeper-threadduringfunctionreturnby+*maybeinsertingaklp_return_helperframeornot.+*/+klp_return_helper:+ldr2,24(r1)/*restoreTOC (savedbyftrace_caller)*/+addir1,r1,32/*destroyministackframe*/+ldr0,LRSAVE(r1)/*gettherealreturnaddress*/+mtlrr0+blr+#endif++#else _GLOBAL_TOC(_mcount)/*Takenfromoutputofobjdumpfromlib64/glibc*/
@@ -455,6 +455,7 @@ int ftrace_update_record(struct dyn_ftrace *rec, int enable);intftrace_test_record(structdyn_ftrace*rec,intenable);voidftrace_run_stop_machine(intcommand);unsignedlongftrace_location(unsignedlongip);+unsignedlongftrace_location_range(unsignedlongstart,unsignedlongend);unsignedlongftrace_get_addr_new(structdyn_ftrace*rec);unsignedlongftrace_get_addr_curr(structdyn_ftrace*rec);
@@ -336,6 +354,10 @@ static int klp_enable_func(struct klp_func *func)if(WARN_ON(func->state!=KLP_DISABLED))return-EINVAL;+ftrace_loc=klp_get_ftrace_location(func->old_addr);+if(WARN_ON(!ftrace_loc))+return-EINVAL;+ops=klp_find_ops(func->old_addr);if(!ops){ops=kzalloc(sizeof(*ops),GFP_KERNEL);
@@ -352,7 +374,7 @@ static int klp_enable_func(struct klp_func *func)INIT_LIST_HEAD(&ops->func_stack);list_add_rcu(&func->stack_node,&ops->func_stack);-ret=ftrace_set_filter_ip(&ops->fops,func->old_addr,0,0);+ret=ftrace_set_filter_ip(&ops->fops,ftrace_loc,0,0);if(ret){pr_err("failed to set ftrace filter for function '%s' (%d)\n",func->old_name,ret);
@@ -363,7 +385,7 @@ static int klp_enable_func(struct klp_func *func)if(ret){pr_err("failed to register ftrace handler for function '%s' (%d)\n",func->old_name,ret);-ftrace_set_filter_ip(&ops->fops,func->old_addr,1,0);+ftrace_set_filter_ip(&ops->fops,ftrace_loc,1,0);gotoerr;}
On 4 Mar 2016 03:52, "Petr Mladek" [off-list ref] wrote:
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
4. Update some comments.
Changelog v3:
1. Moved -ENOSYS to -EINVAL in klp_write_module_reloc
2. Moved klp_matchaddr to use ftrace_location_range
Changelog v2:
1. Implement review comments by Michael
2. The previous version compared _NIP from the
wrong location to check for whether we
are going to a patched location
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
Signed-off-by: Torsten Duwe <redacted>
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
* Petr Mladek [off-list ref] [2016-03-03 17:52:01]:
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
4. Update some comments.
Changelog v3:
1. Moved -ENOSYS to -EINVAL in klp_write_module_reloc
2. Moved klp_matchaddr to use ftrace_location_range
Changelog v2:
1. Implement review comments by Michael
2. The previous version compared _NIP from the
wrong location to check for whether we
are going to a patched location
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
Signed-off-by: Torsten Duwe <redacted>
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Kamalesh Babulal <redacted>
I tried it, with the sample livepatch module.
Tested-by: Kamalesh Babulal <redacted>
Thanks,
Kamalesh.
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-03-04 07:58:54
Hi Petr,
On Thu, 2016-03-03 at 17:52 +0100, Petr Mladek wrote:
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
OK.
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
I don't know why we want to do that, I don't see how it is helpful. It doesn't
even do what it says:
+#ifdef CONFIG_LIVEPATCH
...
+#else /* CONFIG_LIVEPATCH */
+#error Include linux/livepatch.h, not asm/livepatch.h
+#endif /* CONFIG_LIVEPATCH */
If I turn on CONFIG_LIVEPATCH then I can quite happily include asm/livepatch.h
and not get an error. So the check doesn't do what the message suggests.
If we *really* want to prevent people from including asm/livepatch.h then it
needs to check for _LINUX_LIVEPATCH_H_. But there's no reason I can see why we
*must* prevent people from including asm/livepatch.h.
And on x86 & s390 it does:
#else
#error Live patching support is disabled; check CONFIG_LIVEPATCH
#endif
Which is also not helpful AFAICS, and just likely to break the build for no
good reason.
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-03-04 08:06:48
Hi livepatch maintainers,
On Thu, 2016-03-03 at 17:52 +0100, Petr Mladek wrote:
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
4. Update some comments.
Changelog v3:
1. Moved -ENOSYS to -EINVAL in klp_write_module_reloc
2. Moved klp_matchaddr to use ftrace_location_range
Changelog v2:
1. Implement review comments by Michael
2. The previous version compared _NIP from the
wrong location to check for whether we
are going to a patched location
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
Signed-off-by: Torsten Duwe <redacted>
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
arch/powerpc/Kconfig | 3 +++
arch/powerpc/include/asm/livepatch.h | 47 +++++++++++++++++++++++++++++++++
arch/powerpc/kernel/Makefile | 1 +
arch/powerpc/kernel/entry_64.S | 50 ++++++++++++++++++++++++++++++++++++
arch/powerpc/kernel/livepatch.c | 29 +++++++++++++++++++++
include/linux/ftrace.h | 1 +
include/linux/livepatch.h | 2 ++
kernel/livepatch/core.c | 28 +++++++++++++++++---
kernel/trace/ftrace.c | 14 +++++++++-
9 files changed, 171 insertions(+), 4 deletions(-)
create mode 100644 arch/powerpc/include/asm/livepatch.h
create mode 100644 arch/powerpc/kernel/livepatch.c
How should we go about merging this?
Obviously it depends heavily on the content of my series, which will go into
powerpc#next, so it would make sense if this went there too.
I don't see any changes in linux-next for livepatch, so merging it via powerpc
would probably work fine and not cause any conflicts, unless there's some
livepatch changes pending for 4.6 that aren't in linux-next yet?
The other option is that I put my ftrace changes and this in a topic branch
(based on v4.5-rc3), and then that can be merged into both powerpc#next and the
livepatch tree.
Also regardless of who takes it an Ack from Steve for the ftrace changes would
be good.
cheers
Obviously it depends heavily on the content of my series, which will go into
powerpc#next, so it would make sense if this went there too.
I don't see any changes in linux-next for livepatch, so merging it via powerpc
would probably work fine and not cause any conflicts, unless there's some
livepatch changes pending for 4.6 that aren't in linux-next yet?
The other option is that I put my ftrace changes and this in a topic branch
(based on v4.5-rc3), and then that can be merged into both powerpc#next and the
livepatch tree.
This aligns with my usual workflow, so that'd be my preferred way of doing
things; i.e. you put all the ftrace changes into a separate topic branch,
and then
- you pull that branch into powerpc#next
- I pull that branch into livepatching tree
- I apply the ppc livepatching support on top of that
- I send a pull request to Linus only after powerpc#next gets merged to
Linus' tree
Sounds good?
Also regardless of who takes it an Ack from Steve for the ftrace changes
would be good.
From: Miroslav Benes <mbenes@suse.cz> Date: 2016-03-04 09:31:43
Hi,
On Fri, 4 Mar 2016, Michael Ellerman wrote:
Hi Petr,
On Thu, 2016-03-03 at 17:52 +0100, Petr Mladek wrote:
quoted
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
OK.
quoted
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
I don't know why we want to do that, I don't see how it is helpful. It doesn't
even do what it says:
quoted
+#ifdef CONFIG_LIVEPATCH
...
quoted
+#else /* CONFIG_LIVEPATCH */
+#error Include linux/livepatch.h, not asm/livepatch.h
+#endif /* CONFIG_LIVEPATCH */
If I turn on CONFIG_LIVEPATCH then I can quite happily include asm/livepatch.h
and not get an error. So the check doesn't do what the message suggests.
Well, yes. I looked into the archives to find if there was a reason to
even introduce it. It was not. It came up during a review process of the
livepatching patch set somehow and we left it there. I only changed the
error message to the mentioned one because we deemed it was better.
If we *really* want to prevent people from including asm/livepatch.h then it
needs to check for _LINUX_LIVEPATCH_H_. But there's no reason I can see why we
*must* prevent people from including asm/livepatch.h.
And on x86 & s390 it does:
#else
#error Live patching support is disabled; check CONFIG_LIVEPATCH
#endif
Which is also not helpful AFAICS, and just likely to break the build for no
good reason.
This is the old message. See 383bf44d1a8b ("livepatch: change the error
message in asm/livepatch.h header files").
Anyway, it really does not mean much. I'll send a patch for s390 and x86
to remove it completely in a minute.
Thanks,
Miroslav
@@ -1281,6 +1312,25 @@ _GLOBAL(ftrace_graph_stub) _GLOBAL(ftrace_stub)blr+#ifdef CONFIG_LIVEPATCH+/*Helperfunctionforlocalcallsthatarebecomingglobal+*duetolivepatching.+*Wecan't simply patch the NOP after the original call,+*because,dependingontheconsistencymodel,somekernel+*threadsmaystillhavecalledtheoriginal,localfunction+**without*savingtheirTOCintherespectivestackframeslot,+*sothedecisionismadeper-threadduringfunctionreturnby+*maybeinsertingaklp_return_helperframeornot.+*/+klp_return_helper:+ldr2,24(r1)/*restoreTOC (savedbyftrace_caller)*/+addir1,r1,32/*destroyministackframe*/+ldr0,LRSAVE(r1)/*gettherealreturnaddress*/+mtlrr0+blr+#endif++#else _GLOBAL_TOC(_mcount)/*Takenfromoutputofobjdumpfromlib64/glibc*/
We need a caveat here, at least in the comments, even better
in some documentation, that the klp_return_helper shifts the stack layout.
This is relevant for functions with more than 8 fixed integer arguments
or for any varargs creator. As soon as the patch function is to replace
an original with arguments on the stack, the extra stack frame needs to
be accounted for.
Where shall we put this warning?
Torsten
@@ -1281,6 +1312,25 @@ _GLOBAL(ftrace_graph_stub) _GLOBAL(ftrace_stub)blr+#ifdef CONFIG_LIVEPATCH+/*Helperfunctionforlocalcallsthatarebecomingglobal+*duetolivepatching.+*Wecan't simply patch the NOP after the original call,+*because,dependingontheconsistencymodel,somekernel+*threadsmaystillhavecalledtheoriginal,localfunction+**without*savingtheirTOCintherespectivestackframeslot,+*sothedecisionismadeper-threadduringfunctionreturnby+*maybeinsertingaklp_return_helperframeornot.+*/+klp_return_helper:+ldr2,24(r1)/*restoreTOC (savedbyftrace_caller)*/+addir1,r1,32/*destroyministackframe*/+ldr0,LRSAVE(r1)/*gettherealreturnaddress*/+mtlrr0+blr+#endif++#else _GLOBAL_TOC(_mcount)/*Takenfromoutputofobjdumpfromlib64/glibc*/
We need a caveat here, at least in the comments, even better
in some documentation, that the klp_return_helper shifts the stack layout.
This is relevant for functions with more than 8 fixed integer arguments
or for any varargs creator. As soon as the patch function is to replace
an original with arguments on the stack, the extra stack frame needs to
be accounted for.
Do I understand it correctly that we could not patch functions that
pass arguments on the stack with this implementation? If yes, how hard
would be to get it working, please? At least, it would be great to
catch this problem and handle it with grace. Otherwise, it might
be hard to debug.
Where shall we put this warning?
Sadly, we do not have any Documentation/livepatch/ yet/.
I still hope that we could handle it somehow in the code.
Best Regards,
Petr
On Fri, Mar 04, 2016 at 02:01:37PM +0100, Petr Mladek wrote:
Do I understand it correctly that we could not patch functions that
pass arguments on the stack with this implementation? If yes, how hard
would be to get it working, please? At least, it would be great to
catch this problem and handle it with grace. Otherwise, it might
be hard to debug.
No, those functions only require special attention.
I needed _any_ location to store the caller's TOC;
and the stack is thread-safe and recursion-safe.
The current caller's frame is already full so I had
to create a new one.
A patch function could e.g. grab that TOC value in a
prologue and then pop that stack frame. Or it could
add those 32 bytes to the assumed arguments' stack offsets.
quoted
Where shall we put this warning?
Sadly, we do not have any Documentation/livepatch/ yet/.
I still hope that we could handle it somehow in the code.
I really think some documentation would be good, a live patch
howto for a start...
Torsten
On Fri, Mar 04, 2016 at 07:16:57PM +0100, Torsten Duwe wrote:
On Fri, Mar 04, 2016 at 02:01:37PM +0100, Petr Mladek wrote:
quoted
Do I understand it correctly that we could not patch functions that
pass arguments on the stack with this implementation? If yes, how hard
would be to get it working, please? At least, it would be great to
catch this problem and handle it with grace. Otherwise, it might
be hard to debug.
No, those functions only require special attention.
So far it's correct. It's been a while since I wrote that code.
I needed _any_ location to store the caller's TOC;
and the stack is thread-safe and recursion-safe.
The current caller's frame is already full so I had
to create a new one.
Correction: the TOC can be stored in the caller's stack frame at
the usual location. Only the restore instruction is a problem.
A patch function could e.g. grab that TOC value in a
prologue and then pop that stack frame. Or it could
add those 32 bytes to the assumed arguments' stack offsets.
So one solution could be to call the patch function via a small
trampoline or pre-prologue that just pops that frame, and have
the patch function restore R2 manually at the end.
Sorry for the confusion,
Torsten
Hi Petr,
On Thu, Mar 03, 2016 at 05:52:01PM +0100, Petr Mladek wrote:
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
4. Update some comments.
Changelog v3:
1. Moved -ENOSYS to -EINVAL in klp_write_module_reloc
2. Moved klp_matchaddr to use ftrace_location_range
Changelog v2:
1. Implement review comments by Michael
2. The previous version compared _NIP from the
wrong location to check for whether we
are going to a patched location
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
This commit message needs a rewrite. Most of the above information can
be moved to the diffstat section so it doesn't end up in the git log.
The log itself should be a straightforward description of the changes in
the patch itself.
@@ -455,6 +455,7 @@ int ftrace_update_record(struct dyn_ftrace *rec, int enable);intftrace_test_record(structdyn_ftrace*rec,intenable);voidftrace_run_stop_machine(intcommand);unsignedlongftrace_location(unsignedlongip);+unsignedlongftrace_location_range(unsignedlongstart,unsignedlongend);unsignedlongftrace_get_addr_new(structdyn_ftrace*rec);unsignedlongftrace_get_addr_curr(structdyn_ftrace*rec);
@@ -1281,6 +1312,25 @@ _GLOBAL(ftrace_graph_stub) _GLOBAL(ftrace_stub)blr+#ifdef CONFIG_LIVEPATCH+/*Helperfunctionforlocalcallsthatarebecomingglobal+*duetolivepatching.+*Wecan't simply patch the NOP after the original call,+*because,dependingontheconsistencymodel,somekernel+*threadsmaystillhavecalledtheoriginal,localfunction+**without*savingtheirTOCintherespectivestackframeslot,+*sothedecisionismadeper-threadduringfunctionreturnby+*maybeinsertingaklp_return_helperframeornot.+*/+klp_return_helper:+ldr2,24(r1)/*restoreTOC (savedbyftrace_caller)*/+addir1,r1,32/*destroyministackframe*/+ldr0,LRSAVE(r1)/*gettherealreturnaddress*/+mtlrr0+blr+#endif++#else _GLOBAL_TOC(_mcount)/*Takenfromoutputofobjdumpfromlib64/glibc*/
We need a caveat here, at least in the comments, even better
in some documentation, that the klp_return_helper shifts the stack layout.
This is relevant for functions with more than 8 fixed integer arguments
or for any varargs creator. As soon as the patch function is to replace
an original with arguments on the stack, the extra stack frame needs to
be accounted for.
Where shall we put this warning?
Good catch! We should just document it in livepatch.c (I suppose). I wonder if we can reuse the previous stack frame -- the caller into ftrace_caller. I think our arch.trampoline does bunch of the work anyway, klp_return_helper would just need to restore the right set of values
I hope I am thinking clearly on a Monday morning
Balbir Singh
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-03-07 03:30:06
On Fri, 2016-03-04 at 10:31 +0100, Miroslav Benes wrote:
On Fri, 4 Mar 2016, Michael Ellerman wrote:
quoted
On Thu, 2016-03-03 at 17:52 +0100, Petr Mladek wrote:
quoted
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
I don't know why we want to do that, I don't see how it is helpful. It doesn't
even do what it says:
quoted
+#ifdef CONFIG_LIVEPATCH
...
quoted
+#else /* CONFIG_LIVEPATCH */
+#error Include linux/livepatch.h, not asm/livepatch.h
+#endif /* CONFIG_LIVEPATCH */
If I turn on CONFIG_LIVEPATCH then I can quite happily include asm/livepatch.h
and not get an error. So the check doesn't do what the message suggests.
Well, yes. I looked into the archives to find if there was a reason to
even introduce it. It was not. It came up during a review process of the
livepatching patch set somehow and we left it there. I only changed the
error message to the mentioned one because we deemed it was better.
Thanks for looking into it.
quoted
And on x86 & s390 it does:
#else
#error Live patching support is disabled; check CONFIG_LIVEPATCH
#endif
This is the old message. See 383bf44d1a8b ("livepatch: change the error
message in asm/livepatch.h header files").
Anyway, it really does not mean much. I'll send a patch for s390 and x86
to remove it completely in a minute.
Thanks. I know it's not a big deal, but the kernel is complicated enough
without extra code we don't really need :)
cheers
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-03-07 10:06:12
On Fri, 2016-03-04 at 09:56 +0100, Jiri Kosina wrote:
On Fri, 4 Mar 2016, Michael Ellerman wrote:
quoted
Obviously it depends heavily on the content of my series, which will go into
powerpc#next, so it would make sense if this went there too.
I don't see any changes in linux-next for livepatch, so merging it via powerpc
would probably work fine and not cause any conflicts, unless there's some
livepatch changes pending for 4.6 that aren't in linux-next yet?
The other option is that I put my ftrace changes and this in a topic branch
(based on v4.5-rc3), and then that can be merged into both powerpc#next and the
livepatch tree.
This aligns with my usual workflow, so that'd be my preferred way of doing
things; i.e. you put all the ftrace changes into a separate topic branch,
and then
- you pull that branch into powerpc#next
- I pull that branch into livepatching tree
- I apply the ppc livepatching support on top of that
- I send a pull request to Linus only after powerpc#next gets merged to
Linus' tree
Sounds good?
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-03-07 23:20:34
On Mon, 2016-03-07 at 23:52 +0100, Jiri Kosina wrote:
On Mon, 7 Mar 2016, Michael Ellerman wrote:
quoted
quoted
This aligns with my usual workflow, so that'd be my preferred way of doing
things; i.e. you put all the ftrace changes into a separate topic branch,
and then
- you pull that branch into powerpc#next
- I pull that branch into livepatching tree
- I apply the ppc livepatching support on top of that
- I send a pull request to Linus only after powerpc#next gets merged to
Linus' tree
Sounds good?
I haven't merged it into my next yet, but I will tomorrow unless you tell me
there's something wrong with it.
There is one remaining issue which I think would be really nice to
have(TM), and that's Steven's Ack for the whole thing :)
Yeah. He's been on CC the whole time, but he's probably getting a bit sick of
it all, as we're up to about version 15. So I figure if he really hated it he'd
have said so by now :) - but an Ack would still be good.
For the livepatching part, I don't think we are quite there yet (so maybe
it'll miss the upcoming merge window anyway).
My primary worry there is what Torsten pointed out, i.e. functions with
either varargs or more than 8 args needing special care.
Yeah true. My preference would be to merge it, but mark LIVEPATCH as
experimental on powerpc. I think having it in the tree would help it get more
testing, and probably find other bugs too. But it's up to you guys.
Also, I'd like to have this positively reviewed by at least one more
livepatching maintainer (I am currently looking into it myself, but my
understanding of powerpc arch is rather low, so the more eyes, the
better).
Sure. I can answer powerpc questions, though Torsten is probably the person who
has the best understanding of (livepatching && powerpc).
cheers
On Mon, Mar 07, 2016 at 11:52:31PM +0100, Jiri Kosina wrote:
On Mon, 7 Mar 2016, Michael Ellerman wrote:
quoted
quoted
This aligns with my usual workflow, so that'd be my preferred way of doing
things; i.e. you put all the ftrace changes into a separate topic branch,
and then
- you pull that branch into powerpc#next
- I pull that branch into livepatching tree
- I apply the ppc livepatching support on top of that
- I send a pull request to Linus only after powerpc#next gets merged to
Linus' tree
Sounds good?
I haven't merged it into my next yet, but I will tomorrow unless you tell me
there's something wrong with it.
There is one remaining issue which I think would be really nice to
have(TM), and that's Steven's Ack for the whole thing :)
For the livepatching part, I don't think we are quite there yet (so maybe
it'll miss the upcoming merge window anyway).
My primary worry there is what Torsten pointed out, i.e. functions with
either varargs or more than 8 args needing special care.
Also, I'd like to have this positively reviewed by at least one more
livepatching maintainer (I am currently looking into it myself, but my
understanding of powerpc arch is rather low, so the more eyes, the
better).
It's been a few years but I'll try to dust off my powerpc chops and give
it a proper review.
--
Josh
This aligns with my usual workflow, so that'd be my preferred way of doing
things; i.e. you put all the ftrace changes into a separate topic branch,
and then
- you pull that branch into powerpc#next
- I pull that branch into livepatching tree
- I apply the ppc livepatching support on top of that
- I send a pull request to Linus only after powerpc#next gets merged to
Linus' tree
Sounds good?
I haven't merged it into my next yet, but I will tomorrow unless you tell me
there's something wrong with it.
There is one remaining issue which I think would be really nice to
have(TM), and that's Steven's Ack for the whole thing :)
For the livepatching part, I don't think we are quite there yet (so maybe
it'll miss the upcoming merge window anyway).
My primary worry there is what Torsten pointed out, i.e. functions with
either varargs or more than 8 args needing special care.
Also, I'd like to have this positively reviewed by at least one more
livepatching maintainer (I am currently looking into it myself, but my
understanding of powerpc arch is rather low, so the more eyes, the
better).
Thanks!
--
Jiri Kosina
SUSE Labs
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-03-08 01:53:22
On Tue, 08 Mar 2016 10:20:22 +1100
Michael Ellerman [off-list ref] wrote:
quoted
There is one remaining issue which I think would be really nice to
have(TM), and that's Steven's Ack for the whole thing :)
Yeah. He's been on CC the whole time, but he's probably getting a bit sick of
it all, as we're up to about version 15. So I figure if he really hated it he'd
have said so by now :) - but an Ack would still be good.
I figured this is all powerpc work, and you can crash what you like :-)
If you want, I can try to get some time tomorrow and take a quick look
at the patches. But yeah, I haven't been paying too much attention to
this.
-- Steve
On Fri, Mar 04, 2016 at 08:22:22PM +0100, Torsten Duwe wrote:
On Fri, Mar 04, 2016 at 07:16:57PM +0100, Torsten Duwe wrote:
quoted
On Fri, Mar 04, 2016 at 02:01:37PM +0100, Petr Mladek wrote:
quoted
Do I understand it correctly that we could not patch functions that
pass arguments on the stack with this implementation? If yes, how hard
would be to get it working, please? At least, it would be great to
catch this problem and handle it with grace. Otherwise, it might
be hard to debug.
No, those functions only require special attention.
So far it's correct. It's been a while since I wrote that code.
quoted
I needed _any_ location to store the caller's TOC;
and the stack is thread-safe and recursion-safe.
The current caller's frame is already full so I had
to create a new one.
Correction: the TOC can be stored in the caller's stack frame at
the usual location. Only the restore instruction is a problem.
Another correction :-( This is true only for local calls
-*> Which become *global* calls due to live patching <*-
For callers that made a global call to the patched function originally,
they already _have_ stored their TOC value there, and the r2 they enter
ftrace caller with is bogus.
I see no way to determine which is the case, so my code preserves both:
24(r1) in the caller's frame is left untouched. R2, as it came, is saved in
the mini stack frame, as well as the caller's return address (LR,
shifted 1 frame). Remember, LR got modified to point to klp_return_helper.
Removing this auxiliary stack frame causes even more problems than it solves.
So one solution could be to call the patch function via a small
trampoline or pre-prologue that just pops that frame, and have
the patch function restore R2 manually at the end.
I'll try to demonstrate that. It's not so hard. And klp_return_helper will
do the right thing for >90% of all function replacements automatically.
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-03-08 21:43:12
On Thu, 3 Mar 2016 17:52:01 +0100
Petr Mladek [off-list ref] wrote:
From: Balbir Singh <bsingharora@gmail.com>
Changelog v4:
1. Renamed klp_matchaddr() to klp_get_ftrace_location()
and used it just to convert the function address.
2. Synced klp_write_module_reloc() with s390(); made it
inline, no error message, return -ENOSYS
3. Added an error message when including
powerpc/include/asm/livepatch.h without HAVE_LIVEPATCH
4. Update some comments.
Changelog v3:
1. Moved -ENOSYS to -EINVAL in klp_write_module_reloc
2. Moved klp_matchaddr to use ftrace_location_range
Changelog v2:
1. Implement review comments by Michael
2. The previous version compared _NIP from the
wrong location to check for whether we
are going to a patched location
This applies on top of the patches posted by Michael
https://patchwork.ozlabs.org/patch/589791/
It enables livepatching. This takes patch 6/8 and 7/8 of v8 as the base.
(See the reference [1] below) and adds logic for checking offset ranges
in livepatch with ftrace_location_range.
I tested the sample in the livepatch
Signed-off-by: Torsten Duwe <redacted>
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
arch/powerpc/Kconfig | 3 +++
arch/powerpc/include/asm/livepatch.h | 47 +++++++++++++++++++++++++++++++++
arch/powerpc/kernel/Makefile | 1 +
arch/powerpc/kernel/entry_64.S | 50 ++++++++++++++++++++++++++++++++++++
arch/powerpc/kernel/livepatch.c | 29 +++++++++++++++++++++
include/linux/ftrace.h | 1 +
include/linux/livepatch.h | 2 ++
kernel/livepatch/core.c | 28 +++++++++++++++++---
kernel/trace/ftrace.c | 14 +++++++++-
For the changes to the ftrace files, add my:
Acked-by: Steven Rostedt <rostedt@goodmis.org>
You can take the rest.
-- Steve
@@ -455,6 +455,7 @@ int ftrace_update_record(struct dyn_ftrace *rec, int enable);intftrace_test_record(structdyn_ftrace*rec,intenable);voidftrace_run_stop_machine(intcommand);unsignedlongftrace_location(unsignedlongip);+unsignedlongftrace_location_range(unsignedlongstart,unsignedlongend);unsignedlongftrace_get_addr_new(structdyn_ftrace*rec);unsignedlongftrace_get_addr_curr(structdyn_ftrace*rec);