All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry
@ 2023-03-16 14:09 Desnes Nunes
  2023-03-16 14:09 ` [PATCH v2 1/3] dma-debug: small dma_debug_entry's comment and variable name updates Desnes Nunes
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Desnes Nunes @ 2023-03-16 14:09 UTC (permalink / raw)
  To: iommu, linux-scsi, storagedev, linux-kernel
  Cc: hch, martin.petersen, don.brace, m.szyprowski, robin.murphy,
	jejb, jsnitsel, Desnes Nunes

In summary, this series fixes an overlapping mappings asymmetry on the
smartpqi driver due to a missing pqi_pci_unmap() call, while also adding
the cacheline on debug messages of dma-debug debugging functions.

Other minor non-functional updates are also provided.

Desnes Nunes (3):
  dma-debug: small dma_debug_entry's comment and variable name updates
  dma-debug: add cacheline to user/kernel space dump messages
  scsi: smartpqi: fix overlapping mappings asymmetry on DMA

 drivers/scsi/smartpqi/smartpqi_init.c |   2 +
 kernel/dma/debug.c                    | 133 ++++++++++++++------------
 2 files changed, 72 insertions(+), 63 deletions(-)

-- 
2.39.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/3] dma-debug: small dma_debug_entry's comment and variable name updates
  2023-03-16 14:09 [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
@ 2023-03-16 14:09 ` Desnes Nunes
  2023-03-16 14:09 ` [PATCH v2 2/3] dma-debug: add cacheline to user/kernel space dump messages Desnes Nunes
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Desnes Nunes @ 2023-03-16 14:09 UTC (permalink / raw)
  To: iommu, linux-scsi, storagedev, linux-kernel
  Cc: hch, martin.petersen, don.brace, m.szyprowski, robin.murphy,
	jejb, jsnitsel, Desnes Nunes

Small update on dma_debug_entry's struct commentary and also standardize
the usage of 'dma_addr' variable name from debug_dma_map_page() on
debug_dma_unmap_page(), and similarly on debug_dma_free_coherent()

Signed-off-by: Desnes Nunes <desnesn@redhat.com>
---
V1 -> V2: Updated comment properly

 kernel/dma/debug.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
index 18c93c2276ca..9aa5100d0d7e 100644
--- a/kernel/dma/debug.c
+++ b/kernel/dma/debug.c
@@ -53,6 +53,7 @@ enum map_err_types {
  * struct dma_debug_entry - track a dma_map* or dma_alloc_coherent mapping
  * @list: node on pre-allocated free_entries list
  * @dev: 'dev' argument to dma_map_{page|single|sg} or dma_alloc_coherent
+ * @dev_addr: dma address
  * @size: length of the mapping
  * @type: single, page, sg, coherent
  * @direction: enum dma_data_direction
@@ -1262,13 +1263,13 @@ void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
 }
 EXPORT_SYMBOL(debug_dma_mapping_error);
 
-void debug_dma_unmap_page(struct device *dev, dma_addr_t addr,
+void debug_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
 			  size_t size, int direction)
 {
 	struct dma_debug_entry ref = {
 		.type           = dma_debug_single,
 		.dev            = dev,
-		.dev_addr       = addr,
+		.dev_addr       = dma_addr,
 		.size           = size,
 		.direction      = direction,
 	};
@@ -1403,13 +1404,13 @@ void debug_dma_alloc_coherent(struct device *dev, size_t size,
 }
 
 void debug_dma_free_coherent(struct device *dev, size_t size,
-			 void *virt, dma_addr_t addr)
+			 void *virt, dma_addr_t dma_addr)
 {
 	struct dma_debug_entry ref = {
 		.type           = dma_debug_coherent,
 		.dev            = dev,
 		.offset		= offset_in_page(virt),
-		.dev_addr       = addr,
+		.dev_addr       = dma_addr,
 		.size           = size,
 		.direction      = DMA_BIDIRECTIONAL,
 	};
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/3] dma-debug: add cacheline to user/kernel space dump messages
  2023-03-16 14:09 [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
  2023-03-16 14:09 ` [PATCH v2 1/3] dma-debug: small dma_debug_entry's comment and variable name updates Desnes Nunes
@ 2023-03-16 14:09 ` Desnes Nunes
  2023-03-16 14:09 ` [PATCH v2 3/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Desnes Nunes @ 2023-03-16 14:09 UTC (permalink / raw)
  To: iommu, linux-scsi, storagedev, linux-kernel
  Cc: hch, martin.petersen, don.brace, m.szyprowski, robin.murphy,
	jejb, jsnitsel, Desnes Nunes

Having the cacheline also printed on the debug_dma_dump_mappings() and
dump_show() is useful for debugging. Furthermore, this also standardizes
the messages shown on both dump functions.

Signed-off-by: Desnes Nunes <desnesn@redhat.com>
---
 kernel/dma/debug.c | 122 ++++++++++++++++++++++++---------------------
 1 file changed, 64 insertions(+), 58 deletions(-)

diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
index e0ad8db1ec25..19cc59829ffd 100644
--- a/kernel/dma/debug.c
+++ b/kernel/dma/debug.c
@@ -396,37 +396,6 @@ static unsigned long long phys_addr(struct dma_debug_entry *entry)
 	return page_to_phys(pfn_to_page(entry->pfn)) + entry->offset;
 }
 
-/*
- * Dump mapping entries for debugging purposes
- */
-void debug_dma_dump_mappings(struct device *dev)
-{
-	int idx;
-
-	for (idx = 0; idx < HASH_SIZE; idx++) {
-		struct hash_bucket *bucket = &dma_entry_hash[idx];
-		struct dma_debug_entry *entry;
-		unsigned long flags;
-
-		spin_lock_irqsave(&bucket->lock, flags);
-
-		list_for_each_entry(entry, &bucket->list, list) {
-			if (!dev || dev == entry->dev) {
-				dev_info(entry->dev,
-					 "%s idx %d P=%Lx N=%lx D=%Lx L=%Lx %s %s\n",
-					 type2name[entry->type], idx,
-					 phys_addr(entry), entry->pfn,
-					 entry->dev_addr, entry->size,
-					 dir2name[entry->direction],
-					 maperr2str[entry->map_err_type]);
-			}
-		}
-
-		spin_unlock_irqrestore(&bucket->lock, flags);
-		cond_resched();
-	}
-}
-
 /*
  * For each mapping (initial cacheline in the case of
  * dma_alloc_coherent/dma_map_page, initial cacheline in each page of a
@@ -547,6 +516,70 @@ static void active_cacheline_remove(struct dma_debug_entry *entry)
 	spin_unlock_irqrestore(&radix_lock, flags);
 }
 
+/*
+ * Dump mappings entries on kernel space for debugging purposes
+ */
+void debug_dma_dump_mappings(struct device *dev)
+{
+	int idx;
+	phys_addr_t cln;
+
+	for (idx = 0; idx < HASH_SIZE; idx++) {
+		struct hash_bucket *bucket = &dma_entry_hash[idx];
+		struct dma_debug_entry *entry;
+		unsigned long flags;
+
+		spin_lock_irqsave(&bucket->lock, flags);
+		list_for_each_entry(entry, &bucket->list, list) {
+			if (!dev || dev == entry->dev) {
+				cln = to_cacheline_number(entry);
+				dev_info(entry->dev,
+					 "%s idx %d P=%llx N=%lx D=%llx L=%llx cln=%llx %s %s\n",
+					 type2name[entry->type], idx,
+					 phys_addr(entry), entry->pfn,
+					 entry->dev_addr, entry->size,
+					 cln, dir2name[entry->direction],
+					 maperr2str[entry->map_err_type]);
+			}
+		}
+		spin_unlock_irqrestore(&bucket->lock, flags);
+
+		cond_resched();
+	}
+}
+
+/*
+ * Dump mappings entries on user space via debugfs
+ */
+static int dump_show(struct seq_file *seq, void *v)
+{
+	int idx;
+	phys_addr_t cln;
+
+	for (idx = 0; idx < HASH_SIZE; idx++) {
+		struct hash_bucket *bucket = &dma_entry_hash[idx];
+		struct dma_debug_entry *entry;
+		unsigned long flags;
+
+		spin_lock_irqsave(&bucket->lock, flags);
+		list_for_each_entry(entry, &bucket->list, list) {
+			cln = to_cacheline_number(entry);
+			seq_printf(seq,
+				   "%s %s %s idx %d P=%llx N=%lx D=%llx L=%llx cln=%llx %s %s\n",
+				   dev_driver_string(entry->dev),
+				   dev_name(entry->dev),
+				   type2name[entry->type], idx,
+				   phys_addr(entry), entry->pfn,
+				   entry->dev_addr, entry->size,
+				   cln, dir2name[entry->direction],
+				   maperr2str[entry->map_err_type]);
+		}
+		spin_unlock_irqrestore(&bucket->lock, flags);
+	}
+	return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(dump);
+
 /*
  * Wrapper function for adding an entry to the hash.
  * This function takes care of locking itself.
@@ -765,33 +798,6 @@ static const struct file_operations filter_fops = {
 	.llseek = default_llseek,
 };
 
-static int dump_show(struct seq_file *seq, void *v)
-{
-	int idx;
-
-	for (idx = 0; idx < HASH_SIZE; idx++) {
-		struct hash_bucket *bucket = &dma_entry_hash[idx];
-		struct dma_debug_entry *entry;
-		unsigned long flags;
-
-		spin_lock_irqsave(&bucket->lock, flags);
-		list_for_each_entry(entry, &bucket->list, list) {
-			seq_printf(seq,
-				   "%s %s %s idx %d P=%llx N=%lx D=%llx L=%llx %s %s\n",
-				   dev_name(entry->dev),
-				   dev_driver_string(entry->dev),
-				   type2name[entry->type], idx,
-				   phys_addr(entry), entry->pfn,
-				   entry->dev_addr, entry->size,
-				   dir2name[entry->direction],
-				   maperr2str[entry->map_err_type]);
-		}
-		spin_unlock_irqrestore(&bucket->lock, flags);
-	}
-	return 0;
-}
-DEFINE_SHOW_ATTRIBUTE(dump);
-
 static int __init dma_debug_fs_init(void)
 {
 	struct dentry *dentry = debugfs_create_dir("dma-api", NULL);
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry
  2023-03-16 14:09 [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
  2023-03-16 14:09 ` [PATCH v2 1/3] dma-debug: small dma_debug_entry's comment and variable name updates Desnes Nunes
  2023-03-16 14:09 ` [PATCH v2 2/3] dma-debug: add cacheline to user/kernel space dump messages Desnes Nunes
@ 2023-03-16 14:09 ` Desnes Nunes
  2023-03-28  1:37 ` [PATCH v2 0/3] " Christoph Hellwig
  2023-03-29  7:15 ` Geert Uytterhoeven
  4 siblings, 0 replies; 6+ messages in thread
From: Desnes Nunes @ 2023-03-16 14:09 UTC (permalink / raw)
  To: iommu, linux-scsi, storagedev, linux-kernel
  Cc: hch, martin.petersen, don.brace, m.szyprowski, robin.murphy,
	jejb, jsnitsel, Desnes Nunes

Currently, pqi_keep_device_offline() calls pqi_build_raid_path_request()
(i.e., a wrapper to pqi_map_single()), but there isn't a pqi_pci_unmap()
call in pqi_keep_device_offline(). Hence, this is flaged as an API viola-
tion due to the overlapping mapping of the physical address.

This patch fixes following warning:

  DMA-API: smartpqi 0000:43:00.0: cacheline tracking EEXIST, overlapping
  mappings aren't supported
  WARNING: CPU: 0 PID: 15 at kernel/dma/debug.c:570
  add_dma_entry+0x1f6/0x2f0
  CPU: 0 PID: 15 Comm: kworker/0:1 Not tainted 6.3.0-rc1-linux #1
  Call Trace:
   <TASK>
   dma_map_page_attrs+0x6f/0xa0
   pqi_map_single+0xaa/0x160 [smartpqi]
   pqi_keep_device_offline+0xaf/0x160 [smartpqi]
   ? dma_unmap_page_attrs+0x1a1/0x1e0
   ? pqi_identify_physical_device.constprop.0+0xd3/0xe0 [smartpqi]
   pqi_update_scsi_devices+0x284/0x7e0 [smartpqi]
   pqi_scan_scsi_devices+0x87/0xe0 [smartpqi]
   pqi_ctrl_init+0x725/0xa60 [smartpqi]
   pqi_pci_probe+0xa7/0x130 [smartpqi]
   local_pci_probe+0x46/0xa0
   work_for_cpu_fn+0x16/0x20
   process_one_work+0x2bf/0x670
   ? __pfx_worker_thread+0x10/0x10
   worker_thread+0x1d1/0x3b0
   ? __pfx_worker_thread+0x10/0x10
   kthread+0xf3/0x120
   ? __pfx_kthread+0x10/0x10
   ret_from_fork+0x2c/0x50
   </TASK>

Fixes: be76f90668d8 ("scsi: smartpqi: Add TEST UNIT READY check for SANITIZE operation")
Signed-off-by: Desnes Nunes <desnesn@redhat.com>
---
 drivers/scsi/smartpqi/smartpqi_init.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 49a8f91810b6..6fca497ca605 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -1726,6 +1726,8 @@ static bool pqi_keep_device_offline(struct pqi_ctrl_info *ctrl_info,
 
 	rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0, &error_info);
 
+	pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
+
 	if (rc)
 		goto out; /* Assume not offline */
 
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry
  2023-03-16 14:09 [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
                   ` (2 preceding siblings ...)
  2023-03-16 14:09 ` [PATCH v2 3/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
@ 2023-03-28  1:37 ` Christoph Hellwig
  2023-03-29  7:15 ` Geert Uytterhoeven
  4 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2023-03-28  1:37 UTC (permalink / raw)
  To: Desnes Nunes
  Cc: iommu, linux-scsi, storagedev, linux-kernel, hch,
	martin.petersen, don.brace, m.szyprowski, robin.murphy, jejb,
	jsnitsel


Thanks,

I've applied patches 1 and 2 to the dma mapping tree.  You might want
to resent patch 1 to the scsi maintainers and list to better get it
onto their radar.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry
  2023-03-16 14:09 [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
                   ` (3 preceding siblings ...)
  2023-03-28  1:37 ` [PATCH v2 0/3] " Christoph Hellwig
@ 2023-03-29  7:15 ` Geert Uytterhoeven
  4 siblings, 0 replies; 6+ messages in thread
From: Geert Uytterhoeven @ 2023-03-29  7:15 UTC (permalink / raw)
  To: Desnes Nunes
  Cc: iommu, linux-scsi, storagedev, linux-kernel, hch,
	martin.petersen, don.brace, m.szyprowski, robin.murphy, jejb,
	jsnitsel

Hi Desnes,

On Thu, Mar 16, 2023 at 3:13 PM Desnes Nunes <desnesn@redhat.com> wrote:
> In summary, this series fixes an overlapping mappings asymmetry on the
> smartpqi driver due to a missing pqi_pci_unmap() call, while also adding
> the cacheline on debug messages of dma-debug debugging functions.
>
> Other minor non-functional updates are also provided.

Thanks for your series!

Unfortunately this v2 does not fix the build issues reported by the
bots, thus breaking linux-next on plain 32-bit.

I have sent a fix
https://lore.kernel.org/r/20230329071405.1568021-1-geert+renesas@glider.be

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-03-29  7:16 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-16 14:09 [PATCH v2 0/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
2023-03-16 14:09 ` [PATCH v2 1/3] dma-debug: small dma_debug_entry's comment and variable name updates Desnes Nunes
2023-03-16 14:09 ` [PATCH v2 2/3] dma-debug: add cacheline to user/kernel space dump messages Desnes Nunes
2023-03-16 14:09 ` [PATCH v2 3/3] scsi: smartpqi: fix DMA overlapping mappings asymmetry Desnes Nunes
2023-03-28  1:37 ` [PATCH v2 0/3] " Christoph Hellwig
2023-03-29  7:15 ` Geert Uytterhoeven

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.