From nobody Fri May 10 00:31:56 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1668704196; cv=none; d=zohomail.com; s=zohoarc; b=arcXueGV++81wX5V1rx88FLIWzB3BM689/qG/6J9/Ng6n/CbC2qnl7yjnbHWNOdMFK8s3xSQBnHxGOzcMsTixUf1eNmAzJ/eS5fLDI3O12DaZzerGRjW/gJgYenGVTn57zmVZ+cGKxEiBFQ6f5dN/Hdh5OfUdRKSqOSPV6+Jez0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1668704196; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=DvJ4lkdX+wmID6ozOrP92erLwYqSbxWQcDGOd3PHcUU=; b=i7sJ9DkqlnnA0nE3TdCxrk6sy5h8ywWRMSQL0+/1a+SlhuANUYaBTtZsL2wa9S01ArvTsWOMu6c5/WHRSXfcAjgJEYrtdDRXqftOkmUgpcxPgsk7u+HZixQE8hlzJPRqp5EhJSCCjVVc4mgc7gR1DWOVgN/Cn/BqRs3XeFiAvXY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1668704196200322.21514820289156; Thu, 17 Nov 2022 08:56:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oviBQ-0005pd-04; Thu, 17 Nov 2022 11:56:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oviBO-0005oN-Em for qemu-devel@nongnu.org; Thu, 17 Nov 2022 11:56:10 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oviBN-0007m0-2H for qemu-devel@nongnu.org; Thu, 17 Nov 2022 11:56:10 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-104--kvRigWZP_GBrk0OOebSOQ-1; Thu, 17 Nov 2022 11:56:03 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4D311857F92; Thu, 17 Nov 2022 16:56:03 +0000 (UTC) Received: from localhost (unknown [10.39.193.61]) by smtp.corp.redhat.com (Postfix) with ESMTP id BA90EC1E88E; Thu, 17 Nov 2022 16:56:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1668704168; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DvJ4lkdX+wmID6ozOrP92erLwYqSbxWQcDGOd3PHcUU=; b=KTMX5UKU84Q2kbGRCm1Odm9lkxOMZNZjzowRJNGoaTKkI3v/VleXpBQHJkF10SyqSr60cR gurQVm5WVp8nrMQNuyYsDo8Qq0qr887hzWrmb0vySda4/1OvqPGsSfJN0rKxMJqjNc/whf tCgmY5pzUI60KkEyTRKLtJtqdCfhSj0= X-MC-Unique: -kvRigWZP_GBrk0OOebSOQ-1 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Cc: Tobias Fiebig , Jason Wang , qemu-stable@nongnu.org, Stefan Hajnoczi Subject: [PATCH for-7.2 v3 1/3] rtl8139: avoid clobbering tx descriptor bits Date: Thu, 17 Nov 2022 11:55:52 -0500 Message-Id: <20221117165554.1773409-2-stefanha@redhat.com> In-Reply-To: <20221117165554.1773409-1-stefanha@redhat.com> References: <20221117165554.1773409-1-stefanha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.8 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=stefanha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1668704196552100001 Content-Type: text/plain; charset="utf-8" The device turns the Tx Descriptor into a Tx Status descriptor after fully reading the descriptor. This involves clearing Tx Own (bit 31) to indicate that the driver has ownership of the descriptor again as well as several other bits. The code keeps the first dword of the Tx Descriptor in the txdw0 local variable. txdw0 is reused to build the first word of the Tx Status descriptor. Later on the code uses txdw0 again, incorrectly assuming that it still contains the first dword of the Tx Descriptor. The tx offloading code misbehaves because it sees bogus bits in txdw0. Use a separate local variable for Tx Status and preserve Tx Descriptor in txdw0. Signed-off-by: Stefan Hajnoczi Acked-by: Jason Wang Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Tobias Fiebig --- hw/net/rtl8139.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c index e6643e3c9d..ffef3789b5 100644 --- a/hw/net/rtl8139.c +++ b/hw/net/rtl8139.c @@ -2027,18 +2027,21 @@ static int rtl8139_cplus_transmit_one(RTL8139State = *s) s->currCPlusTxDesc =3D 0; } =20 + /* Build the Tx Status Descriptor */ + uint32_t tx_status =3D txdw0; + /* transfer ownership to target */ - txdw0 &=3D ~CP_TX_OWN; + tx_status &=3D ~CP_TX_OWN; =20 /* reset error indicator bits */ - txdw0 &=3D ~CP_TX_STATUS_UNF; - txdw0 &=3D ~CP_TX_STATUS_TES; - txdw0 &=3D ~CP_TX_STATUS_OWC; - txdw0 &=3D ~CP_TX_STATUS_LNKF; - txdw0 &=3D ~CP_TX_STATUS_EXC; + tx_status &=3D ~CP_TX_STATUS_UNF; + tx_status &=3D ~CP_TX_STATUS_TES; + tx_status &=3D ~CP_TX_STATUS_OWC; + tx_status &=3D ~CP_TX_STATUS_LNKF; + tx_status &=3D ~CP_TX_STATUS_EXC; =20 /* update ring data */ - val =3D cpu_to_le32(txdw0); + val =3D cpu_to_le32(tx_status); pci_dma_write(d, cplus_tx_ring_desc, (uint8_t *)&val, 4); =20 /* Now decide if descriptor being processed is holding the last segmen= t of packet */ --=20 2.38.1 From nobody Fri May 10 00:31:56 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1668704224; cv=none; d=zohomail.com; s=zohoarc; b=GLPRjMcq25eNm7I64ljecjcWn8/s8hhjo8PUFq3WsAM+LbcCiZMHL0AjH9PRQGqcmlJmUUKo2M+6u180ng7SCTNf5NP13WwZKwk/aDfp4tGCkh1X35DgZmfMeiPWQ4YkOjmovfbmwh8cwOzJY6q762M5sw4pFgffPtDTPxZRxPI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1668704224; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=cvRsKNZ3VNpldatLcxBKIjHbLcpG0HhsYlZYVIVqxAY=; b=cwqeuaCMDXlObq6YatNaAX+FJ+PUEWvbwZwHUhDQH4mAfN306NC1hGL1JiFYXAukXLhPsJULYfEs2zPSOYj5M34V5gH8Yli/7pnDAB3+IwfSzS7s0RIUVvw1V2OecClevZJX8TkgW63PFOWFvfN61ERWprZ9PCNGRkB2zBOhkXY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1668704224965381.5334356861151; Thu, 17 Nov 2022 08:57:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oviBT-0005qT-1a; Thu, 17 Nov 2022 11:56:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oviBR-0005pw-H3 for qemu-devel@nongnu.org; Thu, 17 Nov 2022 11:56:13 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oviBP-0007mg-KL for qemu-devel@nongnu.org; Thu, 17 Nov 2022 11:56:13 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-552-7DSIkwZyNwauGdX44TcgeQ-1; Thu, 17 Nov 2022 11:56:07 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6B058882822; Thu, 17 Nov 2022 16:56:07 +0000 (UTC) Received: from localhost (unknown [10.39.193.61]) by smtp.corp.redhat.com (Postfix) with ESMTP id EFD7CC1E890; Thu, 17 Nov 2022 16:56:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1668704171; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cvRsKNZ3VNpldatLcxBKIjHbLcpG0HhsYlZYVIVqxAY=; b=ag2P7WblVo0Jtbgpj9acgad6sGLjhbR9Z9BNZ+rWjeXISv0LMA+RrY+Thq72I+uPPUu2XA dDH2mZAO0LfFjJSc2XM88KRLtcVGuKfXFYvQj+jyK+9ovYZdqaMi4dVhHRhDA/ETzW0jRB 5m3ZmgxTOkAVWoJ0KCuhSOJD/GyTPzc= X-MC-Unique: 7DSIkwZyNwauGdX44TcgeQ-1 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Cc: Tobias Fiebig , Jason Wang , qemu-stable@nongnu.org, Stefan Hajnoczi Subject: [PATCH for-7.2 v3 2/3] rtl8139: keep Tx command mode 0 and 1 separate Date: Thu, 17 Nov 2022 11:55:53 -0500 Message-Id: <20221117165554.1773409-3-stefanha@redhat.com> In-Reply-To: <20221117165554.1773409-1-stefanha@redhat.com> References: <20221117165554.1773409-1-stefanha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.8 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=stefanha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1668704226934100001 Content-Type: text/plain; charset="utf-8" There are two Tx Descriptor formats called mode 0 and mode 1. The mode is determined by the Large Send bit. CP_TX_IPCS (bit 18) is defined in mode 1 but the code checks the bit unconditionally. In mode 0 bit 18 is part of the Large Send MSS value. Explicitly check the Large Send bit to distinguish Tx command modes. This avoids bugs where modes are confused. Note that I didn't find any actual bugs aside from needlessly computing the IP checksum when the Large Send bit is enabled. Signed-off-by: Stefan Hajnoczi Acked-by: Jason Wang Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Tobias Fiebig --- hw/net/rtl8139.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c index ffef3789b5..6dd7a8e6e0 100644 --- a/hw/net/rtl8139.c +++ b/hw/net/rtl8139.c @@ -2135,7 +2135,7 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) } ip_data_len -=3D hlen; =20 - if (txdw0 & CP_TX_IPCS) + if (!(txdw0 & CP_TX_LGSEN) && (txdw0 & CP_TX_IPCS)) { DPRINTF("+++ C+ mode need IP checksum\n"); =20 @@ -2268,7 +2268,7 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) /* Stop sending this frame */ saved_size =3D 0; } - else if (txdw0 & (CP_TX_TCPCS|CP_TX_UDPCS)) + else if (!(txdw0 & CP_TX_LGSEN) && (txdw0 & (CP_TX_TCPCS|CP_TX= _UDPCS))) { DPRINTF("+++ C+ mode need TCP or UDP checksum\n"); =20 --=20 2.38.1 From nobody Fri May 10 00:31:56 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1668704288; cv=none; d=zohomail.com; s=zohoarc; b=nMrhlD2u/dYNAp4i1wRIcAYFMHG0i1HtiiYuKYO0vdyofU+kEraSTEriq2ibc3Y6FZ41zaLn3gzr0KLLnugsOjZWVoubTnKRFLZm8G7mBqxOS+rTwc4emKFLJzLSZ4Jvz2wPFUa2dYUv1xlJPuB8Sba96jrSFqpNHk3/BEljMqI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1668704288; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=5yYVLofEmu2NspRaxaIPhn3aTno+moMYuabjvgVu3SU=; b=oGj1o5XS++xEMKjoB7h9xMWdSdntMPVyvLr5168nR7ATdakcg6kzdA2EB6x7t981ExejxD2zz6li9hdtGhOR2ZqIjX4Fozm8olBOfqE1S4KZ4XZGQTtPZiGlsuhfPEjKU3365RSuSsz5WbPWym3QVfK05/bQt7nJZZLy/a8i/is= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1668704288399216.34788039300304; Thu, 17 Nov 2022 08:58:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oviBW-0005rH-Ho; Thu, 17 Nov 2022 11:56:18 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oviBU-0005qp-0o for qemu-devel@nongnu.org; Thu, 17 Nov 2022 11:56:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oviBS-0007nT-CV for qemu-devel@nongnu.org; Thu, 17 Nov 2022 11:56:15 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-49-xadYxSxSM3y5CCy_fE3O8g-1; Thu, 17 Nov 2022 11:56:12 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C6B09882820; Thu, 17 Nov 2022 16:56:11 +0000 (UTC) Received: from localhost (unknown [10.39.193.61]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2B70040C83AA; Thu, 17 Nov 2022 16:56:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1668704173; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5yYVLofEmu2NspRaxaIPhn3aTno+moMYuabjvgVu3SU=; b=RHbXiz4nH29VZws3dc0E/0cY5mgw0FpaeWenk6nM9rZEjrLtdJ0XtFYmfxEb5mb00Dc0IX BKISzv+EJgGJASQfPJ++yD3Nthshzia4hQNk8fsI+zhXEloO1Fuvg6LHOS1etygXreQqrt BfZ1cN5183h8sj8RBdz1leuUCStrL/U= X-MC-Unique: xadYxSxSM3y5CCy_fE3O8g-1 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Cc: Tobias Fiebig , Jason Wang , qemu-stable@nongnu.org, Stefan Hajnoczi , Russell King - ARM Linux Subject: [PATCH for-7.2 v3 3/3] rtl8139: honor large send MSS value Date: Thu, 17 Nov 2022 11:55:54 -0500 Message-Id: <20221117165554.1773409-4-stefanha@redhat.com> In-Reply-To: <20221117165554.1773409-1-stefanha@redhat.com> References: <20221117165554.1773409-1-stefanha@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=stefanha@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1668704289464100003 Content-Type: text/plain; charset="utf-8" The Large-Send Task Offload Tx Descriptor (9.2.1 Transmit) has a Large-Send MSS value where the driver specifies the MSS. See the datasheet here: http://realtek.info/pdf/rtl8139cp.pdf The code ignores this value and uses a hardcoded MSS of 1500 bytes instead. When the MTU is less than 1500 bytes the hardcoded value results in IP fragmentation and poor performance. Use the Large-Send MSS value to correctly size Large-Send packets. Jason Wang noticed that the Large-Send MSS value mask was incorrect so it is adjusted to match the datasheet and Linux 8139cp driver. This issue was discussed in the past here: https://lore.kernel.org/all/20161114162505.GD26664@stefanha-x1.localdomain/ Reported-by: Russell King - ARM Linux Reported-by: Tobias Fiebig Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1312 Signed-off-by: Stefan Hajnoczi Acked-by: Jason Wang Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Tobias Fiebig --- hw/net/rtl8139.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c index 6dd7a8e6e0..700b1b66b6 100644 --- a/hw/net/rtl8139.c +++ b/hw/net/rtl8139.c @@ -77,7 +77,6 @@ ( ( input ) & ( size - 1 ) ) =20 #define ETHER_TYPE_LEN 2 -#define ETH_MTU 1500 =20 #define VLAN_TCI_LEN 2 #define VLAN_HLEN (ETHER_TYPE_LEN + VLAN_TCI_LEN) @@ -1934,8 +1933,9 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) #define CP_TX_LS (1<<28) /* large send packet flag */ #define CP_TX_LGSEN (1<<27) -/* large send MSS mask, bits 16...25 */ -#define CP_TC_LGSEN_MSS_MASK ((1 << 12) - 1) +/* large send MSS mask, bits 16...26 */ +#define CP_TC_LGSEN_MSS_SHIFT 16 +#define CP_TC_LGSEN_MSS_MASK ((1 << 11) - 1) =20 /* IP checksum offload flag */ #define CP_TX_IPCS (1<<18) @@ -2152,10 +2152,11 @@ static int rtl8139_cplus_transmit_one(RTL8139State = *s) goto skip_offload; } =20 - int large_send_mss =3D (txdw0 >> 16) & CP_TC_LGSEN_MSS_MAS= K; + int large_send_mss =3D (txdw0 >> CP_TC_LGSEN_MSS_SHIFT) & + CP_TC_LGSEN_MSS_MASK; =20 - DPRINTF("+++ C+ mode offloaded task TSO MTU=3D%d IP data %= d " - "frame data %d specified MSS=3D%d\n", ETH_MTU, + DPRINTF("+++ C+ mode offloaded task TSO IP data %d " + "frame data %d specified MSS=3D%d\n", ip_data_len, saved_size - ETH_HLEN, large_send_mss); =20 int tcp_send_offset =3D 0; @@ -2180,25 +2181,22 @@ static int rtl8139_cplus_transmit_one(RTL8139State = *s) goto skip_offload; } =20 - /* ETH_MTU =3D ip header len + tcp header len + payload */ int tcp_data_len =3D ip_data_len - tcp_hlen; - int tcp_chunk_size =3D ETH_MTU - hlen - tcp_hlen; =20 DPRINTF("+++ C+ mode TSO IP data len %d TCP hlen %d TCP " - "data len %d TCP chunk size %d\n", ip_data_len, - tcp_hlen, tcp_data_len, tcp_chunk_size); + "data len %d\n", ip_data_len, tcp_hlen, tcp_data_len); =20 /* note the cycle below overwrites IP header data, but restores it from saved_ip_header before sending pac= ket */ =20 int is_last_frame =3D 0; =20 - for (tcp_send_offset =3D 0; tcp_send_offset < tcp_data_len= ; tcp_send_offset +=3D tcp_chunk_size) + for (tcp_send_offset =3D 0; tcp_send_offset < tcp_data_len= ; tcp_send_offset +=3D large_send_mss) { - uint16_t chunk_size =3D tcp_chunk_size; + uint16_t chunk_size =3D large_send_mss; =20 /* check if this is the last frame */ - if (tcp_send_offset + tcp_chunk_size >=3D tcp_data_len) + if (tcp_send_offset + large_send_mss >=3D tcp_data_len) { is_last_frame =3D 1; chunk_size =3D tcp_data_len - tcp_send_offset; @@ -2247,7 +2245,7 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) ip->ip_len =3D cpu_to_be16(hlen + tcp_hlen + chunk_siz= e); =20 /* increment IP id for subsequent frames */ - ip->ip_id =3D cpu_to_be16(tcp_send_offset/tcp_chunk_si= ze + be16_to_cpu(ip->ip_id)); + ip->ip_id =3D cpu_to_be16(tcp_send_offset/large_send_m= ss + be16_to_cpu(ip->ip_id)); =20 ip->ip_sum =3D 0; ip->ip_sum =3D ip_checksum(eth_payload_data, hlen); --=20 2.38.1