From: James Bottomley <James.Bottomley@steeleye.com>
To: linux-scsi@vger.kernel.org
Subject: [PATCH] Eliminate signals entirely from the mid-layer
Date: Fri, 10 Jan 2003 16:19:30 -0500 [thread overview]
Message-ID: <200301102119.h0ALJUf05888@localhost.localdomain> (raw)
[-- Attachment #1: Type: text/plain, Size: 346 bytes --]
the attached patch removes SCSI's use of signals for killing the error handler
thread. It also:
- changes the eh_notify semaphore to a completion
- adds complete_and_exit() to the thread
- uses a host structure flag to signal thread death instead of the signal
I'm currently travelling, so could someone test it out for me? Thanks,
James
[-- Attachment #2: tmp.diff --]
[-- Type: text/plain , Size: 5782 bytes --]
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.947 -> 1.948
# drivers/scsi/scsi_error.c 1.26 -> 1.27
# drivers/scsi/hosts.c 1.42 -> 1.43
# drivers/scsi/hosts.h 1.47 -> 1.48
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/01/10 jejb@mulgrave.(none) 1.948
# remove SCSI's use of signals for killing the error handler thread
#
# - change the eh_notify semaphore to a completion
# - add complete_and_exit() to the thread
# - use a host structure flag to signal thread death instead of the signal
# --------------------------------------------
#
diff -Nru a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
--- a/drivers/scsi/hosts.c Fri Jan 10 16:14:02 2003
+++ b/drivers/scsi/hosts.c Fri Jan 10 16:14:02 2003
@@ -36,6 +36,7 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/list.h>
+#include <linux/completion.h>
#define __KERNEL_SYSCALLS__
@@ -335,10 +336,10 @@
* Next, kill the kernel error recovery thread for this host.
*/
if (shost->ehandler) {
- DECLARE_MUTEX_LOCKED(sem);
+ DECLARE_COMPLETION(sem);
shost->eh_notify = &sem;
- send_sig(SIGPWR, shost->ehandler, 1);
- down(&sem);
+ up(shost->eh_wait);
+ wait_for_completion(&sem);
shost->eh_notify = NULL;
}
@@ -368,7 +369,7 @@
{
struct Scsi_Host *shost, *shost_scr;
int gfp_mask;
- DECLARE_MUTEX_LOCKED(sem);
+ DECLARE_COMPLETION(sem);
/* Check to see if this host has any error handling facilities */
if(shost_tp->eh_strategy_handler == NULL &&
@@ -464,7 +465,7 @@
* Now wait for the kernel error thread to initialize itself
* as it might be needed when we scan the bus.
*/
- down(&sem);
+ wait_for_completion(&sem);
shost->eh_notify = NULL;
shost->hostt->present++;
diff -Nru a/drivers/scsi/hosts.h b/drivers/scsi/hosts.h
--- a/drivers/scsi/hosts.h Fri Jan 10 16:14:02 2003
+++ b/drivers/scsi/hosts.h Fri Jan 10 16:14:02 2003
@@ -381,11 +381,12 @@
struct task_struct * ehandler; /* Error recovery thread. */
struct semaphore * eh_wait; /* The error recovery thread waits on
this. */
- struct semaphore * eh_notify; /* wait for eh to begin */
+ struct completion * eh_notify; /* wait for eh to begin or end */
struct semaphore * eh_action; /* Wait for specific actions on the
host. */
unsigned int eh_active:1; /* Indicates the eh thread is awake and active if
this is true. */
+ unsigned int eh_kill:1; /* set when killing the eh thread */
wait_queue_head_t host_wait;
Scsi_Host_Template * hostt;
atomic_t host_active; /* commands checked out */
diff -Nru a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
--- a/drivers/scsi/scsi_error.c Fri Jan 10 16:14:02 2003
+++ b/drivers/scsi/scsi_error.c Fri Jan 10 16:14:02 2003
@@ -27,6 +27,7 @@
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/smp_lock.h>
+#include <linux/completion.h>
#define __KERNEL_SYSCALLS__
@@ -41,24 +42,6 @@
#include <scsi/scsi_ioctl.h> /* grr */
-/*
- * We must always allow SHUTDOWN_SIGS. Even if we are not a module,
- * the host drivers that we are using may be loaded as modules, and
- * when we unload these, we need to ensure that the error handler thread
- * can be shut down.
- *
- * Note - when we unload a module, we send a SIGHUP. We mustn't
- * enable SIGTERM, as this is how the init shuts things down when you
- * go to single-user mode. For that matter, init also sends SIGKILL,
- * so we mustn't enable that one either. We use SIGHUP instead. Other
- * options would be SIGPWR, I suppose.
- *
- * Changed behavior 1/1/2003 - it turns out, that SIGHUP can get sent
- * to error handlers from a process responsible for their creation.
- * To sidestep that issue, we now use SIGPWR as suggested above.
- */
-#define SHUTDOWN_SIGS (sigmask(SIGPWR))
-
#ifdef DEBUG
#define SENSE_TIMEOUT SCSI_TIMEOUT
#else
@@ -1593,12 +1576,10 @@
int rtn;
DECLARE_MUTEX_LOCKED(sem);
- /*
- * We only listen to signals if the HA was loaded as a module.
- * If the HA was compiled into the kernel, then we don't listen
- * to any signals.
- */
- siginitsetinv(¤t->blocked, SHUTDOWN_SIGS);
+ spin_lock_irq(¤t->sig->siglock);
+ sigfillset(¤t->blocked);
+ recalc_sigpending();
+ spin_unlock_irq(¤t->sig->siglock);
lock_kernel();
@@ -1624,7 +1605,7 @@
*/
SCSI_LOG_ERROR_RECOVERY(3, printk("Wake up parent of scsi_eh_%d\n",shost->host_no));
- up(shost->eh_notify);
+ complete(shost->eh_notify);
while (1) {
/*
@@ -1644,7 +1625,7 @@
* semaphores isn't unreasonable.
*/
down_interruptible(&sem);
- if (signal_pending(current))
+ if (shost->eh_kill)
break;
SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler scsi_eh_%d waking up\n",shost->host_no));
@@ -1695,13 +1676,9 @@
/*
* If anyone is waiting for us to exit (i.e. someone trying to unload
* a driver), then wake up that process to let them know we are on
- * the way out the door. This may be overkill - I *think* that we
- * could probably just unload the driver and send the signal, and when
- * the error handling thread wakes up that it would just exit without
- * needing to touch any memory associated with the driver itself.
+ * the way out the door.
*/
- if (shost->eh_notify != NULL)
- up(shost->eh_notify);
+ complete_and_exit(shost->eh_notify, 0);
}
/**
next reply other threads:[~2003-01-10 21:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-01-10 21:19 James Bottomley [this message]
2003-01-10 22:01 ` [PATCH] Eliminate signals entirely from the mid-layer Mike Anderson
2003-01-10 22:05 ` James Bottomley
2003-01-11 14:23 ` Willem Riede
2003-01-11 15:44 ` James Bottomley
2003-01-11 16:33 ` Mike Anderson
2003-01-11 16:47 ` Willem Riede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200301102119.h0ALJUf05888@localhost.localdomain \
--to=james.bottomley@steeleye.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.