s->dma_length = 0;
        }
 }
+
+static unsigned long *bitmap_vzalloc(size_t bits, gfp_t flags)
+{
+       size_t n = BITS_TO_LONGS(bits);
+       size_t bytes;
+
+       if (unlikely(check_mul_overflow(n, sizeof(unsigned long), &bytes)))
+               return NULL;
+
+       return vzalloc(bytes);
+}
        
 int zpci_dma_init_device(struct zpci_dev *zdev)
 {
                                zdev->end_dma - zdev->start_dma + 1);
        zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1;
        zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT;
-       zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8);
+       zdev->iommu_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
        if (!zdev->iommu_bitmap) {
                rc = -ENOMEM;
                goto free_dma_table;
        }
        if (!s390_iommu_strict) {
-               zdev->lazy_bitmap = vzalloc(zdev->iommu_pages / 8);
+               zdev->lazy_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
                if (!zdev->lazy_bitmap) {
                        rc = -ENOMEM;
                        goto free_bitmap;