.. | .. |
---|
32 | 32 | #include <linux/pid_namespace.h> |
---|
33 | 33 | |
---|
34 | 34 | #include <linux/cn_proc.h> |
---|
| 35 | +#include <linux/locallock.h> |
---|
35 | 36 | |
---|
36 | 37 | /* |
---|
37 | 38 | * Size of a cn_msg followed by a proc_event structure. Since the |
---|
.. | .. |
---|
54 | 55 | |
---|
55 | 56 | /* proc_event_counts is used as the sequence number of the netlink message */ |
---|
56 | 57 | static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 }; |
---|
| 58 | +static DEFINE_LOCAL_IRQ_LOCK(send_msg_lock); |
---|
57 | 59 | |
---|
58 | 60 | static inline void send_msg(struct cn_msg *msg) |
---|
59 | 61 | { |
---|
60 | | - preempt_disable(); |
---|
| 62 | + local_lock(send_msg_lock); |
---|
61 | 63 | |
---|
62 | 64 | msg->seq = __this_cpu_inc_return(proc_event_counts) - 1; |
---|
63 | 65 | ((struct proc_event *)msg->data)->cpu = smp_processor_id(); |
---|
.. | .. |
---|
70 | 72 | */ |
---|
71 | 73 | cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_NOWAIT); |
---|
72 | 74 | |
---|
73 | | - preempt_enable(); |
---|
| 75 | + local_unlock(send_msg_lock); |
---|
74 | 76 | } |
---|
75 | 77 | |
---|
76 | 78 | void proc_fork_connector(struct task_struct *task) |
---|