Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
cc29cea9
提交
cc29cea9
3月 05, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
wq rejigger
上级
e783ddce
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
182 行增加
和
150 行删除
+182
-150
wq.hh
include/wq.hh
+5
-46
wqkernel.hh
include/wqkernel.hh
+48
-0
wquser.hh
include/wquser.hh
+2
-0
kalloc.cc
kernel/kalloc.cc
+1
-1
wq.cc
lib/wq.cc
+36
-103
wqlinux.hh
user/wqlinux.hh
+90
-0
没有找到文件。
include/wq.hh
浏览文件 @
cc29cea9
#if defined(XV6_KERNEL)
typedef
struct
spinlock
wqlock_t
;
#elif defined(LINUX)
typedef
pthread_spinlock_t
wqlock_t
;
#else
typedef
struct
uspinlock
wqlock_t
;
#endif
#define WQSIZE 8192
class
work
;
#include "percpu.hh"
#define NSLOTS (1 << WQSHIFT)
int
wq_trywork
(
void
);
int
wq_push
(
work
*
w
);
void
initwq
(
void
);
struct
work
{
virtual
void
run
()
=
0
;
};
class
wq
{
public
:
wq
();
int
push
(
work
*
w
);
int
trywork
();
void
dump
();
static
void
*
operator
new
(
unsigned
long
);
private
:
work
*
steal
(
int
c
);
work
*
pop
(
int
c
);
struct
wqueue
{
work
*
w
[
NSLOTS
];
volatile
int
head
__mpalign__
;
volatile
int
tail
;
wqlock_t
lock
;
};
struct
stat
{
u64
push
;
u64
full
;
u64
pop
;
u64
steal
;
};
percpu
<
wqueue
>
q_
;
percpu
<
stat
>
stat_
;
};
struct
cwork
:
public
work
{
virtual
void
run
();
...
...
@@ -60,11 +24,6 @@ struct cwork : public work{
void
*
arg4
;
};
void
initwq
(
void
);
struct
work
*
allocwork
(
void
);
void
freework
(
struct
work
*
w
);
int
wq_push
(
work
*
w
);
template
<
typename
IT
,
typename
BODY
>
static
inline
void
wq_for
(
IT
&
init
,
bool
(
*
cond
)(
IT
&
it
),
BODY
body
)
...
...
include/wqkernel.hh
0 → 100644
浏览文件 @
cc29cea9
#include "types.h"
#include "kernel.hh"
#include "spinlock.h"
#include "amd64.h"
#include "cpu.hh"
#include "kalloc.hh"
#include "wq.hh"
typedef
struct
spinlock
wqlock_t
;
static
inline
void
*
allocwq
(
void
)
{
return
ksalloc
(
slab_wq
);
}
static
inline
void
wqlock_acquire
(
wqlock_t
*
lock
)
{
acquire
(
lock
);
}
static
inline
int
wqlock_tryacquire
(
wqlock_t
*
lock
)
{
return
tryacquire
(
lock
);
}
static
inline
void
wqlock_release
(
wqlock_t
*
lock
)
{
release
(
lock
);
}
static
inline
void
wqlock_init
(
wqlock_t
*
lock
)
{
initlock
(
lock
,
"wq lock"
,
LOCKSTAT_WQ
);
}
static
inline
void
wqarch_init
(
void
)
{
}
#define xprintf cprintf
#define xmalloc(n) kmalloc(n)
#define xfree(p, sz) kmfree(p, sz)
include/wquser.hh
0 → 100644
浏览文件 @
cc29cea9
// XXX(sbw)
typedef
struct
uspinlock
wqlock_t
;
kernel/kalloc.cc
浏览文件 @
cc29cea9
...
...
@@ -275,7 +275,7 @@ initkalloc(u64 mbaddr)
slabmem
[
slab_kshared
][
c
].
ninit
=
CPUKSTACKS
;
strncpy
(
slabmem
[
slab_wq
][
c
].
name
,
" wq"
,
MAXNAME
);
slabmem
[
slab_wq
][
c
].
size
=
PGROUNDUP
(
sizeof
(
wq
))
;
slabmem
[
slab_wq
][
c
].
size
=
WQSIZE
;
slabmem
[
slab_wq
][
c
].
ninit
=
NCPU
;
for
(
int
i
=
0
;
i
<
slab_type_max
;
i
++
)
{
...
...
lib/wq.cc
浏览文件 @
cc29cea9
#if defined(LINUX)
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <pthread.h>
#include "include/types.h"
#include "include/wq.hh"
static
__thread
int
myid_
;
int
mycpuid
(
void
)
{
return
myid_
;
}
static
inline
void
*
allocwq
(
void
)
{
return
malloc
(
sizeof
(
wq
));
}
static
inline
void
wqlock_acquire
(
wqlock_t
*
lock
)
{
pthread_spin_lock
(
lock
);
}
static
inline
int
wqlock_tryacquire
(
wqlock_t
*
lock
)
{
return
(
pthread_spin_trylock
(
lock
)
==
0
);
}
static
inline
void
wqlock_release
(
wqlock_t
*
lock
)
{
pthread_spin_unlock
(
lock
);
}
static
inline
void
wqlock_init
(
wqlock_t
*
lock
)
{
pthread_spin_init
(
lock
,
0
);
}
static
inline
u64
rdtsc
(
void
)
{
u32
hi
,
lo
;
__asm
volatile
(
"rdtsc"
:
"=a"
(
lo
),
"=d"
(
hi
));
return
((
u64
)
lo
)
|
(((
u64
)
hi
)
<<
32
);
}
#define xprintf printf
#define xmalloc(n) malloc(n)
#define xfree(p, sz) free(p)
#define pushcli()
#define popcli()
#include "user/wqlinux.hh"
#include "include/percpu.hh"
#elif defined(XV6_KERNEL)
#include "wqkernel.hh"
#include "percpu.hh"
#else
#warning "Unknown wq implementation"
#endif
#include "types.h"
#include "kernel.hh"
#include "spinlock.h"
#include "amd64.h"
#include "cpu.hh"
#include "kalloc.hh"
#include "wq.hh"
static
inline
int
mywqid
(
void
)
{
return
mycpu
()
->
id
;
}
static
inline
void
*
allocwq
(
void
)
{
return
ksalloc
(
slab_wq
);
}
#define NSLOTS (1 << WQSHIFT)
static
inline
void
wqlock_acquire
(
wqlock_t
*
lock
)
{
acquire
(
lock
);
}
class
wq
{
public
:
wq
();
int
push
(
work
*
w
);
int
trywork
();
void
dump
();
static
inline
int
wqlock_tryacquire
(
wqlock_t
*
lock
)
{
return
tryacquire
(
lock
);
}
static
void
*
operator
new
(
unsigned
long
);
static
inline
void
wqlock_release
(
wqlock_t
*
lock
)
{
release
(
lock
);
}
private
:
work
*
steal
(
int
c
);
work
*
pop
(
int
c
);
static
inline
void
wqlock_init
(
wqlock_t
*
lock
)
{
initlock
(
lock
,
"wq lock"
,
LOCKSTAT_WQ
);
}
struct
wqueue
{
work
*
w
[
NSLOTS
];
volatile
int
head
__mpalign__
;
volatile
int
tail
;
wqlock_t
lock
;
};
#define xprintf cprintf
#define xmalloc(n) kmalloc(n)
#define xfree(p, sz) kmfree(p, sz)
struct
stat
{
u64
push
;
u64
full
;
u64
pop
;
u64
steal
;
};
#else
#warning "Unknown wq implementation"
#endif
percpu
<
wqueue
>
q_
;
percpu
<
stat
>
stat_
;
};
static
wq
*
wq_
;
static_assert
(
sizeof
(
wq
)
<=
WQSIZE
,
"WQSIZE too small"
);
int
wq_push
(
work
*
w
)
{
...
...
@@ -135,6 +67,7 @@ void
initwq
(
void
)
{
wq_
=
new
wq
();
wqarch_init
();
}
//
...
...
user/wqlinux.hh
0 → 100644
浏览文件 @
cc29cea9
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <pthread.h>
#include "user/util.h"
#include "include/types.h"
#include "include/wq.hh"
static
__thread
int
myid_
;
typedef
pthread_spinlock_t
wqlock_t
;
int
mycpuid
(
void
)
{
return
myid_
;
}
static
inline
void
*
allocwq
(
void
)
{
return
malloc
(
WQSIZE
);
}
static
inline
void
wqlock_acquire
(
wqlock_t
*
lock
)
{
pthread_spin_lock
(
lock
);
}
static
inline
int
wqlock_tryacquire
(
wqlock_t
*
lock
)
{
return
(
pthread_spin_trylock
(
lock
)
==
0
);
}
static
inline
void
wqlock_release
(
wqlock_t
*
lock
)
{
pthread_spin_unlock
(
lock
);
}
static
inline
void
wqlock_init
(
wqlock_t
*
lock
)
{
pthread_spin_init
(
lock
,
0
);
}
static
inline
u64
rdtsc
(
void
)
{
u32
hi
,
lo
;
__asm
volatile
(
"rdtsc"
:
"=a"
(
lo
),
"=d"
(
hi
));
return
((
u64
)
lo
)
|
(((
u64
)
hi
)
<<
32
);
}
static
void
*
workerth
(
void
*
x
)
{
u64
c
=
(
u64
)
x
;
myid_
=
c
;
setaffinity
(
c
);
while
(
1
)
wq_trywork
();
return
NULL
;
}
static
inline
void
wqarch_init
(
void
)
{
pthread_t
th
;
int
r
;
myid_
=
0
;
setaffinity
(
0
);
for
(
int
i
=
1
;
i
<
NCPU
;
i
++
)
{
r
=
pthread_create
(
&
th
,
NULL
,
workerth
,
(
void
*
)(
u64
)
i
);
if
(
r
<
0
)
edie
(
"pthread_create"
);
}
}
#define xprintf printf
#define xmalloc(n) malloc(n)
#define xfree(p, sz) free(p)
#define pushcli()
#define popcli()
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论