All of lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] iommu/vt-d: Fix unmap_pages support
@ 2021-11-29  8:29 Dan Carpenter
  2021-11-29  8:37 ` Ajay Garg
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2021-11-29  8:29 UTC (permalink / raw)
  To: alex.williamson; +Cc: iommu

Hello Alex Williamson,

The patch edad96db58d2: "iommu/vt-d: Fix unmap_pages support" from
Nov 22, 2021, leads to the following Smatch static checker warning:

	drivers/iommu/intel/iommu.c:1369 dma_pte_clear_level()
	error: uninitialized symbol 'level_pfn'.

drivers/iommu/intel/iommu.c
    1330 static struct page *dma_pte_clear_level(struct dmar_domain *domain, int level,
    1331                                         struct dma_pte *pte, unsigned long pfn,
    1332                                         unsigned long start_pfn,
    1333                                         unsigned long last_pfn,
    1334                                         struct page *freelist)
    1335 {
    1336         struct dma_pte *first_pte = NULL, *last_pte = NULL;
    1337 
    1338         pfn = max(start_pfn, pfn);
    1339         pte = &pte[pfn_level_offset(pfn, level)];
    1340 
    1341         do {
    1342                 unsigned long level_pfn;
    1343 
    1344                 if (!dma_pte_present(pte))
    1345                         goto next;
                                 ^^^^^^^^^^

If we ever hit this goto then there is going to be a bug.

    1346 
    1347                 level_pfn = pfn & level_mask(level);
    1348 
    1349                 /* If range covers entire pagetable, free it */
    1350                 if (start_pfn <= level_pfn &&
    1351                     last_pfn >= level_pfn + level_size(level) - 1) {
    1352                         /* These suborbinate page tables are going away entirely. Don't
    1353                            bother to clear them; we're just going to *free* them. */
    1354                         if (level > 1 && !dma_pte_superpage(pte))
    1355                                 freelist = dma_pte_list_pagetables(domain, level - 1, pte, freelist);
    1356 
    1357                         dma_clear_pte(pte);
    1358                         if (!first_pte)
    1359                                 first_pte = pte;
    1360                         last_pte = pte;
    1361                 } else if (level > 1) {
    1362                         /* Recurse down into a level that isn't *entirely* obsolete */
    1363                         freelist = dma_pte_clear_level(domain, level - 1,
    1364                                                        phys_to_virt(dma_pte_addr(pte)),
    1365                                                        level_pfn, start_pfn, last_pfn,
    1366                                                        freelist);
    1367                 }
    1368 next:
--> 1369                 pfn = level_pfn + level_size(level);
                               ^^^^^^^^^

    1370         } while (!first_pte_in_page(++pte) && pfn <= last_pfn);
    1371 
    1372         if (first_pte)
    1373                 domain_flush_cache(domain, first_pte,
    1374                                    (void *)++last_pte - (void *)first_pte);
    1375 
    1376         return freelist;
    1377 }

regards,
dan carpenter
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

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

* Re: [bug report] iommu/vt-d: Fix unmap_pages support
  2021-11-29  8:29 [bug report] iommu/vt-d: Fix unmap_pages support Dan Carpenter
@ 2021-11-29  8:37 ` Ajay Garg
  0 siblings, 0 replies; 2+ messages in thread
From: Ajay Garg @ 2021-11-29  8:37 UTC (permalink / raw)
  To: Dan Carpenter; +Cc: alex.williamson, iommu

Hi Dan.

The updated patch has landed in mainline, as per :
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=86dc40c7ea9c22f64571e0e45f695de73a0e2644



On Mon, Nov 29, 2021 at 2:00 PM Dan Carpenter <dan.carpenter@oracle.com> wrote:
>
> Hello Alex Williamson,
>
> The patch edad96db58d2: "iommu/vt-d: Fix unmap_pages support" from
> Nov 22, 2021, leads to the following Smatch static checker warning:
>
>         drivers/iommu/intel/iommu.c:1369 dma_pte_clear_level()
>         error: uninitialized symbol 'level_pfn'.
>
> drivers/iommu/intel/iommu.c
>     1330 static struct page *dma_pte_clear_level(struct dmar_domain *domain, int level,
>     1331                                         struct dma_pte *pte, unsigned long pfn,
>     1332                                         unsigned long start_pfn,
>     1333                                         unsigned long last_pfn,
>     1334                                         struct page *freelist)
>     1335 {
>     1336         struct dma_pte *first_pte = NULL, *last_pte = NULL;
>     1337
>     1338         pfn = max(start_pfn, pfn);
>     1339         pte = &pte[pfn_level_offset(pfn, level)];
>     1340
>     1341         do {
>     1342                 unsigned long level_pfn;
>     1343
>     1344                 if (!dma_pte_present(pte))
>     1345                         goto next;
>                                  ^^^^^^^^^^
>
> If we ever hit this goto then there is going to be a bug.
>
>     1346
>     1347                 level_pfn = pfn & level_mask(level);
>     1348
>     1349                 /* If range covers entire pagetable, free it */
>     1350                 if (start_pfn <= level_pfn &&
>     1351                     last_pfn >= level_pfn + level_size(level) - 1) {
>     1352                         /* These suborbinate page tables are going away entirely. Don't
>     1353                            bother to clear them; we're just going to *free* them. */
>     1354                         if (level > 1 && !dma_pte_superpage(pte))
>     1355                                 freelist = dma_pte_list_pagetables(domain, level - 1, pte, freelist);
>     1356
>     1357                         dma_clear_pte(pte);
>     1358                         if (!first_pte)
>     1359                                 first_pte = pte;
>     1360                         last_pte = pte;
>     1361                 } else if (level > 1) {
>     1362                         /* Recurse down into a level that isn't *entirely* obsolete */
>     1363                         freelist = dma_pte_clear_level(domain, level - 1,
>     1364                                                        phys_to_virt(dma_pte_addr(pte)),
>     1365                                                        level_pfn, start_pfn, last_pfn,
>     1366                                                        freelist);
>     1367                 }
>     1368 next:
> --> 1369                 pfn = level_pfn + level_size(level);
>                                ^^^^^^^^^
>
>     1370         } while (!first_pte_in_page(++pte) && pfn <= last_pfn);
>     1371
>     1372         if (first_pte)
>     1373                 domain_flush_cache(domain, first_pte,
>     1374                                    (void *)++last_pte - (void *)first_pte);
>     1375
>     1376         return freelist;
>     1377 }
>
> regards,
> dan carpenter
> _______________________________________________
> iommu mailing list
> iommu@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/iommu
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

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

end of thread, other threads:[~2021-11-29  8:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-29  8:29 [bug report] iommu/vt-d: Fix unmap_pages support Dan Carpenter
2021-11-29  8:37 ` Ajay Garg

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.