Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp2265691pxb; Fri, 8 Oct 2021 04:31:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxkoP4eaz4YNkH2VIgMTyRYVb6V++S9BBt789hPmEHBI6w7aZeGLKrC86aGKEsxqL7drgiN X-Received: by 2002:a05:6a00:1344:b0:44c:4cd7:4d4b with SMTP id k4-20020a056a00134400b0044c4cd74d4bmr9974257pfu.50.1633692715658; Fri, 08 Oct 2021 04:31:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633692715; cv=none; d=google.com; s=arc-20160816; b=p2ZqNj5oJTi2qR8mSuAH8O6Wcjy+WnvqrihL7+oOnFcMsUi560AnQeFnyFOLUf1d8U X366ZTLNX/rOQKczjQAD+oLWUJUrkLxXzq8hh5djhwuYcEHR/W8IlLCoJV1B2+av9f7Z 7ZpgvX+UGPbIOyye+ah5e2g4GyYUUYKAcL2Z/ShcOqOyYiEzlqwvOszNQE+Cn9AhAO2k N3uDJ9eqwT07MUkHEpjmSpUlQKamM9KtGCg5AUYpNvqlFiPmSDlBUXmOK99qoltSH7XR 80+SAYQkgCAX3Ep3L/N3bwKADO80dZ0/XJz8N1N9gUclpYXNfg9lzwp1H6siZY3sZbNQ nDUQ== 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=H+FYrTMjnVttRicm/OU9VvAfXfc0wLXAyMWfqSX5HZM=; b=a5ClpsaZy/xeq9BJ0wev/4BxICUS78aQfjf6Skln9wxDrODGyX0qLdsGLWQG7RogPK Hca2z+s1NUJDYknws5WVghtts+erGo5C7AZLXeW3C/Ci20PA7SEnBKQX74HRcikuZF8a ovBCEyEO3FExOOkjFBMM56WKqRGbUeqd8OF+PqoClkktsqUzvHImYVHHjB0OPIr/DbwV 5ZoGgs7u6Rjk0yKUg4fs4ZsmHQh8H/V4Q6nffLwHFUE5laeoD7WPeshZYVD1QsoHvnYV ACMBdr6rcv1j/GjGrVcgw3s6283bozWRtz2SGO2pUwxpK67oKGz0FOy86ijQDYSoxKDQ moIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=kbR5caTl; 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 cp19si3404194plb.78.2021.10.08.04.31.41; Fri, 08 Oct 2021 04:31:55 -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=kbR5caTl; 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 S240657AbhJHLcb (ORCPT + 99 others); Fri, 8 Oct 2021 07:32:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:59314 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240825AbhJHLb0 (ORCPT ); Fri, 8 Oct 2021 07:31:26 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 52C1F61108; Fri, 8 Oct 2021 11:29:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1633692549; bh=faudpD3i3n/oburmtYSmsj2zAOUuIOUHZOW+/M9rsGo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kbR5caTlZ60Ho4zvqUyAlkbzZF8tLVqUT9L6wWJ08cVA32pjw3aYwc3QZpVnk6Shl LCYhQkvlR0N/wmVlX9CNUFQyjQMZN+jW82W6/byYN30aFwl8pZFdtcGcz0uDaLcHhd GLu2Cz9NoJ6ItoJJXFMqHMbkAqGnq0De8RL48W70= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Kate Hsuan , Hans de Goede , "Martin K. Petersen" , Jens Axboe , =?UTF-8?q?Krzysztof=20Ol=C4=99dzki?= Subject: [PATCH 4.9 8/8] libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD. Date: Fri, 8 Oct 2021 13:27:45 +0200 Message-Id: <20211008112714.219383506@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211008112713.941269121@linuxfoundation.org> References: <20211008112713.941269121@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: Kate Hsuan commit 7a8526a5cd51cf5f070310c6c37dd7293334ac49 upstream. Many users are reporting that the Samsung 860 and 870 SSD are having various issues when combined with AMD/ATI (vendor ID 0x1002) SATA controllers and only completely disabling NCQ helps to avoid these issues. Always disabling NCQ for Samsung 860/870 SSDs regardless of the host SATA adapter vendor will cause I/O performance degradation with well behaved adapters. To limit the performance impact to ATI adapters, introduce the ATA_HORKAGE_NO_NCQ_ON_ATI flag to force disable NCQ only for these adapters. Also, two libata.force parameters (noncqati and ncqati) are introduced to disable and enable the NCQ for the system which equipped with ATI SATA adapter and Samsung 860 and 870 SSDs. The user can determine NCQ function to be enabled or disabled according to the demand. After verifying the chipset from the user reports, the issue appears on AMD/ATI SB7x0/SB8x0/SB9x0 SATA Controllers and does not appear on recent AMD SATA adapters. The vendor ID of ATI should be 0x1002. Therefore, ATA_HORKAGE_NO_NCQ_ON_AMD was modified to ATA_HORKAGE_NO_NCQ_ON_ATI. BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=201693 Signed-off-by: Kate Hsuan Reviewed-by: Hans de Goede Link: https://lore.kernel.org/r/20210903094411.58749-1-hpa@redhat.com Reviewed-by: Martin K. Petersen Signed-off-by: Jens Axboe Cc: Krzysztof Olędzki Signed-off-by: Greg Kroah-Hartman --- drivers/ata/libata-core.c | 34 ++++++++++++++++++++++++++++++++-- include/linux/libata.h | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -2157,6 +2157,25 @@ static void ata_dev_config_ncq_non_data( } } +static bool ata_dev_check_adapter(struct ata_device *dev, + unsigned short vendor_id) +{ + struct pci_dev *pcidev = NULL; + struct device *parent_dev = NULL; + + for (parent_dev = dev->tdev.parent; parent_dev != NULL; + parent_dev = parent_dev->parent) { + if (dev_is_pci(parent_dev)) { + pcidev = to_pci_dev(parent_dev); + if (pcidev->vendor == vendor_id) + return true; + break; + } + } + + return false; +} + static int ata_dev_config_ncq(struct ata_device *dev, char *desc, size_t desc_sz) { @@ -2173,6 +2192,13 @@ static int ata_dev_config_ncq(struct ata snprintf(desc, desc_sz, "NCQ (not used)"); return 0; } + + if (dev->horkage & ATA_HORKAGE_NO_NCQ_ON_ATI && + ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI)) { + snprintf(desc, desc_sz, "NCQ (not used)"); + return 0; + } + if (ap->flags & ATA_FLAG_NCQ) { hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1); dev->flags |= ATA_DFLAG_NCQ; @@ -4448,9 +4474,11 @@ static const struct ata_blacklist_entry { "Samsung SSD 850*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Samsung SSD 860*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | - ATA_HORKAGE_ZERO_AFTER_TRIM, }, + ATA_HORKAGE_ZERO_AFTER_TRIM | + ATA_HORKAGE_NO_NCQ_ON_ATI, }, { "Samsung SSD 870*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | - ATA_HORKAGE_ZERO_AFTER_TRIM, }, + ATA_HORKAGE_ZERO_AFTER_TRIM | + ATA_HORKAGE_NO_NCQ_ON_ATI, }, { "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, @@ -6734,6 +6762,8 @@ static int __init ata_parse_force_one(ch { "ncq", .horkage_off = ATA_HORKAGE_NONCQ }, { "noncqtrim", .horkage_on = ATA_HORKAGE_NO_NCQ_TRIM }, { "ncqtrim", .horkage_off = ATA_HORKAGE_NO_NCQ_TRIM }, + { "noncqati", .horkage_on = ATA_HORKAGE_NO_NCQ_ON_ATI }, + { "ncqati", .horkage_off = ATA_HORKAGE_NO_NCQ_ON_ATI }, { "dump_id", .horkage_on = ATA_HORKAGE_DUMP_ID }, { "pio0", .xfer_mask = 1 << (ATA_SHIFT_PIO + 0) }, { "pio1", .xfer_mask = 1 << (ATA_SHIFT_PIO + 1) }, --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -436,6 +436,7 @@ enum { 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 */ + ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27), /* Disable NCQ on ATI chipset */ /* DMA mask for user DMA control: User visible values; DO NOT renumber */