Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp3303182imm; Fri, 25 May 2018 03:25:41 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpaaqW9pFenQIm2omNz7PY1HQYwbeciZEQ/wktybOCUO2C7WruN02TkQaZ6ORsAY/BJ6LeL X-Received: by 2002:a17:902:56e:: with SMTP id 101-v6mr2011556plf.25.1527243941142; Fri, 25 May 2018 03:25:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527243941; cv=none; d=google.com; s=arc-20160816; b=pMj9w+bpjY+QKjC1LVw2GAzCK2M/0Jq3EDnypgRoJ5LQyYhAN7VgT4GQUC4+UMg2MB RYzm4SONzwnddilz2SrcR2rGCb+8h+g0BtxTuSSLnVxBVb+rLt27zGsnmx/6pMH9pzNv kqSE7SsNBfrka3jdw8kWMEO2S8+U5snMjno0SkoovYk1nm1PS8OC1EqJUuTe6gnuirxI QNahJxIWNQa/ZqHaWhinLj8bzP33xw8QmQvdMOtho4rralkWafYnJt55dVMMiCX0S5Em Cad7FH9OifqMIXlCMM/ZppWTTzbE1rjsW7cdaEggcA49Z87J1O0psxb6YcXoO7iPLoyB 13RQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:references:in-reply-to:date :subject:cc:to:from:arc-authentication-results; bh=xYnkC3oqdnP+oC3RjJkdnWsvXjHJCwqohLTSHb+RcUk=; b=MJqMVJtwY3g/Sjt8ZjEL4oOg+JO29zKIU6/Arj9exv1CHPGTmghMpZd/A7abcbQvR2 lQX+J3/9Am4XgJE6e4+9B17tXURgPgStbFt2z2SoyW0y4HwC9AN2wwdsFAwR6BkPccnQ GqSA4tyhnUEPoiSA4JX5QzsyLf+pEsHzMhnT1bZFGIioymHWwRGe/OqF0c+DrOmRUqZE 4oLRTM37ZtH/8L5JUecfuneNmw7ze5M7ss4pcSF1it5wXwb9kCkFoue22S+h1SnlUgrN IAeyG0kEf+ekrLQht7VOeEOt0J7hTz81bytf99xlsppDy/CdFXFMmPRt34SSrnMON+BC pf0Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x3-v6si6591042plr.307.2018.05.25.03.25.26; Fri, 25 May 2018 03:25:41 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965881AbeEYKXf (ORCPT + 99 others); Fri, 25 May 2018 06:23:35 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:60244 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965855AbeEYKV3 (ORCPT ); Fri, 25 May 2018 06:21:29 -0400 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w4P9sVON034762 for ; Fri, 25 May 2018 06:21:29 -0400 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0b-001b2d01.pphosted.com with ESMTP id 2j6e57719s-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 25 May 2018 06:21:28 -0400 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 25 May 2018 11:21:27 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Fri, 25 May 2018 11:21:24 +0100 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w4PALNhn2687322 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 25 May 2018 10:21:23 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1503EA4051; Fri, 25 May 2018 11:12:41 +0100 (BST) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D2009A404D; Fri, 25 May 2018 11:12:40 +0100 (BST) Received: from morel-ThinkPad-W530.boeblingen.de.ibm.com (unknown [9.152.224.33]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 25 May 2018 11:12:40 +0100 (BST) From: Pierre Morel To: pasic@linux.vnet.ibm.com, bjsdjshi@linux.vnet.ibm.com Cc: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, cohuck@redhat.com Subject: [PATCH v2 03/10] vfio: ccw: new SCH_EVENT event Date: Fri, 25 May 2018 12:21:11 +0200 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1527243678-3140-1-git-send-email-pmorel@linux.vnet.ibm.com> References: <1527243678-3140-1-git-send-email-pmorel@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18052510-0008-0000-0000-000004FB053F X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18052510-0009-0000-0000-00001E8F126B Message-Id: <1527243678-3140-4-git-send-email-pmorel@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-05-25_04:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1805250113 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The Sub channel event callback may be called with interrupt or thread context. Let's thread the FSM action using workqueues. The update of the SCHIB is now done inside an FSM action. using the VFIO_CCW_EVENT_SCHIB_CHANGED event to guaranty coherency with other FSM events. Signed-off-by: Pierre Morel --- drivers/s390/cio/vfio_ccw_drv.c | 33 ++++++++++++--------------------- drivers/s390/cio/vfio_ccw_fsm.c | 23 +++++++++++++++++++++++ drivers/s390/cio/vfio_ccw_private.h | 3 +++ 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c index 57ae1ab..6b7112e 100644 --- a/drivers/s390/cio/vfio_ccw_drv.c +++ b/drivers/s390/cio/vfio_ccw_drv.c @@ -77,6 +77,14 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work) private->state = VFIO_CCW_STATE_IDLE; } +static void vfio_ccw_sch_event_todo(struct work_struct *work) +{ + struct vfio_ccw_private *private; + + private = container_of(work, struct vfio_ccw_private, event_work); + vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_SCHIB_CHANGED); +} + /* * Css driver callbacks */ @@ -124,6 +132,7 @@ static int vfio_ccw_sch_probe(struct subchannel *sch) goto out_disable; INIT_WORK(&private->io_work, vfio_ccw_sch_io_todo); + INIT_WORK(&private->event_work, vfio_ccw_sch_event_todo); atomic_set(&private->avail, 1); private->state = VFIO_CCW_STATE_STANDBY; @@ -170,28 +179,10 @@ static void vfio_ccw_sch_shutdown(struct subchannel *sch) static int vfio_ccw_sch_event(struct subchannel *sch, int process) { struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev); - unsigned long flags; - - spin_lock_irqsave(sch->lock, flags); - if (!device_is_registered(&sch->dev)) - goto out_unlock; - if (work_pending(&sch->todo_work)) - goto out_unlock; - - if (cio_update_schib(sch)) { - vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_NOT_OPER); - goto out_unlock; - } - - private = dev_get_drvdata(&sch->dev); - if (private->state == VFIO_CCW_STATE_NOT_OPER) { - private->state = private->mdev ? VFIO_CCW_STATE_IDLE : - VFIO_CCW_STATE_STANDBY; - } - -out_unlock: - spin_unlock_irqrestore(sch->lock, flags); + if (work_pending(&private->event_work)) + return -EAGAIN; + queue_work(vfio_ccw_work_q, &private->event_work); return 0; } diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c index 756effb..2bc4be66 100644 --- a/drivers/s390/cio/vfio_ccw_fsm.c +++ b/drivers/s390/cio/vfio_ccw_fsm.c @@ -190,6 +190,24 @@ static int fsm_irq(struct vfio_ccw_private *private, } /* + * Got a sub-channel event . + */ +static int fsm_sch_event(struct vfio_ccw_private *private, + enum vfio_ccw_event event) +{ + unsigned long flags; + int ret = private->state; + struct subchannel *sch = private->sch; + + spin_lock_irqsave(sch->lock, flags); + if (cio_update_schib(sch)) + ret = VFIO_CCW_STATE_NOT_OPER; + spin_unlock_irqrestore(sch->lock, flags); + + return ret; +} + +/* * Device statemachine */ fsm_func_t *vfio_ccw_jumptable[NR_VFIO_CCW_STATES][NR_VFIO_CCW_EVENTS] = { @@ -197,25 +215,30 @@ fsm_func_t *vfio_ccw_jumptable[NR_VFIO_CCW_STATES][NR_VFIO_CCW_EVENTS] = { [VFIO_CCW_EVENT_NOT_OPER] = fsm_nop, [VFIO_CCW_EVENT_IO_REQ] = fsm_io_error, [VFIO_CCW_EVENT_INTERRUPT] = fsm_disabled_irq, + [VFIO_CCW_EVENT_SCHIB_CHANGED] = fsm_nop, }, [VFIO_CCW_STATE_STANDBY] = { [VFIO_CCW_EVENT_NOT_OPER] = fsm_notoper, [VFIO_CCW_EVENT_IO_REQ] = fsm_io_error, [VFIO_CCW_EVENT_INTERRUPT] = fsm_irq, + [VFIO_CCW_EVENT_SCHIB_CHANGED] = fsm_sch_event, }, [VFIO_CCW_STATE_IDLE] = { [VFIO_CCW_EVENT_NOT_OPER] = fsm_notoper, [VFIO_CCW_EVENT_IO_REQ] = fsm_io_request, [VFIO_CCW_EVENT_INTERRUPT] = fsm_irq, + [VFIO_CCW_EVENT_SCHIB_CHANGED] = fsm_sch_event, }, [VFIO_CCW_STATE_BOXED] = { [VFIO_CCW_EVENT_NOT_OPER] = fsm_notoper, [VFIO_CCW_EVENT_IO_REQ] = fsm_io_busy, [VFIO_CCW_EVENT_INTERRUPT] = fsm_irq, + [VFIO_CCW_EVENT_SCHIB_CHANGED] = fsm_sch_event, }, [VFIO_CCW_STATE_BUSY] = { [VFIO_CCW_EVENT_NOT_OPER] = fsm_notoper, [VFIO_CCW_EVENT_IO_REQ] = fsm_io_busy, [VFIO_CCW_EVENT_INTERRUPT] = fsm_irq, + [VFIO_CCW_EVENT_SCHIB_CHANGED] = fsm_sch_event, }, }; diff --git a/drivers/s390/cio/vfio_ccw_private.h b/drivers/s390/cio/vfio_ccw_private.h index f526b18..a2be0c9 100644 --- a/drivers/s390/cio/vfio_ccw_private.h +++ b/drivers/s390/cio/vfio_ccw_private.h @@ -33,6 +33,7 @@ * @scsw: scsw info * @io_trigger: eventfd ctx for signaling userspace I/O results * @io_work: work for deferral process of I/O handling + * @event_work: work for deferral process of sub-channel event */ struct vfio_ccw_private { struct subchannel *sch; @@ -49,6 +50,7 @@ struct vfio_ccw_private { struct eventfd_ctx *io_trigger; struct work_struct io_work; + struct work_struct event_work; } __aligned(8); extern int vfio_ccw_mdev_reg(struct subchannel *sch); @@ -76,6 +78,7 @@ enum vfio_ccw_event { VFIO_CCW_EVENT_NOT_OPER, VFIO_CCW_EVENT_IO_REQ, VFIO_CCW_EVENT_INTERRUPT, + VFIO_CCW_EVENT_SCHIB_CHANGED, /* last element! */ NR_VFIO_CCW_EVENTS }; -- 2.7.4