:Otherwise right now your guess is as good as mine.
:
:As a side note, it seems silly that we do this:
:
:        MPLOCKED incl _cnt+V_SYSCALL
:        SYSCALL_LOCK
:        call    _syscall
:
:I think per-cpu statistics would be an interesting optimization,
:since you're testing all of this, have you been able to measure
:the getuid() loop with and without this (MPLOCKED incl _cnt+V_SYSCALL),
:especially with 2 processes doing a getuid() loop?
:
:-- 
:-Alfred Perlstein - [[EMAIL PROTECTED]|[EMAIL PROTECTED]]

    Well, in my patch SYSCALL_LOCK is no longer called there so
    we can't move the incl and remove the MPLOCKED prefix.  A competing
    locked instruction costs around 200 nS.  I.E. it's expensive, which
    is why zone locks aren't a good idea and structural locks are.

    I've enclosed my syscall timing program.  I will also put it on
    my site.

                                        -Matt
                                        Matthew Dillon 
                                        <[EMAIL PROTECTED]>



/*
 * SMPTIME.C
 *
 *      cc smptime.c -o smptime -Wall -DOP=OPn
 *      ./smptime NFORK
 *
 *      e.g.
 *
 *      cc smptime.c -o smptime -Wall -DOP=OP3
 *      ./smptime 1
 *      ./smptime 2
 */

#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <setjmp.h>

void deltatime(struct timeval *tv1);
void FigureOutUseCount(void);

#define OP1 sigprocmask(SIG_BLOCK, &sset, &oset);
#define OP2 getpid()
#define OP3 getuid()            /* CLEAN OF MP LOCK */
#define OP4 __asm __volatile("addl $1,(%0)"::"r"(global_tmp):"memory")
#define OP5 __asm __volatile("lock; addl $1,(%0)"::"r"(global_tmp):"memory")
#define OP6
#ifndef OP
#error "Missing -DOP=OPn option to cc"
#endif

#define OPNAME(V)       #V

int *global_tmp;
int UseCount = 1;

int
main(int ac, char **av)
{
    int i;
    int count = 0;
    int nproc = 2;
    sigset_t sset;
    sigset_t oset;
    struct timeval tv1;

    if (ac == 2)
        nproc = strtol(av[1], NULL, 0);

    sigemptyset(&sset);
    sigemptyset(&oset);
    gettimeofday(&tv1, NULL);
    global_tmp = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, 
-1, 0);

    FigureOutUseCount();

    for (i = 1; i < nproc; ++i) {
        if (fork() == 0) {
            /*
             * child
             */
            for (;;) {
                OP;
            }
            _exit(0);
        }
    }
    /*
     * parent
     */
    for (;;) {
        OP;
        if (++count == UseCount) {
            deltatime(&tv1);
            count = 0;
        }
    }
    return(0);
}

void
deltatime(struct timeval *tv1)
{
    struct timeval tv2;
    int usec;

    gettimeofday(&tv2, NULL);
    usec = tv2.tv_usec + 1000000 - tv1->tv_usec + 1000000 * (tv2.tv_sec - tv1->tv_sec 
- 1);
    *tv1 = tv2;
    printf("%d nsec/call\n", usec / (UseCount / 1000));
}


/*
 *  Time one second's worth of loops to get a baseline.
 */

jmp_buf TimeEnv;

void
sigAlrm(int sigNo)
{
    longjmp(TimeEnv, 1);
}

void
FigureOutUseCount(void)
{
    struct itimerval it;

    bzero(&it, sizeof(it));
    it.it_value.tv_sec = 1;

    signal(SIGALRM, sigAlrm);
    setitimer(ITIMER_REAL, &it, NULL);
    if (setjmp(TimeEnv) == 0) {
        for (;;) {
            OP;
            ++UseCount;
        }
        /* NOT REACHED */
    }
    signal(SIGALRM, SIG_IGN);
}



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to