On Fri, 10 Jul 2026 12:22:31 +0900
Masami Hiramatsu (Google) <[email protected]> wrote:

> However, this seems a bit strange that we only checks the CPU-wide context
> switching in the loop. Instead, can we introduce a per-cpu sequence counter
> to per-cpu buffer, and check it? 

I originally tried this but found a situation that it fails:

  tbuf->sequence = 0;

        Task 1                          Task 2
        ------                          ------

   tbuf->sequence++;
   seq = tbuf->sequence; (seq = 1)

   preempt_enable();

   [schedule] ---------------------->

                                  tbuf->sequence++;
                                  seq = tbuf->sequence; (seq = 2);

                                  preempt_enable();

                                  copy_from_user(buffer);

             <--------------------[schedule]

   copy_from_user(buffer);

   *** BUFFER NOW CORRUPTED ***

   [schedule] ---------------------->

                                  preempt_disable();

                                } while (tubf->sequence != seq); // 
tbuf->sequence == seq !!!!


This is why we use a CPU wide counter.

-- Steve
  


Reply via email to