Commit c9602ee7 authored by Kees Cook's avatar Kees Cook Committed by Heiko Carstens
Browse files

s390/sclp: Convert timers to use timer_setup()



In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly. Instead of creating an external static
data variable, just define a separate callback which encodes the "force
restart" desire.

Cc: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
[heiko.carstens@de.ibm.com: get rid of compile warning]
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent 846d0c6f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -282,9 +282,9 @@ static void raw3215_start_io(struct raw3215_info *raw)
/*
 * Function to start a delayed output after RAW3215_TIMEOUT seconds
 */
static void raw3215_timeout(unsigned long __data)
static void raw3215_timeout(struct timer_list *t)
{
	struct raw3215_info *raw = (struct raw3215_info *) __data;
	struct raw3215_info *raw = from_timer(raw, t, timer);
	unsigned long flags;

	spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
@@ -670,7 +670,7 @@ static struct raw3215_info *raw3215_alloc_info(void)
		return NULL;
	}

	setup_timer(&info->timer, raw3215_timeout, (unsigned long)info);
	timer_setup(&info->timer, raw3215_timeout, 0);
	init_waitqueue_head(&info->empty_wait);
	tasklet_init(&info->tlet, raw3215_wakeup, (unsigned long)info);
	tty_port_init(&info->port);
+5 −5
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ static struct con3270 *condev;
#define CON_UPDATE_STATUS	4	/* Update status line. */
#define CON_UPDATE_ALL		8	/* Recreate screen. */

static void con3270_update(struct con3270 *);
static void con3270_update(struct timer_list *);

/*
 * Setup timeout for a device. On timeout trigger an update.
@@ -205,8 +205,9 @@ con3270_write_callback(struct raw3270_request *rq, void *data)
 * Update console display.
 */
static void
con3270_update(struct con3270 *cp)
con3270_update(struct timer_list *t)
{
	struct con3270 *cp = from_timer(cp, t, timer);
	struct raw3270_request *wrq;
	char wcc, prolog[6];
	unsigned long flags;
@@ -552,7 +553,7 @@ con3270_flush(void)
	con3270_update_status(cp);
	while (cp->update_flags != 0) {
		spin_unlock_irqrestore(&cp->view.lock, flags);
		con3270_update(cp);
		con3270_update(&cp->timer);
		spin_lock_irqsave(&cp->view.lock, flags);
		con3270_wait_write(cp);
	}
@@ -623,8 +624,7 @@ con3270_init(void)

	INIT_LIST_HEAD(&condev->lines);
	INIT_LIST_HEAD(&condev->update);
	setup_timer(&condev->timer, (void (*)(unsigned long)) con3270_update,
		    (unsigned long) condev);
	timer_setup(&condev->timer, con3270_update, 0);
	tasklet_init(&condev->readlet, 
		     (void (*)(unsigned long)) con3270_read_tasklet,
		     (unsigned long) condev->read);
+26 −19
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ static enum sclp_suspend_state_t {
#define SCLP_BUSY_INTERVAL	10
#define SCLP_RETRY_INTERVAL	30

static void sclp_request_timeout(bool force_restart);
static void sclp_process_queue(void);
static void __sclp_make_read_req(void);
static int sclp_init_mask(int calculate);
@@ -154,25 +155,32 @@ __sclp_queue_read_req(void)

/* Set up request retry timer. Called while sclp_lock is locked. */
static inline void
__sclp_set_request_timer(unsigned long time, void (*function)(unsigned long),
			 unsigned long data)
__sclp_set_request_timer(unsigned long time, void (*cb)(struct timer_list *))
{
	del_timer(&sclp_request_timer);
	sclp_request_timer.function = function;
	sclp_request_timer.data = data;
	sclp_request_timer.function = (TIMER_FUNC_TYPE)cb;
	sclp_request_timer.expires = jiffies + time;
	add_timer(&sclp_request_timer);
}

/* Request timeout handler. Restart the request queue. If DATA is non-zero,
static void sclp_request_timeout_restart(struct timer_list *unused)
{
	sclp_request_timeout(true);
}

static void sclp_request_timeout_normal(struct timer_list *unused)
{
	sclp_request_timeout(false);
}

/* Request timeout handler. Restart the request queue. If force_restart,
 * force restart of running request. */
static void
sclp_request_timeout(unsigned long data)
static void sclp_request_timeout(bool force_restart)
{
	unsigned long flags;

	spin_lock_irqsave(&sclp_lock, flags);
	if (data) {
	if (force_restart) {
		if (sclp_running_state == sclp_running_state_running) {
			/* Break running state and queue NOP read event request
			 * to get a defined interface state. */
@@ -181,7 +189,7 @@ sclp_request_timeout(unsigned long data)
		}
	} else {
		__sclp_set_request_timer(SCLP_BUSY_INTERVAL * HZ,
					 sclp_request_timeout, 0);
					 sclp_request_timeout_normal);
	}
	spin_unlock_irqrestore(&sclp_lock, flags);
	sclp_process_queue();
@@ -239,7 +247,7 @@ out:
 * invokes callback. This timer can be set per request in situations where
 * waiting too long would be harmful to the system, e.g. during SE reboot.
 */
static void sclp_req_queue_timeout(unsigned long data)
static void sclp_req_queue_timeout(struct timer_list *unused)
{
	unsigned long flags, expires_next;
	struct sclp_req *req;
@@ -276,12 +284,12 @@ __sclp_start_request(struct sclp_req *req)
		req->status = SCLP_REQ_RUNNING;
		sclp_running_state = sclp_running_state_running;
		__sclp_set_request_timer(SCLP_RETRY_INTERVAL * HZ,
					 sclp_request_timeout, 1);
					 sclp_request_timeout_restart);
		return 0;
	} else if (rc == -EBUSY) {
		/* Try again later */
		__sclp_set_request_timer(SCLP_BUSY_INTERVAL * HZ,
					 sclp_request_timeout, 0);
					 sclp_request_timeout_normal);
		return 0;
	}
	/* Request failed */
@@ -315,7 +323,7 @@ sclp_process_queue(void)
			/* Cannot abort already submitted request - could still
			 * be active at the SCLP */
			__sclp_set_request_timer(SCLP_BUSY_INTERVAL * HZ,
						 sclp_request_timeout, 0);
						 sclp_request_timeout_normal);
			break;
		}
do_post:
@@ -558,7 +566,7 @@ sclp_sync_wait(void)
		if (timer_pending(&sclp_request_timer) &&
		    get_tod_clock_fast() > timeout &&
		    del_timer(&sclp_request_timer))
			sclp_request_timer.function(sclp_request_timer.data);
			sclp_request_timer.function((TIMER_DATA_TYPE)&sclp_request_timer);
		cpu_relax();
	}
	local_irq_disable();
@@ -915,7 +923,7 @@ static void sclp_check_handler(struct ext_code ext_code,

/* Initial init mask request timed out. Modify request state to failed. */
static void
sclp_check_timeout(unsigned long data)
sclp_check_timeout(struct timer_list *unused)
{
	unsigned long flags;

@@ -954,7 +962,7 @@ sclp_check_interface(void)
		sclp_init_req.status = SCLP_REQ_RUNNING;
		sclp_running_state = sclp_running_state_running;
		__sclp_set_request_timer(SCLP_RETRY_INTERVAL * HZ,
					 sclp_check_timeout, 0);
					 sclp_check_timeout);
		spin_unlock_irqrestore(&sclp_lock, flags);
		/* Enable service-signal interruption - needs to happen
		 * with IRQs enabled. */
@@ -1159,9 +1167,8 @@ sclp_init(void)
	INIT_LIST_HEAD(&sclp_req_queue);
	INIT_LIST_HEAD(&sclp_reg_list);
	list_add(&sclp_state_change_event.list, &sclp_reg_list);
	init_timer(&sclp_request_timer);
	init_timer(&sclp_queue_timer);
	sclp_queue_timer.function = sclp_req_queue_timeout;
	timer_setup(&sclp_request_timer, NULL, 0);
	timer_setup(&sclp_queue_timer, sclp_req_queue_timeout, 0);
	/* Check interface */
	spin_unlock_irqrestore(&sclp_lock, flags);
	rc = sclp_check_interface();
+2 −3
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ static void sclp_console_sync_queue(void)
 * temporary write buffer without further waiting on a final new line.
 */
static void
sclp_console_timeout(unsigned long data)
sclp_console_timeout(struct timer_list *unused)
{
	sclp_conbuf_emit();
}
@@ -211,7 +211,6 @@ sclp_console_write(struct console *console, const char *message,
	/* Setup timer to output current console buffer after 1/10 second */
	if (sclp_conbuf != NULL && sclp_chars_in_buffer(sclp_conbuf) != 0 &&
	    !timer_pending(&sclp_con_timer)) {
		setup_timer(&sclp_con_timer, sclp_console_timeout, 0UL);
		mod_timer(&sclp_con_timer, jiffies + HZ / 10);
	}
out:
@@ -332,7 +331,7 @@ sclp_console_init(void)
	INIT_LIST_HEAD(&sclp_con_outqueue);
	spin_lock_init(&sclp_con_lock);
	sclp_conbuf = NULL;
	init_timer(&sclp_con_timer);
	timer_setup(&sclp_con_timer, sclp_console_timeout, 0);

	/* Set output format */
	if (MACHINE_IS_VM)
+2 −3
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ __sclp_ttybuf_emit(struct sclp_buffer *buffer)
 * temporary write buffer.
 */
static void
sclp_tty_timeout(unsigned long data)
sclp_tty_timeout(struct timer_list *unused)
{
	unsigned long flags;
	struct sclp_buffer *buf;
@@ -218,7 +218,6 @@ static int sclp_tty_write_string(const unsigned char *str, int count, int may_fa
	/* Setup timer to output current console buffer after 1/10 second */
	if (sclp_ttybuf && sclp_chars_in_buffer(sclp_ttybuf) &&
	    !timer_pending(&sclp_tty_timer)) {
		setup_timer(&sclp_tty_timer, sclp_tty_timeout, 0UL);
		mod_timer(&sclp_tty_timer, jiffies + HZ / 10);
	}
	spin_unlock_irqrestore(&sclp_tty_lock, flags);
@@ -526,7 +525,7 @@ sclp_tty_init(void)
	}
	INIT_LIST_HEAD(&sclp_tty_outqueue);
	spin_lock_init(&sclp_tty_lock);
	init_timer(&sclp_tty_timer);
	timer_setup(&sclp_tty_timer, sclp_tty_timeout, 0);
	sclp_ttybuf = NULL;
	sclp_tty_buffer_count = 0;
	if (MACHINE_IS_VM) {
Loading