When running multiple graphical application and vram is saturated, the excessive swapping triggers the BUG_ON() in dma_resv_add_fences. The root cause is that calling dma_resv_reserve_fences twice would shadow the second call and this happens in amdgpu_cs_ioctl/amdgpu_gem_va_ioctl path shadowing reserve calls made in ttm.
The first patch fixes a missing reserve surfaced by the stricter reserve check below. The second patch reworks dma_resv_reserve_fences to allow it to be called multiple times. It also makes the error check more percise and less costly, hopefully this would catch missing reserve more reliably.