Currently, vm_pageout_worker() itself checks the length of the free page queues to determine whether vm_pageout_scan(pass >= 1)'s inactive queue scan freed enough pages to meet the free page target. Specifically, vm_pageout_worker() uses vm_paging_needed(). The trouble with vm_paging_needed() is that it compares the length of the free page queues to the wakeup threshold for the page daemon, which is much lower than the free page target. Consequently, vm_pageout_worker() can conclude that the inactive queue scan succeeded in meeting its free page target when in fact it did not; and rather than immediately triggering an all out laundering pass over the inactive queue, vm_pageout_worker() goes back to sleep waiting for the free page count to fall below the page daemon wakeup threshold again at which point it will perform another limited (pass == 1) scan over the inactive queue.
Changing vm_pageout_worker() to use vm_page_count_target() instead of vm_paging_needed() won't work because any page allocations that happen concurrently with the inactive queue scan will result in the free page count being below the target at the end of a successful scan. Instead, having vm_pageout_scan() return a value indicating success or failure is the most straightforward fix.