Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccf33d68 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

clockevents: Add module refcount



We want to be able to remove clockevent modules as well. Add a
refcount so we don't remove a module with an active clock event
device.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Magnus Damm <magnus.damm@gmail.com>
Link: http://lkml.kernel.org/r/20130425143436.307435149@linutronix.de


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 8c53daf6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ enum clock_event_nofitiers {
#include <linux/notifier.h>

struct clock_event_device;
struct module;

/* Clock event mode commands */
enum clock_event_mode {
@@ -83,6 +84,7 @@ enum clock_event_mode {
 * @irq:		IRQ number (only for non CPU local devices)
 * @cpumask:		cpumask to indicate for which CPUs this device works
 * @list:		list head for the management code
 * @owner:		module reference
 */
struct clock_event_device {
	void			(*event_handler)(struct clock_event_device *);
@@ -112,6 +114,7 @@ struct clock_event_device {
	int			irq;
	const struct cpumask	*cpumask;
	struct list_head	list;
	struct module		*owner;
} ____cacheline_aligned;

/*
+1 −0
Original line number Diff line number Diff line
@@ -357,6 +357,7 @@ void clockevents_exchange_device(struct clock_event_device *old,
	 * released list and do a notify add later.
	 */
	if (old) {
		module_put(old->owner);
		clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED);
		list_del(&old->list);
		list_add(&old->list, &clockevents_released);
+3 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/profile.h>
#include <linux/sched.h>
#include <linux/smp.h>
#include <linux/module.h>

#include "tick-internal.h"

@@ -73,6 +74,8 @@ void tick_install_broadcast_device(struct clock_event_device *dev)
	     tick_broadcast_device.evtdev->rating >= dev->rating) ||
	     (dev->features & CLOCK_EVT_FEAT_C3STOP))
		return;
	if (!try_module_get(dev->owner))
		return;

	clockevents_exchange_device(tick_broadcast_device.evtdev, dev);
	if (cur)
+4 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/percpu.h>
#include <linux/profile.h>
#include <linux/sched.h>
#include <linux/module.h>

#include <asm/irq_regs.h>

@@ -257,6 +258,9 @@ void tick_check_new_device(struct clock_event_device *newdev)
			goto out_bc;
	}

	if (!try_module_get(newdev->owner))
		return;

	/*
	 * Replace the eventually existing device by the new
	 * device. If the current device is the broadcast device, do