From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mika Westerberg Subject: Re: [PATCH net-next] net: thunderbolt: Clear finished Tx frame bus address in tbnet_tx_callback() Date: Mon, 13 Nov 2017 12:21:48 +0200 Message-ID: <20171113102148.GP18997@lahna.fi.intel.com> References: <20171109104628.63979-1-mika.westerberg@linux.intel.com> <20171111.192124.1886178021388114448.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: michael.jamet@intel.com, yehezkel.bernat@intel.com, netdev@vger.kernel.org To: David Miller Return-path: Received: from mga07.intel.com ([134.134.136.100]:48935 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751391AbdKMK2X (ORCPT ); Mon, 13 Nov 2017 05:28:23 -0500 Content-Disposition: inline In-Reply-To: <20171111.192124.1886178021388114448.davem@davemloft.net> Sender: netdev-owner@vger.kernel.org List-ID: On Sat, Nov 11, 2017 at 07:21:24PM +0900, David Miller wrote: > From: Mika Westerberg > Date: Thu, 9 Nov 2017 13:46:28 +0300 > > > When Thunderbolt network interface is disabled or when the cable is > > unplugged the driver releases all allocated buffers by calling > > tbnet_free_buffers() for each ring. This function then calls > > dma_unmap_page() for each buffer it finds where bus address is non-zero. > > Now, we only clear this bus address when the Tx buffer is sent to the > > hardware so it is possible that the function finds an entry that has > > already been unmapped. > > > > Enabling DMA-API debugging catches this as well: > > > > thunderbolt 0000:06:00.0: DMA-API: device driver tries to free DMA > > memory it has not allocated [device address=0x0000000068321000] [size=4096 bytes] > > > > Fix this by clearing the bus address of a Tx frame right after we have > > unmapped the buffer. > > > > Signed-off-by: Mika Westerberg > > Applied, but assuming zero is a non-valid DMA address is never a good > idea. That's why we have the DMA error code signaling abstracted. There does not seem to be a way to mark DMA address invalid in a driver so we probably need to add a flag to struct tbnet_frame instead.