Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 13 Jan 2002 21:25:34 +0100 (CET)
From:      Michal Mertl <mime@traveller.cz>
To:        arch@freebsd.org
Subject:   64 bit counters again
Message-ID:  <Pine.BSF.4.41.0201132057560.62182-100000@prg.traveller.cz>

next in thread | raw e-mail | index | archive | help
If I'm writing to this forum about inappropriate issue, you could tell me,
rather than just ignore me.

But anyway I continued on some work on STABLE (but believe lot of my work
could be used on CURRENT after some modification) and get kernel and world
building with 64 bit counters on network interfaces (struct if_data)
and in protocols (struct ipstat, tcpstat, udpstat, icmpstat, igmpstat).

I implemented new machine dependant include file (but it could be quite
easily made MI with some cpp magic I believe) and atomic_??_quad
functions (conditionally included).

I have new API for counters which resembles lot atomic?? functions but has
one more parameter. That parametr is used to tell in which part of kernel
source is the variable and the functions then does either atomic or
"normal" operation on the counter. This variable needn't to be defined
this way, it could also be used to directly tell what kind of operation is
required but I believe this way it's more flexible.

example:
-------------------------
static __inline void syscntr_add(const int loc, volatile u_int64_t *p,
u_int32_t v)
{
        switch (loc) {
                case CNTR_NET_PROTO:
                case CNTR_NET_DEV:
#if defined(SYSCNTR_ASM)
        __asm __volatile ("#syscntr_add_quad
        addl %1,(%0)
        adcl $0,4(%0)"
        :
        : "S" (p), "q" (v));
#else
                        *p+=v;
#endif
                        break;
                case CNTR_SOMETHING:
                        atomic_add_quad(p,v);
                        break;
                default:
                        atomic_add_quad(p,v);
        }
}
------------------------

It should always inline to either call to atomic function (in kernel
modules and external programs) or the simple operation.

I did small benchmark (on UP but will soon test hopefully on SMP and let
you know). I moved 256MB trhough 100FDX and measured the throughput and
load (using vmstat).  I dind't notice any performance difference between
32/64 bit, atomic/non-atomic functions (but atomic was without lock
istructions).

Before you start telling it's the wrong way to go (on CURRENT at least) I
can see there may be other modes of operation of the functions, PER_CPU
data of whatever - using something like the API provided would hide it
nicely. Once something is in a subsystem which isn't under giant or some
other change with locking or such you would change just one place and the
variables would be kept accessed the right way.

In case someone wants to see the whole thing it's at
http://home.eunet.cz/mime/syscntr.patch.0113.gz

I know there are some style problems - at least too-long lines. I have
them noted down and I'm ready to split them. Only I don't know what is the
right maximum length and how much spaces I should count for tabs.

I also noticed, that some drivers do define similar counters like if_data
in their sources - if_ar.c and others - which is for netgraph I believe. I
could quite easily change these variables to the newly defined type too
but I don't know, if one can easily change variable type in netgraph - I
didn't want to violate some standard. Also there are several drivers
(bge) which use dot3stats variables from if_mib for error counting. These
are also 32 bits.



-- 
Michal Mertl
mime@traveller.cz



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.41.0201132057560.62182-100000>