Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp793890pxb; Tue, 3 Nov 2020 12:42:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJzWpnJweKmxgFH3/+d7WN08enoqZe1zL2gaBk8L6GrvtlPnNWB7ir26S1c4W6mU3raVQVdW X-Received: by 2002:a17:906:d7b9:: with SMTP id pk25mr21642611ejb.486.1604436133393; Tue, 03 Nov 2020 12:42:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604436133; cv=none; d=google.com; s=arc-20160816; b=YVZgrLu/8dBn0wcIIXi47UKTKng+EX7/3j072jShsvILQrPURYZAzaEueEZea/iZTA utc5lrmf35HZXvja1CVh0iOUXlXOdqL5JKSXrLF04WUzD5trdBtV9N2Ezrt/3w/zYH/R cEqoHojkCBWR2ZxAdozTHEbA82i4Cjf10OI73rfqtRYr7D45ZW++EO7H2RWfd4KvcuHZ +aobFkOs9/SX8nSjWgqxqO+j9GnnTBnKI7doQ6+Nbjv7C531luV/P4J2mIuwisygWLig hwFzJFPbNuh6hkW6o0HeW9e+nBUvr7LSsvcE3b7qpXVZuakBAj3f8bPJp/Ev0ES4pW9P Uslw== 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=rDV7oSGJpYHQhF/LbzKemohXjL0bKp/pBg7YU2NJTPk=; b=rNnKyecSLvlGc1y5eqg0oFLavXErm2FykyQQzV2Y28u+VN45aehHB4+LIn8/Ou8A/L axDyqVjXSSmK8LLVE7F2Mv0C07MF776G6LYElFH7hnjVgAOplwGBIz3hSDKfSDPCwPnQ LDrFITPe1HZa8vIFV9DuuEM0y+/I3DazmKT04MnCp48n3Na0u0eRMgQNK0F1Kwb8LHJL 6iwbrAAEGMPPnNLMGC4cy26/3CNPOFSoSe91iS5T7JaojYd3kmASHH4fTSt7uuWj/aFj 2yN39u9uwDbmT/WponIF944eN+w+imGafgK6rbQH1/knMryI4dnS/ZhpalbWLO0OvMvr aytQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="LtNmG4/f"; 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=fail (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 co16si14060367edb.465.2020.11.03.12.41.50; Tue, 03 Nov 2020 12:42:13 -0800 (PST) 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=@kernel.org header.s=default header.b="LtNmG4/f"; 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=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729845AbgKCUh5 (ORCPT + 99 others); Tue, 3 Nov 2020 15:37:57 -0500 Received: from mail.kernel.org ([198.145.29.99]:47546 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729825AbgKCUhu (ORCPT ); Tue, 3 Nov 2020 15:37:50 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 520C12236F; Tue, 3 Nov 2020 20:37:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1604435869; bh=1MLnxyhYoyW9wfw4G4R0U335uIG9M2y10F67TsYPlnc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LtNmG4/fIF2GNluzyJgnRIH11svO/T4o6TncT1TBs9qi8YVvVzufcuyhmzOZG1wjv KfLZSWlEJR2FMGwzI+FE3T1lBycCoGJT2QPfdr9fg718xM4fE2XrG4gGMT6Sf+g58D eHPubZEMP8FSMRGiWVAOXjEq9NqoeC/TnLFXS22E= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Julien Grall , Juergen Gross , Jan Beulich , Wei Liu Subject: [PATCH 5.9 005/391] xen/blkback: use lateeoi irq binding Date: Tue, 3 Nov 2020 21:30:56 +0100 Message-Id: <20201103203348.470501476@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201103203348.153465465@linuxfoundation.org> References: <20201103203348.153465465@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: Juergen Gross commit 01263a1fabe30b4d542f34c7e2364a22587ddaf2 upstream. In order to reduce the chance for the system becoming unresponsive due to event storms triggered by a misbehaving blkfront use the lateeoi irq binding for blkback and unmask the event channel only after processing all pending requests. As the thread processing requests is used to do purging work in regular intervals an EOI may be sent only after having received an event. If there was no pending I/O request flag the EOI as spurious. This is part of XSA-332. Cc: stable@vger.kernel.org Reported-by: Julien Grall Signed-off-by: Juergen Gross Reviewed-by: Jan Beulich Reviewed-by: Wei Liu Signed-off-by: Greg Kroah-Hartman --- drivers/block/xen-blkback/blkback.c | 22 +++++++++++++++++----- drivers/block/xen-blkback/xenbus.c | 5 ++--- 2 files changed, 19 insertions(+), 8 deletions(-) --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -201,7 +201,7 @@ static inline void shrink_free_pagepool( #define vaddr(page) ((unsigned long)pfn_to_kaddr(page_to_pfn(page))) -static int do_block_io_op(struct xen_blkif_ring *ring); +static int do_block_io_op(struct xen_blkif_ring *ring, unsigned int *eoi_flags); static int dispatch_rw_block_io(struct xen_blkif_ring *ring, struct blkif_request *req, struct pending_req *pending_req); @@ -612,6 +612,8 @@ int xen_blkif_schedule(void *arg) struct xen_vbd *vbd = &blkif->vbd; unsigned long timeout; int ret; + bool do_eoi; + unsigned int eoi_flags = XEN_EOI_FLAG_SPURIOUS; set_freezable(); while (!kthread_should_stop()) { @@ -636,16 +638,23 @@ int xen_blkif_schedule(void *arg) if (timeout == 0) goto purge_gnt_list; + do_eoi = ring->waiting_reqs; + ring->waiting_reqs = 0; smp_mb(); /* clear flag *before* checking for work */ - ret = do_block_io_op(ring); + ret = do_block_io_op(ring, &eoi_flags); if (ret > 0) ring->waiting_reqs = 1; if (ret == -EACCES) wait_event_interruptible(ring->shutdown_wq, kthread_should_stop()); + if (do_eoi && !ring->waiting_reqs) { + xen_irq_lateeoi(ring->irq, eoi_flags); + eoi_flags |= XEN_EOI_FLAG_SPURIOUS; + } + purge_gnt_list: if (blkif->vbd.feature_gnt_persistent && time_after(jiffies, ring->next_lru)) { @@ -1121,7 +1130,7 @@ static void end_block_io_op(struct bio * * and transmute it to the block API to hand it over to the proper block disk. */ static int -__do_block_io_op(struct xen_blkif_ring *ring) +__do_block_io_op(struct xen_blkif_ring *ring, unsigned int *eoi_flags) { union blkif_back_rings *blk_rings = &ring->blk_rings; struct blkif_request req; @@ -1144,6 +1153,9 @@ __do_block_io_op(struct xen_blkif_ring * if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc)) break; + /* We've seen a request, so clear spurious eoi flag. */ + *eoi_flags &= ~XEN_EOI_FLAG_SPURIOUS; + if (kthread_should_stop()) { more_to_do = 1; break; @@ -1202,13 +1214,13 @@ done: } static int -do_block_io_op(struct xen_blkif_ring *ring) +do_block_io_op(struct xen_blkif_ring *ring, unsigned int *eoi_flags) { union blkif_back_rings *blk_rings = &ring->blk_rings; int more_to_do; do { - more_to_do = __do_block_io_op(ring); + more_to_do = __do_block_io_op(ring, eoi_flags); if (more_to_do) break; --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -246,9 +246,8 @@ static int xen_blkif_map(struct xen_blki if (req_prod - rsp_prod > size) goto fail; - err = bind_interdomain_evtchn_to_irqhandler(blkif->domid, evtchn, - xen_blkif_be_int, 0, - "blkif-backend", ring); + err = bind_interdomain_evtchn_to_irqhandler_lateeoi(blkif->domid, + evtchn, xen_blkif_be_int, 0, "blkif-backend", ring); if (err < 0) goto fail; ring->irq = err;