Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp4158082pxk; Tue, 8 Sep 2020 12:09:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwf0ShtXnGaoQvz5lKLLXUJxFoaeo2Y4iT81QRV+HLvp1o5fa7V5abbf9++zPcuKisiIq6p X-Received: by 2002:aa7:da16:: with SMTP id r22mr517873eds.132.1599592178525; Tue, 08 Sep 2020 12:09:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599592178; cv=none; d=google.com; s=arc-20160816; b=LUr3coZTqbW47tlushKYAvCo50gcALbZ1zpIPzpBX11EnufxRqTRG/OgkskJ4O5sIF TKBo930bbVECF8Ayj5RdJ7BbEYijgLj99CdK5bXH4Ze0X1aV8SdlAg8K4aiDYzrtoHJ4 F4guFM9XwtD/V4y6ZDMA4GdAKL5TS2csow/DLwefCdAIeD8hRCj7uwGwpG/gkMW5EkqD 2GCDBXr0stEz6d6FQVEwZLEjkmLBNo9w0qMtQymP2LectzH2II9iYZ5zOEPP1wUvFzXj m6+DNbUI7zxFwKnmvOjzTeYZlNtlRmp/4YhL398uSbYWgBn7JD+EN6z+MymsXL7PPp0o oUvQ== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=K9d9vlUGMNcKZ3Hyoe+2ecLDwI8BQ7wLx5Yc8ANNj78=; b=pZ6ZXFbwEjCYWJC6htreuy4OA2famC34C2LQcoMg5jNvXRwK8fU4bR5ukBvboEorBg WDupjCQt5SKj+S7gBBiFvDj3Cn8hRnl9uijoKOI/Kc0c9J1THnK6CqZFQqd4WQwLAE0A 3tuRGQdH0rkbniLRPgImHce+F3VwRvjTYHPWPYDIl+Ck2+/lvDruZNahAsCwG2lRaKMw vT6Hu+pGgK3c4QxUh/cuqFMg52G3p5r5wKFwrfEP9vSuMGCtbkVVSOHaImNtJabHt9Pi SXIOZax+W6MK2iHI8h6nt/Bjgz69U6HPT6k4Mg5Q+nMjRrPyNwCKWtGFQ0nSXC4qrJcx KEfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=MLGKfRwt; 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 s3si12530904ejv.383.2020.09.08.12.09.15; Tue, 08 Sep 2020 12:09:38 -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=@kernel.org header.s=default header.b=MLGKfRwt; 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 S1731442AbgIHTGI (ORCPT + 99 others); Tue, 8 Sep 2020 15:06:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:52606 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731264AbgIHQHV (ORCPT ); Tue, 8 Sep 2020 12:07:21 -0400 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 D9B0323E25; Tue, 8 Sep 2020 15:47:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1599580026; bh=cFbV4bMzr3uLQwoyjcoR+aScCk6g1+iDXnHpLnB7Wg8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MLGKfRwt5JDmEYti+nsql4dr74BW+jGgKzZG4KppT9yE0dTpsO9Jhd1S0mjEm79M7 3KXcoN3TxMEYov26OofUfk2TX1VM7KGtzJ/pjiF1qKiqoJLTyUKwc6RNuJxj5Ol0bk 0qrqzpF0o4NT9ZGEZ2LVyTBpSOXVbBpZLZJE5HFQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tejun Heo , Karthik Shivaram , Jens Axboe Subject: [PATCH 5.4 109/129] libata: implement ATA_HORKAGE_MAX_TRIM_128M and apply to Sandisks Date: Tue, 8 Sep 2020 17:25:50 +0200 Message-Id: <20200908152235.284614536@linuxfoundation.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200908152229.689878733@linuxfoundation.org> References: <20200908152229.689878733@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: Tejun Heo commit 3b5455636fe26ea21b4189d135a424a6da016418 upstream. All three generations of Sandisk SSDs lock up hard intermittently. Experiments showed that disabling NCQ lowered the failure rate significantly and the kernel has been disabling NCQ for some models of SD7's and 8's, which is obviously undesirable. Karthik worked with Sandisk to root cause the hard lockups to trim commands larger than 128M. This patch implements ATA_HORKAGE_MAX_TRIM_128M which limits max trim size to 128M and applies it to all three generations of Sandisk SSDs. Signed-off-by: Tejun Heo Cc: Karthik Shivaram Cc: stable@vger.kernel.org Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- drivers/ata/libata-core.c | 5 ++--- drivers/ata/libata-scsi.c | 8 +++++++- include/linux/libata.h | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -4474,9 +4474,8 @@ static const struct ata_blacklist_entry /* https://bugzilla.kernel.org/show_bug.cgi?id=15573 */ { "C300-CTFDDAC128MAG", "0001", ATA_HORKAGE_NONCQ, }, - /* Some Sandisk SSDs lock up hard with NCQ enabled. Reported on - SD7SN6S256G and SD8SN8U256G */ - { "SanDisk SD[78]SN*G", NULL, ATA_HORKAGE_NONCQ, }, + /* Sandisk SD7/8/9s lock up hard on large trims */ + { "SanDisk SD[789]*", NULL, ATA_HORKAGE_MAX_TRIM_128M, }, /* devices which puke on READ_NATIVE_MAX */ { "HDS724040KLSA80", "KFAOA20N", ATA_HORKAGE_BROKEN_HPA, }, --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -2374,6 +2374,7 @@ static unsigned int ata_scsiop_inq_89(st static unsigned int ata_scsiop_inq_b0(struct ata_scsi_args *args, u8 *rbuf) { + struct ata_device *dev = args->dev; u16 min_io_sectors; rbuf[1] = 0xb0; @@ -2399,7 +2400,12 @@ static unsigned int ata_scsiop_inq_b0(st * with the unmap bit set. */ if (ata_id_has_trim(args->id)) { - put_unaligned_be64(65535 * ATA_MAX_TRIM_RNUM, &rbuf[36]); + u64 max_blocks = 65535 * ATA_MAX_TRIM_RNUM; + + if (dev->horkage & ATA_HORKAGE_MAX_TRIM_128M) + max_blocks = 128 << (20 - SECTOR_SHIFT); + + put_unaligned_be64(max_blocks, &rbuf[36]); put_unaligned_be32(1, &rbuf[28]); } --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -422,6 +422,7 @@ enum { ATA_HORKAGE_NO_DMA_LOG = (1 << 23), /* don't use DMA for log read */ ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */ ATA_HORKAGE_MAX_SEC_1024 = (1 << 25), /* Limit max sects to 1024 */ + ATA_HORKAGE_MAX_TRIM_128M = (1 << 26), /* Limit max trim size to 128M */ /* DMA mask for user DMA control: User visible values; DO NOT renumber */