>> +static void pci_dma_range_setup(struct pci_dev *pdev) >> +{ >> + struct zpci_dev *zdev = to_zpci(pdev); >> + struct bus_dma_region *map; >> + >> + map = kzalloc(sizeof(*map), GFP_KERNEL); >> + if (!map) >> + return; >> + >> + map->cpu_start = 0; >> + map->dma_start = PAGE_ALIGN(zdev->start_dma); >> + map->size = max(PAGE_ALIGN_DOWN(zdev->end_dma + 1) - map->dma_start, 0); > > Ugh, this is my fault as I suggested it, but this max() doesn't work > here. The zdev->end_dma is unsigned and so is map->dma_start so if the > former is smaller underflow will occur and the max() won't save us. > It's largely a theoretical issue since zdev->end_dma + 1 should always > be larger than zdev->start_dma, but now the max() looks like we thought > of that, but then it doesn't work. > > If we handle it maybe just go with: > > aligned_end = PAGE_ALIGN_DOWN(zdev->end_dma + 1); > if (aligned_end >= map->dma_start) > map->size = aligned_end - map->dma_start; > else > map->size = 0; > Given that it's not really something that's supposed to happen, would it make sense then to add a WARN_ON_ONCE(map->size == 0); At the end of this?