if (runtime->silence_size < runtime->boundary) {
                snd_pcm_sframes_t noise_dist, n;
-               if (runtime->silence_start != runtime->control->appl_ptr) {
-                       n = runtime->control->appl_ptr - runtime->silence_start;
+               snd_pcm_uframes_t appl_ptr = READ_ONCE(runtime->control->appl_ptr);
+               if (runtime->silence_start != appl_ptr) {
+                       n = appl_ptr - runtime->silence_start;
                        if (n < 0)
                                n += runtime->boundary;
                        if ((snd_pcm_uframes_t)n < runtime->silence_filled)
                                runtime->silence_filled -= n;
                        else
                                runtime->silence_filled = 0;
-                       runtime->silence_start = runtime->control->appl_ptr;
+                       runtime->silence_start = appl_ptr;
                }
                if (runtime->silence_filled >= runtime->buffer_size)
                        return;
                                continue; /* draining */
                }
                frames = size > avail ? avail : size;
-               cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
+               appl_ptr = READ_ONCE(runtime->control->appl_ptr);
+               appl_ofs = appl_ptr % runtime->buffer_size;
+               cont = runtime->buffer_size - appl_ofs;
                if (frames > cont)
                        frames = cont;
                if (snd_BUG_ON(!frames)) {
                        snd_pcm_stream_unlock_irq(substream);
                        return -EINVAL;
                }
-               appl_ptr = runtime->control->appl_ptr;
-               appl_ofs = appl_ptr % runtime->buffer_size;
                snd_pcm_stream_unlock_irq(substream);
                err = writer(substream, appl_ofs, data, offset, frames,
                             transfer);