drivers/xen/swiotlb-xen.c:315 xen_swiotlb_alloc_coherent() error: we previously assumed 'hwdev' could be null (see line 308)

From: Dan Carpenter
Date: Mon Jun 14 2021 - 08:04:52 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 43cb5d49a99b3ecd9fef9826899aac948c3048da
commit: 7bc5c428a660d4d1bc95ba54bf4cb6bccf8c3029 dma-direct: remove __dma_to_phys
config: x86_64-randconfig-m001-20210612 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

smatch warnings:
drivers/xen/swiotlb-xen.c:315 xen_swiotlb_alloc_coherent() error: we previously assumed 'hwdev' could be null (see line 308)

vim +/hwdev +315 drivers/xen/swiotlb-xen.c

dceb1a6819ab2c Christoph Hellwig 2017-05-21 276 static void *
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 277 xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
baa676fcf8d555 Andrzej Pietrasiewicz 2012-03-27 278 dma_addr_t *dma_handle, gfp_t flags,
00085f1efa387a Krzysztof Kozlowski 2016-08-03 279 unsigned long attrs)
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 280 {
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 281 void *ret;
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 282 int order = get_order(size);
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 283 u64 dma_mask = DMA_BIT_MASK(32);
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 284 phys_addr_t phys;
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 285 dma_addr_t dev_addr;
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 286
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 287 /*
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 288 * Ignore region specifiers - the kernel's ideas of
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 289 * pseudo-phys memory layout has nothing to do with the
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 290 * machine physical layout. We can't allocate highmem
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 291 * because we can't return a pointer to it.
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 292 */
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 293 flags &= ~(__GFP_DMA | __GFP_HIGHMEM);
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 294
7250f422da0480 Joe Jin 2018-10-16 295 /* Convert the size to actually allocated. */
7250f422da0480 Joe Jin 2018-10-16 296 size = 1UL << (order + XEN_PAGE_SHIFT);
7250f422da0480 Joe Jin 2018-10-16 297
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 298 /* On ARM this function returns an ioremap'ped virtual address for
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 299 * which virt_to_phys doesn't return the corresponding physical
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 300 * address. In fact on ARM virt_to_phys only works for kernel direct
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 301 * mapped RAM memory. Also see comment below.
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 302 */
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 303 ret = xen_alloc_coherent_pages(hwdev, size, dma_handle, flags, attrs);
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 304
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 305 if (!ret)
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 306 return ret;
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 307
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 @308 if (hwdev && hwdev->coherent_dma_mask)
^^^^^
Hopefully this check can be removed.

038d07a283d623 Christoph Hellwig 2018-03-19 309 dma_mask = hwdev->coherent_dma_mask;
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 310
91ffe4ad534ab2 Stefano Stabellini 2020-07-10 311 /* At this point dma_handle is the dma address, next we are
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 312 * going to set it to the machine address.
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 313 * Do not use virt_to_phys(ret) because on ARM it doesn't correspond
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 314 * to *dma_handle. */
91ffe4ad534ab2 Stefano Stabellini 2020-07-10 @315 phys = dma_to_phys(hwdev, *dma_handle);
^^^^^
dma_to_phys() does not check.

91ffe4ad534ab2 Stefano Stabellini 2020-07-10 316 dev_addr = xen_phys_to_dma(hwdev, phys);
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 317 if (((dev_addr + size - 1 <= dma_mask)) &&
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 318 !range_straddles_page_boundary(phys, size))
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 319 *dma_handle = dev_addr;
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 320 else {
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 321 if (xen_create_contiguous_region(phys, order,
69908907b02efe Stefano Stabellini 2013-10-09 322 fls64(dma_mask), dma_handle) != 0) {
1b65c4e5a9af1a Stefano Stabellini 2013-10-10 323 xen_free_coherent_pages(hwdev, size, ret, (dma_addr_t)phys, attrs);
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 324 return NULL;
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 325 }
91ffe4ad534ab2 Stefano Stabellini 2020-07-10 326 *dma_handle = phys_to_dma(hwdev, *dma_handle);
b877ac9815a8fe Juergen Gross 2019-06-14 327 SetPageXenRemapped(virt_to_page(ret));
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 328 }
6810df88dcfc22 Konrad Rzeszutek Wilk 2011-08-25 329 memset(ret, 0, size);
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 330 return ret;
b097186fd29d5b Konrad Rzeszutek Wilk 2010-05-11 331 }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx