提交 c62bb255 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Merge branch 'scale-amd64' of git+ssh://amsterdam.csail.mit.edu/home/am0/6.828/xv6 into scale-amd64

......@@ -26,7 +26,7 @@ NM = $(TOOLPREFIX)nm
OBJCOPY = $(TOOLPREFIX)objcopy
STRIP = $(TOOLPREFIX)strip
INCLUDES = -Iinclude -I$(QEMUSRC) -include param.h -include include/compiler.h
INCLUDES = -Iinclude -Istdinc -I$(QEMUSRC) -include param.h -include include/compiler.h
COMFLAGS = -static -g -MD -m64 -O3 -Wall -Werror -DHW_$(HW) -DXV6 \
-fno-builtin -fno-strict-aliasing -fno-omit-frame-pointer -fms-extensions \
-mno-sse -mcx16 -mno-red-zone $(INCLUDES)
......
......@@ -54,5 +54,6 @@
* user-space version
$ apt-get install libjemalloc-dev
$ make HW=user o.user/utest
......@@ -3,7 +3,7 @@ class arc4 {
arc4(const u8 *key, size_t nbytes) {
reset();
for (size_t n = 0; n < nbytes; n += 128)
addkey(&key[n], nbytes > n + 128 ? 128 : n + 128 - nbytes);
addkey(&key[n], nbytes - n > 128 ? 128 : nbytes - n);
j = i;
}
......@@ -21,7 +21,7 @@ class arc4 {
template<class T> T rand() {
T v;
for (u32 i = 0; i < sizeof(v); i++)
*(u8*) &v = getbyte();
i[(u8*) &v] = getbyte();
return v;
}
......
#pragma once
#if 0
#define __sync_synchronize() do { __asm__ __volatile__("" ::: "memory"); } while (0)
#endif
#define _GLIBCXX_VISIBILITY(x)
#define _GLIBCXX_BEGIN_NAMESPACE_VERSION
#define _GLIBCXX_END_NAMESPACE_VERSION
#define _GLIBCXX_BEGIN_EXTERN_C extern "C" {
#define _GLIBCXX_END_EXTERN_C }
#define __glibcxx_assert(x)
#define __barrier() do { __asm__ __volatile__("" ::: "memory"); } while (0)
#define _GLIBCXX_ATOMIC_BUILTINS_1 1
#define _GLIBCXX_ATOMIC_BUILTINS_2 1
......
......@@ -284,9 +284,11 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize();
// __sync_synchronize();
__barrier();
__int_type __ret = _M_i;
__sync_synchronize();
// __sync_synchronize();
__barrier();
return __ret;
}
......@@ -296,9 +298,11 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize();
// __sync_synchronize();
__barrier();
__int_type __ret = _M_i;
__sync_synchronize();
// __sync_synchronize();
__barrier();
return __ret;
}
......@@ -576,9 +580,11 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize();
// __sync_synchronize();
__barrier();
__pointer_type __ret = _M_p;
__sync_synchronize();
// __sync_synchronize();
__barrier();
return __ret;
}
......@@ -588,9 +594,11 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize();
// __sync_synchronize();
__barrier();
__pointer_type __ret = _M_p;
__sync_synchronize();
// __sync_synchronize();
__barrier();
return __ret;
}
......
......@@ -116,10 +116,10 @@ namespace std {
}
/* C++ runtime */
// void *operator new(unsigned long nbytes);
// void *operator new(unsigned long nbytes, void *buf);
void *operator new(unsigned long nbytes);
void *operator new(unsigned long nbytes, void *buf);
void *operator new[](unsigned long nbytes);
// void operator delete(void *p);
void operator delete(void *p);
void operator delete[](void *p);
/* Ref: http://sourcery.mentor.com/public/cxx-abi/abi.html */
......
......@@ -666,6 +666,10 @@ dir_flush(struct inode *dp)
off += sizeof(de);
return false;
});
if (dp->size != off) {
dp->size = off;
iupdate(dp);
}
}
// Look for a directory entry in a directory.
......
......@@ -183,7 +183,8 @@ gc_begin_epoch(void)
return;
cmpxch(&myproc()->epoch, v+1, (global_epoch.load()<<8)+1);
// __sync_synchronize();
// We effectively need an mfence here, and cmpxch provides one
// by virtue of being a LOCK instuction.
}
void
......
CXXFLAGS := -Iuser $(filter-out -nostdinc++, $(CXXFLAGS)) -msse
CXXFLAGS := -Iuser $(filter-out -nostdinc++ -Istdinc, $(CXXFLAGS)) -msse
$(O)/utest: $(O)/kernel/crange.o \
$(O)/kernel/gc.o \
......@@ -6,5 +6,7 @@ $(O)/utest: $(O)/kernel/crange.o \
$(O)/user/umain.o
@echo " LD $@"
$(Q)mkdir -p $(@D)
$(Q)$(CXX) -o $@ $^ -lpthread -lrt
$(Q)$(CXX) -o $@ $^ -ljemalloc -lpthread -lrt
.PRECIOUS: $(O)/user/%.o
-include $(O)/user/*.d
......@@ -7,7 +7,7 @@
#include "crange.hh"
#include "atomic_util.hh"
#include "ns.hh"
#include "scopedperf.hh"
#include "uscopedperf.hh"
#include "intelctr.hh"
#include "arc4.hh"
#include "amd64.h"
......@@ -60,7 +60,7 @@ proc_start(void *arg)
return 0;
}
void
static void
makeproc(proc *p)
{
pthread_t tid;
......@@ -87,8 +87,9 @@ struct my_range : public range {
static pthread_barrier_t worker_b, populate_b;
enum { iter_total = 1000000 };
enum { iter_total = 10000000 };
enum { crange_items = 1024 };
enum { random_keys = 0 };
static void
worker(void *arg)
......@@ -97,7 +98,8 @@ worker(void *arg)
for (u32 i = 0; i < iter_total / ncpu; i++) {
ANON_REGION("worker op", &perfgroup);
u64 k = 1 + rnd<u32>() % (crange_items * 2);
u64 rval = random_keys ? rnd<u32>() : myproc()->cpuid;
u64 k = 1 + rval % (crange_items * 2);
auto span = cr->search_lock(k, 1);
if (rnd<u8>() & 1) {
ANON_REGION("worker del", &perfgroup);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论