git: kernel - Add /dev/upmap and /dev/kpmap and sys/upmap.h (2)

Matthew Dillon dillon at crater.dragonflybsd.org
Thu Oct 16 14:58:09 PDT 2014


commit 12081e8713d2b7fa4ca9082092d907c46b9a81f4
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date:   Thu Oct 16 14:54:56 2014 -0700

    kernel - Add /dev/upmap and /dev/kpmap and sys/upmap.h (2)
    
    * Disallow writing to kpmap.
    
    * Handle cpu read/update races against ts_uptime and ts_realtime by
      making these arrays[2] and using kpmap->upticks to tell userland
      which one is stable.
    
      The procedure is as follows:
    
    	struct timespec ts_uptime;
    	struct timespec ts_realtime;
    	int w;
    
            do {
                    w = kpmap->upticks;
                    cpu_lfence();
                    ts_uptime = kpmap->ts_uptime[w & 1];
                    ts_realtime = kpmap->ts_realtime[w & 1];
                    cpu_lfence();
                    w = kpmap->upticks - w;
            } while (w > 1);
    
      This procedure avoids having to loop in all standard cases including
      the nominal kernel update / userland read race.  It will only loop if
      the kernel deschedules the user process for > 1 tick during the access
      sequence.

Summary of changes:
 sys/kern/kern_clock.c | 14 +++++++++++---
 sys/kern/kern_memio.c | 23 +++++++++++++++++++----
 sys/sys/upmap.h       | 21 +++++++++++++++++----
 3 files changed, 47 insertions(+), 11 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/12081e8713d2b7fa4ca9082092d907c46b9a81f4


-- 
DragonFly BSD source repository


More information about the Commits mailing list