diff options
Diffstat (limited to 'kernel/livepatch/core.c')
-rw-r--r-- | kernel/livepatch/core.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index de9e45dca70f..88766bd91803 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c | |||
@@ -454,6 +454,7 @@ EXPORT_SYMBOL_GPL(klp_enable_patch); | |||
454 | * /sys/kernel/livepatch/<patch> | 454 | * /sys/kernel/livepatch/<patch> |
455 | * /sys/kernel/livepatch/<patch>/enabled | 455 | * /sys/kernel/livepatch/<patch>/enabled |
456 | * /sys/kernel/livepatch/<patch>/transition | 456 | * /sys/kernel/livepatch/<patch>/transition |
457 | * /sys/kernel/livepatch/<patch>/signal | ||
457 | * /sys/kernel/livepatch/<patch>/<object> | 458 | * /sys/kernel/livepatch/<patch>/<object> |
458 | * /sys/kernel/livepatch/<patch>/<object>/<function,sympos> | 459 | * /sys/kernel/livepatch/<patch>/<object>/<function,sympos> |
459 | */ | 460 | */ |
@@ -528,11 +529,40 @@ static ssize_t transition_show(struct kobject *kobj, | |||
528 | patch == klp_transition_patch); | 529 | patch == klp_transition_patch); |
529 | } | 530 | } |
530 | 531 | ||
532 | static ssize_t signal_store(struct kobject *kobj, struct kobj_attribute *attr, | ||
533 | const char *buf, size_t count) | ||
534 | { | ||
535 | struct klp_patch *patch; | ||
536 | int ret; | ||
537 | bool val; | ||
538 | |||
539 | patch = container_of(kobj, struct klp_patch, kobj); | ||
540 | |||
541 | /* | ||
542 | * klp_mutex lock is not grabbed here intentionally. It is not really | ||
543 | * needed. The race window is harmless and grabbing the lock would only | ||
544 | * hold the action back. | ||
545 | */ | ||
546 | if (patch != klp_transition_patch) | ||
547 | return -EINVAL; | ||
548 | |||
549 | ret = kstrtobool(buf, &val); | ||
550 | if (ret) | ||
551 | return ret; | ||
552 | |||
553 | if (val) | ||
554 | klp_send_signals(); | ||
555 | |||
556 | return count; | ||
557 | } | ||
558 | |||
531 | static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled); | 559 | static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled); |
532 | static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition); | 560 | static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition); |
561 | static struct kobj_attribute signal_kobj_attr = __ATTR_WO(signal); | ||
533 | static struct attribute *klp_patch_attrs[] = { | 562 | static struct attribute *klp_patch_attrs[] = { |
534 | &enabled_kobj_attr.attr, | 563 | &enabled_kobj_attr.attr, |
535 | &transition_kobj_attr.attr, | 564 | &transition_kobj_attr.attr, |
565 | &signal_kobj_attr.attr, | ||
536 | NULL | 566 | NULL |
537 | }; | 567 | }; |
538 | 568 | ||