From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B5D0C433DF for ; Tue, 23 Jun 2020 20:42:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 190282053B for ; Tue, 23 Jun 2020 20:42:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592944950; bh=ijW5Yi1DY4mGRUjFUUIM04zNiRTEubsYkWTWBhKw7Xg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=nRwDaEnfYZ1HaBcGexts0rwgsPe+qho5E6H8LG8cEkoMIJBrFxCO/JD3q1mF0UO0f V9N0WayH1L141ejQgtkV2sNupegYQNcnn3r2IEFfugSteutIAZ90Rv3q9HmdkD/E3r PLBPLfkMPyR4NOwyU1SuqSUm0K+AERjNyZlU8z1c= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2392419AbgFWUmZ (ORCPT ); Tue, 23 Jun 2020 16:42:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:38856 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392401AbgFWUmQ (ORCPT ); Tue, 23 Jun 2020 16:42:16 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 D90572070E; Tue, 23 Jun 2020 20:42:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592944936; bh=ijW5Yi1DY4mGRUjFUUIM04zNiRTEubsYkWTWBhKw7Xg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=05S58+p/4dO1CR8eznfBhMrDjsBW6jz0Oy/ToDqAS4OiqKo4O3fDixG7gxuG8Ow7G YJpSRPG4auZT4FViAKCjHNQnzxnWDARfwUcvJEli7vY42q1saIyPRrTrTfop9HYn/k 5E8ivPhScqNw9iz+a0GSCiVdb3P0mJi48nX/1R2o= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Ahmed S. Darwish" , Sebastian Andrzej Siewior , Jens Axboe , Sasha Levin Subject: [PATCH 4.19 182/206] block: nr_sects_write(): Disable preemption on seqcount write Date: Tue, 23 Jun 2020 21:58:30 +0200 Message-Id: <20200623195325.989328764@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200623195316.864547658@linuxfoundation.org> References: <20200623195316.864547658@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ahmed S. Darwish [ Upstream commit 15b81ce5abdc4b502aa31dff2d415b79d2349d2f ] For optimized block readers not holding a mutex, the "number of sectors" 64-bit value is protected from tearing on 32-bit architectures by a sequence counter. Disable preemption before entering that sequence counter's write side critical section. Otherwise, the read side can preempt the write side section and spin for the entire scheduler tick. If the reader belongs to a real-time scheduling class, it can spin forever and the kernel will livelock. Fixes: c83f6bf98dc1 ("block: add partition resize function to blkpg ioctl") Cc: Signed-off-by: Ahmed S. Darwish Reviewed-by: Sebastian Andrzej Siewior Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- include/linux/genhd.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/genhd.h b/include/linux/genhd.h index f13272d843320..f993bc86f3bac 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -729,9 +729,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part) static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) { #if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) + preempt_disable(); write_seqcount_begin(&part->nr_sects_seq); part->nr_sects = size; write_seqcount_end(&part->nr_sects_seq); + preempt_enable(); #elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) preempt_disable(); part->nr_sects = size; -- 2.25.1