aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/livepatch/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/livepatch/core.c')
-rw-r--r--kernel/livepatch/core.c30
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
532static 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
531static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled); 559static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled);
532static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition); 560static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition);
561static struct kobj_attribute signal_kobj_attr = __ATTR_WO(signal);
533static struct attribute *klp_patch_attrs[] = { 562static 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