Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2658700pxj; Mon, 14 Jun 2021 04:14:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzdIcBn8mZfVh5Gj4SUx7jzjzQ/mtFiPjM8NkNOOyJAgjeiY89MsJPad0yr9k/U44GAwzXc X-Received: by 2002:a17:906:7203:: with SMTP id m3mr14529154ejk.381.1623669268667; Mon, 14 Jun 2021 04:14:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623669268; cv=none; d=google.com; s=arc-20160816; b=hZWMHh36YaS+NZRUZZ9fYwSwFQKnD4DU81eQ36uOrKVfxPTqKghfmHSCJsaDwAeD4Q J5QkUYigyVfVrm3d72iyXQSHKdooLg2eUQ29jMUgaaERlddCGRezzqAp1vLZzn9OV0QT 9SsgsYT+rs0kX7FuFiyk+yAWHQEb5UIiM91PbosJLCBs9usjIbjFuteNjcDjf0IEJgG5 LD8DDdx12DPmqphsUzm5Ix49FLMv3EAuIbAEcW35sPnxOsd8p4O13jQi7USlkvsoty5V WxT0y3pLJLYnWRmhEDgwm8oBh3oUzLVz3T2qaRGzrDdR8fN8xS1I+kvzmhgEqWIkzKkt teog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=OiRz2+4ZRbVmrU7BxHbl4CrJCY//VbsWjILfkyCOFew=; b=ejG3IYxcv7Y1JWEZLybIAYapX//y58ZjTVz9qvT4kGQvLP1/5BH+OV2tBEdMdgahk2 gT7y09KeInB71IoiLAsF3+DwtikMneK90McI6OFTIH5utAp8HoQDFVocPxi4YLX3SCVU rBD9JQ8Ors2x/mJtPf8SVL9lzFqm76hO4zLnht7qVyareLUKm5Ots4vAjnHXNrztQwAJ hbyx/nmG3aAPLb0JehmX4SxGE1ysRCV4PaXOD+cslLwvRiv3f70IsKZnYO/lpBGZtcwJ 5drBR34hWduSF2cCZ+3IHuw3lLsQ+At7jytN/BO+TgEd6F3pWhy5lXua6sSbPCDn/N+2 jd9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=LYJisTYO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d10si11399319edq.351.2021.06.14.04.14.05; Mon, 14 Jun 2021 04:14:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=LYJisTYO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235034AbhFNLNR (ORCPT + 99 others); Mon, 14 Jun 2021 07:13:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:35526 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235309AbhFNLAg (ORCPT ); Mon, 14 Jun 2021 07:00:36 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DE6576162B; Mon, 14 Jun 2021 10:42:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1623667376; bh=2lVh5NkMWKcDdgRJf5gWZI/lLSeNE7nfG/pCe+/EixQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LYJisTYOmn9LSxn2f3qD6XdhFuweMXEsup+5znoEsuTgI8gfiu0VuRGRJHwWRRURQ EWOvPyfIwfJvqlB7NWE8JyYTcN+nvmMpD2FOLe2xxvXTtMsRUQwOCGa89DI/s54Ilu ZeVq8YEwui/Y5guLn3rXXoy56PXvq+07jmJxdVaA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eric Farman , Matthew Rosato , Cornelia Huck , Sasha Levin Subject: [PATCH 5.10 013/131] vfio-ccw: Serialize FSM IDLE state with I/O completion Date: Mon, 14 Jun 2021 12:26:14 +0200 Message-Id: <20210614102653.435515035@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210614102652.964395392@linuxfoundation.org> References: <20210614102652.964395392@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Farman [ Upstream commit 2af7a834a435460d546f0cf0a8b8e4d259f1d910 ] Today, the stacked call to vfio_ccw_sch_io_todo() does three things: 1) Update a solicited IRB with CP information, and release the CP if the interrupt was the end of a START operation. 2) Copy the IRB data into the io_region, under the protection of the io_mutex 3) Reset the vfio-ccw FSM state to IDLE to acknowledge that vfio-ccw can accept more work. The trouble is that step 3 is (A) invoked for both solicited and unsolicited interrupts, and (B) sitting after the mutex for step 2. This second piece becomes a problem if it processes an interrupt for a CLEAR SUBCHANNEL while another thread initiates a START, thus allowing the CP and FSM states to get out of sync. That is: CPU 1 CPU 2 fsm_do_clear() fsm_irq() fsm_io_request() vfio_ccw_sch_io_todo() fsm_io_helper() Since the FSM state and CP should be kept in sync, let's make a note when the CP is released, and rely on that as an indication that the FSM should also be reset at the end of this routine and open up the device for more work. Signed-off-by: Eric Farman Acked-by: Matthew Rosato Reviewed-by: Cornelia Huck Message-Id: <20210511195631.3995081-4-farman@linux.ibm.com> Signed-off-by: Cornelia Huck Signed-off-by: Sasha Levin --- drivers/s390/cio/vfio_ccw_drv.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c index 8c625b530035..9b61e9b131ad 100644 --- a/drivers/s390/cio/vfio_ccw_drv.c +++ b/drivers/s390/cio/vfio_ccw_drv.c @@ -86,6 +86,7 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work) struct vfio_ccw_private *private; struct irb *irb; bool is_final; + bool cp_is_finished = false; private = container_of(work, struct vfio_ccw_private, io_work); irb = &private->irb; @@ -94,14 +95,21 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work) (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)); if (scsw_is_solicited(&irb->scsw)) { cp_update_scsw(&private->cp, &irb->scsw); - if (is_final && private->state == VFIO_CCW_STATE_CP_PENDING) + if (is_final && private->state == VFIO_CCW_STATE_CP_PENDING) { cp_free(&private->cp); + cp_is_finished = true; + } } mutex_lock(&private->io_mutex); memcpy(private->io_region->irb_area, irb, sizeof(*irb)); mutex_unlock(&private->io_mutex); - if (private->mdev && is_final) + /* + * Reset to IDLE only if processing of a channel program + * has finished. Do not overwrite a possible processing + * state if the final interrupt was for HSCH or CSCH. + */ + if (private->mdev && cp_is_finished) private->state = VFIO_CCW_STATE_IDLE; if (private->io_trigger) -- 2.30.2