Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp2264748pxb; Fri, 8 Oct 2021 04:30:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxqNBUsJuW3HcAlsPE1VfIMOhZsPy2XTozdNAuwVAE9iit1t9yNJw4foXGzlWcXEEJHP4DH X-Received: by 2002:a63:5608:: with SMTP id k8mr4202882pgb.287.1633692639411; Fri, 08 Oct 2021 04:30:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633692639; cv=none; d=google.com; s=arc-20160816; b=TtkK/NpWTUWxoy8ZP2V0KS12KJxmzNesOC+PEe3T26D7YXWZPWx4+vcz0vzatnl7gt 20624CWjzbu6pWwkk0vuRzMX7GURGkXirTor/cSakszR3khB3hop2Oif4eRydexJ6OIQ 0T63q/RPD3gea81j4f1aXPvrvdYi9OPH2mV/s5zP6gCKpOTqWesiSPwqR1cxylp4W9xt owoLQsOYOIf8Bhs/1eWjXW5snlEmScdW9XUXpEC8yelASsiU3RNMr6cnnTX0OGhKUeKA dpSxmzTCRrRCEFHzaIl0qvE2LOBWGDCtSaqxLBuiEpDnbadb2uoNPfWv/bkGS8uEMYzo 0lVQ== 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=tmDGCjMLCAOjHMPp4WT3nsQSp4sQB70mvUd79v/mrpQ=; b=XwkymWy/xwosx9eUIF/blnnA336VbSuhCbkmj5Acijz5wQPbLL2hiSvZaz28Np8YhM ugXkYI4PTDwD8SWSTu7RWcNrRkAzBF93EJkxtTy6E+13OSeVoZxLolvb0xiy6BaKq9fy 4HHB4X6a5NpC9mJbZriwV8s8oa7UUFczyGKRVknKEzGeToGefHbkacz4GXHssTUQ7PyA pjGH2wFg4gzX/yYGu8vi94AhW1uc/nlKg1U6mDmFs5uED9acZ1Yq0k0Y5JOrjy8yIVMX E3QOL/WvETUWq1XFHdniSO4Eh1QdcxJLy/C2WOIfJP9dsVPRoOR20NHe7jgAEw/pm9wA hH+g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=NvMNEJw0; 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 nn7si7445100pjb.104.2021.10.08.04.30.20; Fri, 08 Oct 2021 04:30:39 -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=NvMNEJw0; 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 S240295AbhJHLbT (ORCPT + 99 others); Fri, 8 Oct 2021 07:31:19 -0400 Received: from mail.kernel.org ([198.145.29.99]:58184 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240530AbhJHLap (ORCPT ); Fri, 8 Oct 2021 07:30:45 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id B9DC66103C; Fri, 8 Oct 2021 11:28:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1633692530; bh=FpZkEcc8SbED2tSq5JxvTY8RJ7uNoNanaIwUewsclx8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NvMNEJw0i89zPwgJcmCTI4O6kr8HfL1ThqXhOfeuX/cqrwsZHepEcKI3y4goZczBr 5Uop0s9gMyGyUJ8qsViMKd1BFJB7+drlbiLpNXOnllcAIvKxHS2o1BJQqcboa9u17f L6NGOorVArPdlHW2hzagSATo+B+xesZrqdoUbtIc= 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.4 7/7] libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD. Date: Fri, 8 Oct 2021 13:27:39 +0200 Message-Id: <20211008112713.749113978@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211008112713.515980393@linuxfoundation.org> References: <20211008112713.515980393@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 @@ -2077,6 +2077,25 @@ static inline u8 ata_dev_knobble(struct return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id))); } +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) { @@ -2093,6 +2112,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; @@ -4270,9 +4296,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, }, @@ -6520,6 +6548,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 @@ -437,6 +437,7 @@ enum { ATA_HORKAGE_NO_NCQ_LOG = (1 << 23), /* don't use NCQ 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_NO_NCQ_ON_ATI = (1 << 27), /* Disable NCQ on ATI chipset */ /* DMA mask for user DMA control: User visible values; DO NOT renumber */