What I do is use the circular buffer mode on the ADC DMA, and use the HAL_ADC_ConvHalfCpltCallback as well as the HAL_ADC_ConvCpltCallback. In each of these callbacks I use xTaskNotifyFromISR to send a message back to my ADC task, either HALF_DONE or ALL_DONE.
The ADC task waits on a xTaskNotifyWait, and depending on which message it gets, processes one half of the DMA block or the other.
In my case I have a timer triggering conversions at 200Hz., so I have 5ms to process the ADC conversions before the next tranche becomes available. In your case you will have 50us to process 4 values. If you swamp the system with interrupts, you might want to have the DMA fire after, say, 100 sets of 4 values (if you're averaging to reduce ADC noise), thereby giving yourself 5ms to process 400 values.
A