signal/drbd: Use send_sig not force_sig
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 5 Feb 2019 23:25:02 +0000 (17:25 -0600)
committerEric W. Biederman <ebiederm@xmission.com>
Mon, 27 May 2019 14:36:28 +0000 (09:36 -0500)
The drbd module exclusively sends signals to kernel threads it creates with
kthread_create.  These kernel threads do not block or ignore signals (only
flush signals after they have been delivered), nor can drbd threads
possibly be pid namespace init processes so the extra work that force_sig
performs that send_sig does not is unnecessary.

Further force_sig is for delivering synchronous signals (aka exceptions).
The locking in force_sig is not prepared to deal with running processes, as
tsk->sighand may change during exec for a running process.

In short it is not only unnecessary for drbd to use force_sig it is
semantically wrong.

With drbd using send_sig it becomes easier to maintain force_sig as only
synchronous signals need to be considered.

Cc: Philipp Reisner <philipp.reisner@linbit.com>
Cc: Lars Ellenberg <lars.ellenberg@linbit.com>
Cc: drbd-dev@lists.linbit.com
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_nl.c

index 549c64df9708c8366b099ca4e398934256b3061c..03582943571063ab27d6606e2e8262edd2a0deb2 100644 (file)
@@ -1972,7 +1972,7 @@ static inline void wake_ack_receiver(struct drbd_connection *connection)
 {
        struct task_struct *task = connection->ack_receiver.task;
        if (task && get_t_state(&connection->ack_receiver) == RUNNING)
-               force_sig(SIGXCPU, task);
+               send_sig(SIGXCPU, task, 1);
 }
 
 static inline void request_ping(struct drbd_connection *connection)
index 714eb64fabfd1286b49837dfb937870e7bba1cd6..8597aefe027b8e2c7103097b6b9c9e2e07b2bc86 100644 (file)
@@ -477,7 +477,7 @@ void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait)
                smp_mb();
                init_completion(&thi->stop);
                if (thi->task != current)
-                       force_sig(DRBD_SIGKILL, thi->task);
+                       send_sig(DRBD_SIGKILL, thi->task, 1);
        }
 
        spin_unlock_irqrestore(&thi->t_lock, flags);
index 1cb5a0b85fd9603d0575a59958e8d23b4924622f..638b3ba9b9766a6f2714ecc560adc7aecec3192b 100644 (file)
@@ -611,7 +611,7 @@ void conn_try_outdate_peer_async(struct drbd_connection *connection)
        struct task_struct *opa;
 
        kref_get(&connection->kref);
-       /* We may just have force_sig()'ed this thread
+       /* We may have just sent a signal to this thread
         * to get it out of some blocking network function.
         * Clear signals; otherwise kthread_run(), which internally uses
         * wait_on_completion_killable(), will mistake our pending signal