Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp4717235imm; Tue, 9 Oct 2018 04:17:01 -0700 (PDT) X-Google-Smtp-Source: ACcGV62/i3B6yNHrd0mafZIB9exMjK1qvHdMZJdDE4KVktCmjvykmXA98Adafr7eYNYZDtdgdaDo X-Received: by 2002:a63:6b05:: with SMTP id g5-v6mr25360101pgc.344.1539083821083; Tue, 09 Oct 2018 04:17:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539083821; cv=none; d=google.com; s=arc-20160816; b=hTmmaz4oxHEWsJntBavaRIjnu0SB5xsBxVkFkWXBcIyuAbrC1iAOzITeVMrWIIPAMi pCck4W+aflqMo/a72mEGBFHzpD29fq7DGVuxvgEeA3nnJOVp8CNMD0x51+M3qesv4Mq+ y9hFPau6KzVD5Ic3wS5jgIPB7d424og+ane5QkGZGtB8WxeNSApKM8YD4r8viIlJCST8 XshM+ENGgpc0kFn+AILJPj+YZq6ebSDFoTqmizVaevPaExd4OTRThkZ4KzR+LKG173/V rKXH3K606cEIjdhNkm3YX1wggaS1YALVKu2MZWDjUVUNS2RtirgOWklGgm0Sgzt1Wi8r A6zg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=fLwddzeUooCY4Cr2FryTJ4j9wyROsN2nO3k/jrXsCYU=; b=Hf8LeiPNGMx/MRmIOHYwBBHLvlYLVQyR6PM2xv8krdzxsEJ7do9momgpdv65kKGNNq YyvcTpTTY8X3p+lnEFP/L8B38HF2wbRJR+yWgG86NOKWAY4IXzvcuKCYnfk2zbTPAIeO 2CXFaDslTm2BjLZvwc8FA5eBuvU1KIXg0JrYY7Sz+yfih4GKJcERy/oKwcPAmhKgE73H suf6969QbhxevAu1YVxnaf7JaG5FZnAc/LAl47Al3YoWHld7HueQXjEGXrlIfW62y6Le gmD4BMK5jv+cp1bwNLxI9kuoNhSh5GW0OBzflBZn2lYBwrIi7fWWcy9CCHsW6uUyRBeN sg2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=SFNBM31E; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 8-v6si22029759pla.252.2018.10.09.04.16.46; Tue, 09 Oct 2018 04:17:01 -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; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=SFNBM31E; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728141AbeJIScO (ORCPT + 99 others); Tue, 9 Oct 2018 14:32:14 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:42204 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727348AbeJIScO (ORCPT ); Tue, 9 Oct 2018 14:32:14 -0400 Received: by mail-pg1-f193.google.com with SMTP id i4-v6so648246pgq.9 for ; Tue, 09 Oct 2018 04:15:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lightnvm-io.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fLwddzeUooCY4Cr2FryTJ4j9wyROsN2nO3k/jrXsCYU=; b=SFNBM31E+D65YFsUDBTL+yWYVhCIk2L2VO60Nk3rBPNJZxv6LhGPKUeTGy4yfR1Y/7 SlMjnqlvQbM78TINvU7fUK1RY6pWo4kj/2IqfhGRdajXW0bHoJ+a6oosyL9el1iVuXRJ X1jDO/16gp0IWbryPTlaK7Gk6OR3HJuLn+wW1VzWjGm/TnIj4j/tV2IXalcEytPUxrov +aWUIpCqMiv0C0A3O3OuVMkUZEijowdGuMUNPZqGpXa+aMdOCuapolSgTnL5PrQlttSc 3AkDJN/f/otX0QYIVxj8n0Upr4FbeRX3o1oTj8QRxFPflhFqeNcymW41FmH4CqpM/BMa 7HxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fLwddzeUooCY4Cr2FryTJ4j9wyROsN2nO3k/jrXsCYU=; b=TOWJuWoOe+6Cx0DGFTBDqAXeEfB4mxqFCyyv8xTJ3b9QRPWoZhNkJz+LmNQhD2iRn6 8e7L0ja33kKkpJgzmw/leHOeMURgmy53Kuw6NOEzT7fvKpJQB6xLuJdmKr/qPwZZrHw+ 837qaSqJKQWpbYt60rMrubG3qaQ4GqBPueVC3lSV2zKsr4zHF+j/NiYno+UocrJB6Mst Es/FWgvCSGqt3DUEN/XoSZ/K7qg9M9SAUVQi6+09h6ako01O6nKKNFBG2b5Yz34Fo5by UyDAmEvYgGmkG3TewTzYbSqbLtDlHXjXzasR6u5iPWFwLP9NmF9kx8SeG8PrcFpMhrE6 ULrA== X-Gm-Message-State: ABuFfojVI0UiKIf7l38akuo0Fuk6S0GslgWgrpeAiN6N60ffl0hcMhtj is0RX5PQWCSF8Og6drqryesx5A== X-Received: by 2002:a62:3047:: with SMTP id w68-v6mr5081631pfw.19.1539083746829; Tue, 09 Oct 2018 04:15:46 -0700 (PDT) Received: from skyninja.hgst.com (rap-us.hgst.com. [199.255.44.250]) by smtp.gmail.com with ESMTPSA id p1-v6sm25342380pff.128.2018.10.09.04.15.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Oct 2018 04:15:45 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: axboe@fb.com Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [GIT PULL 45/45] lightnvm: pblk: guarantee that backpointer is respected on writer stall Date: Tue, 9 Oct 2018 13:12:15 +0200 Message-Id: <20181009111215.7653-46-mb@lightnvm.io> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181009111215.7653-1-mb@lightnvm.io> References: <20181009111215.7653-1-mb@lightnvm.io> 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: Javier González pblk's write buffer must guarantee that it respects the device's constrains for reads (i.e., mw_cunits). This is done by maintaining a backpointer that updates the L2P table as entries wrap up, making them point to the media instead of pointing to the write buffer. This mechanism can race in case that the write thread stalls, as the write pointer will protect the last written entry, thus disregarding the read constrains. This patch adds an extra check on wrap up, making sure that the threshold is respected at all times, preventing new entries to overwrite committed data, also in case of write thread stall. Reported-by: Heiner Litz Signed-off-by: Javier González Reviewed-by: Heiner Litz Signed-off-by: Matias Bjørling --- drivers/lightnvm/pblk-init.c | 5 +++-- drivers/lightnvm/pblk-rb.c | 9 +++++++-- drivers/lightnvm/pblk.h | 8 +++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c index e5239aba806b..13822594647c 100644 --- a/drivers/lightnvm/pblk-init.c +++ b/drivers/lightnvm/pblk-init.c @@ -193,8 +193,9 @@ static int pblk_rwb_init(struct pblk *pblk) struct nvm_tgt_dev *dev = pblk->dev; struct nvm_geo *geo = &dev->geo; unsigned long buffer_size; - int pgs_in_buffer; + int pgs_in_buffer, threshold; + threshold = geo->mw_cunits * geo->all_luns; pgs_in_buffer = (max(geo->mw_cunits, geo->ws_opt) + geo->ws_opt) * geo->all_luns; @@ -203,7 +204,7 @@ static int pblk_rwb_init(struct pblk *pblk) else buffer_size = pgs_in_buffer; - return pblk_rb_init(&pblk->rwb, buffer_size, geo->csecs); + return pblk_rb_init(&pblk->rwb, buffer_size, threshold, geo->csecs); } /* Minimum pages needed within a lun */ diff --git a/drivers/lightnvm/pblk-rb.c b/drivers/lightnvm/pblk-rb.c index f653faa6a9ed..b1f4b51783f4 100644 --- a/drivers/lightnvm/pblk-rb.c +++ b/drivers/lightnvm/pblk-rb.c @@ -56,7 +56,8 @@ static unsigned int pblk_rb_calculate_size(unsigned int nr_entries) * allocated and their size must be a power of two * (Documentation/core-api/circular-buffers.rst) */ -int pblk_rb_init(struct pblk_rb *rb, unsigned int size, unsigned int seg_size) +int pblk_rb_init(struct pblk_rb *rb, unsigned int size, unsigned int threshold, + unsigned int seg_size) { struct pblk *pblk = container_of(rb, struct pblk, rwb); struct pblk_rb_entry *entries; @@ -79,6 +80,7 @@ int pblk_rb_init(struct pblk_rb *rb, unsigned int size, unsigned int seg_size) rb->seg_size = (1 << power_seg_sz); rb->nr_entries = (1 << power_size); rb->mem = rb->subm = rb->sync = rb->l2p_update = 0; + rb->back_thres = threshold; rb->flush_point = EMPTY_ENTRY; spin_lock_init(&rb->w_lock); @@ -404,11 +406,14 @@ static int __pblk_rb_may_write(struct pblk_rb *rb, unsigned int nr_entries, { unsigned int mem; unsigned int sync; + unsigned int threshold; sync = READ_ONCE(rb->sync); mem = READ_ONCE(rb->mem); - if (pblk_rb_ring_space(rb, mem, sync, rb->nr_entries) < nr_entries) + threshold = nr_entries + rb->back_thres; + + if (pblk_rb_ring_space(rb, mem, sync, rb->nr_entries) < threshold) return 0; if (pblk_rb_update_l2p(rb, nr_entries, mem, sync)) diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index 0f98ea24ee59..02bb2e98f8a9 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h @@ -203,6 +203,11 @@ struct pblk_rb { * will be 4KB */ + unsigned int back_thres; /* Threshold that shall be maintained by + * the backpointer in order to respect + * geo->mw_cunits on a per chunk basis + */ + struct list_head pages; /* List of data pages */ spinlock_t w_lock; /* Write lock */ @@ -734,7 +739,8 @@ struct pblk_line_ws { /* * pblk ring buffer operations */ -int pblk_rb_init(struct pblk_rb *rb, unsigned int size, unsigned int seg_sz); +int pblk_rb_init(struct pblk_rb *rb, unsigned int size, unsigned int threshold, + unsigned int seg_sz); int pblk_rb_may_write_user(struct pblk_rb *rb, struct bio *bio, unsigned int nr_entries, unsigned int *pos); int pblk_rb_may_write_gc(struct pblk_rb *rb, unsigned int nr_entries, -- 2.17.1