Make rump vnode interface lightweight: the only things we
really need are: 0) provide VOP_OP in the alternate RUMP_VOP_OP namespace and for each op: 1) schedule rump cpu 2) call VOP_OP 3) unschedule rump cpu While here, take the opportunity to get rid of _t lossage in the rump-exported interfaces.
This commit is contained in:
parent
735701ff27
commit
fcde1e9ca0
@ -29,7 +29,7 @@ copyright="\
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
"
|
||||
SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.55 2010/04/14 12:19:50 pooka Exp $'
|
||||
SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.56 2010/04/14 13:58:51 pooka Exp $'
|
||||
|
||||
# Script to produce VFS front-end sugar.
|
||||
#
|
||||
@ -96,7 +96,7 @@ awk_parser='
|
||||
/^#/ { next; }
|
||||
# First line of description
|
||||
/^vop_/ {
|
||||
name=rump $1;
|
||||
name=$1;
|
||||
argc=0;
|
||||
willmake=-1;
|
||||
next;
|
||||
@ -143,11 +143,13 @@ awk_parser='
|
||||
# nuke the types from the kernel, but that is a battle for
|
||||
# another day.
|
||||
at = $i;
|
||||
if (length(rump) != 0) {
|
||||
if (rump) {
|
||||
if (at == "vm_prot_t")
|
||||
at = "int";
|
||||
if (at == "voff_t")
|
||||
at = "off_t";
|
||||
if (at == "kauth_cred_t")
|
||||
at = "struct kauth_cred *"
|
||||
}
|
||||
argtype[argc] = at;
|
||||
i++;
|
||||
@ -205,23 +207,27 @@ if [ ${lockdebug} -ne 0 ] ; then
|
||||
echo '#include "opt_vnode_lockdebug.h"'
|
||||
echo '#endif /* _KERNEL_OPT */'
|
||||
fi
|
||||
echo "
|
||||
extern const struct vnodeop_desc ${rump}vop_default_desc;
|
||||
"
|
||||
[ -z "${rump}" ] && echo "
|
||||
extern const struct vnodeop_desc ${rump}vop_default_desc;"
|
||||
echo
|
||||
|
||||
# Body stuff
|
||||
# This awk program needs toupper() so define it if necessary.
|
||||
sed -e "$sed_prep" $src | $awk -v rump=${rump} "$toupper"'
|
||||
function doit() {
|
||||
name = rump name
|
||||
# Declare arg struct, descriptor.
|
||||
printf("\n#define %s_DESCOFFSET %d\n", toupper(name), vop_offset++);
|
||||
printf("struct %s_args {\n", name);
|
||||
printf("\tconst struct vnodeop_desc * a_desc;\n");
|
||||
for (i=0; i<argc; i++) {
|
||||
printf("\t%s a_%s;\n", argtype[i], argname[i]);
|
||||
if (!rump) {
|
||||
printf("\n#define %s_DESCOFFSET %d\n",
|
||||
toupper(name), vop_offset++);
|
||||
printf("struct %s_args {\n", name);
|
||||
printf("\tconst struct vnodeop_desc * a_desc;\n");
|
||||
for (i=0; i<argc; i++) {
|
||||
printf("\t%s a_%s;\n", argtype[i], argname[i]);
|
||||
}
|
||||
printf("};\n");
|
||||
printf("extern const struct vnodeop_desc %s_desc;\n", name);
|
||||
}
|
||||
printf("};\n");
|
||||
printf("extern const struct vnodeop_desc %s_desc;\n", name);
|
||||
# Prototype it.
|
||||
protoarg = sprintf("int %s(", toupper(name));
|
||||
protolen = length(protoarg);
|
||||
@ -244,20 +250,30 @@ BEGIN {
|
||||
arg0special="";
|
||||
vop_offset = 1; # start at 1, to count the 'default' op
|
||||
|
||||
printf("/* Special cases: */\n\nstruct buf;\n");
|
||||
printf("#ifndef _KERNEL\n#include <stdbool.h>\n#endif\n");
|
||||
printf("struct buf;\n");
|
||||
if (rump) {
|
||||
printf("struct flock;\n");
|
||||
printf("struct knote;\n");
|
||||
printf("struct vm_page;\n");
|
||||
}
|
||||
printf("\n#ifndef _KERNEL\n#include <stdbool.h>\n#endif\n");
|
||||
printf("\n/* Special cases: */\n");
|
||||
|
||||
argc=1;
|
||||
argtype[0]="struct buf *";
|
||||
argname[0]="bp";
|
||||
lockstate[0] = -1;
|
||||
arg0special="->b_vp";
|
||||
name=rump "vop_bwrite";
|
||||
name="vop_bwrite";
|
||||
doit();
|
||||
printf("\n/* End of special cases */\n");
|
||||
if (rump)
|
||||
printf("\n");
|
||||
}
|
||||
END {
|
||||
printf("\n#define VNODE_OPS_COUNT\t%d\n", vop_offset);
|
||||
if (!rump) {
|
||||
printf("\n#define VNODE_OPS_COUNT\t%d\n", vop_offset);
|
||||
}
|
||||
}
|
||||
'"$awk_parser" | sed -e "$anal_retentive"
|
||||
|
||||
@ -295,8 +311,9 @@ echo '
|
||||
[ ! -z "${rump}" ] && echo '#include <rump/rumpvnode_if.h>' \
|
||||
&& echo '#include "rump_private.h"'
|
||||
|
||||
echo "
|
||||
const struct vnodeop_desc ${rump}vop_default_desc = {"
|
||||
if [ -z "${rump}" ] ; then
|
||||
echo "
|
||||
const struct vnodeop_desc vop_default_desc = {"
|
||||
echo ' 0,
|
||||
"default",
|
||||
0,
|
||||
@ -306,6 +323,7 @@ echo ' 0,
|
||||
VDESC_NO_OFFSET,
|
||||
};
|
||||
'
|
||||
fi
|
||||
|
||||
# Body stuff
|
||||
sed -e "$sed_prep" $src | $awk -v rump=${rump} -v lockdebug=${lockdebug} '
|
||||
@ -321,9 +339,9 @@ function do_offset(typematch) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
function doit() {
|
||||
function offsets() {
|
||||
# Define offsets array
|
||||
printf("\nconst int %s_vp_offsets[] = {\n", name);
|
||||
printf("const int %s_vp_offsets[] = {\n", name);
|
||||
for (i=0; i<argc; i++) {
|
||||
if (argtype[i] == "struct vnode *") {
|
||||
printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n",
|
||||
@ -368,14 +386,22 @@ function doit() {
|
||||
# componentname
|
||||
do_offset("struct componentname *");
|
||||
printf ("};\n");
|
||||
}
|
||||
|
||||
# Define function.
|
||||
printf("int\n%s(", toupper(name));
|
||||
function bodyrump() {
|
||||
printf("{\n\tint error;\n\n");
|
||||
printf("\trump_schedule();\n");
|
||||
printf("\terror = %s(", toupper(name));
|
||||
for (i=0; i<argc; i++) {
|
||||
printf("%s %s", argtype[i], argname[i]);
|
||||
if (i < (argc-1)) printf(",\n ");
|
||||
printf("%s", argname[i]);
|
||||
if (i < (argc-1)) printf(", ");
|
||||
}
|
||||
printf(")\n");
|
||||
printf(");\n");
|
||||
printf("\trump_unschedule();\n\n");
|
||||
printf("\treturn error;\n}\n");
|
||||
}
|
||||
|
||||
function bodynorm() {
|
||||
printf("{\n\tint error;\n\tbool mpsafe;\n\tstruct %s_args a;\n", name);
|
||||
if (lockdebug) {
|
||||
printf("#ifdef VNODE_LOCKDEBUG\n");
|
||||
@ -399,14 +425,10 @@ function doit() {
|
||||
}
|
||||
}
|
||||
printf("\tmpsafe = (%s%s->v_vflag & VV_MPSAFE);\n", argname[0], arg0special);
|
||||
if (rump)
|
||||
printf("\trump_schedule();\n");
|
||||
printf("\tif (!mpsafe) { KERNEL_LOCK(1, curlwp); }\n");
|
||||
printf("\terror = (VCALL(%s%s, VOFFSET(%s), &a));\n",
|
||||
argname[0], arg0special, name);
|
||||
printf("\tif (!mpsafe) { KERNEL_UNLOCK_ONE(curlwp); }\n");
|
||||
if (rump)
|
||||
printf("\trump_unschedule();\n");
|
||||
if (willmake != -1) {
|
||||
printf("#ifdef DIAGNOSTIC\n");
|
||||
printf("\tif (error == 0)\n" \
|
||||
@ -417,6 +439,30 @@ function doit() {
|
||||
}
|
||||
printf("\treturn error;\n}\n");
|
||||
}
|
||||
|
||||
function doit() {
|
||||
printf("\n");
|
||||
if (!rump)
|
||||
offsets();
|
||||
|
||||
if (rump)
|
||||
extname = "RUMP_" toupper(name);
|
||||
else
|
||||
extname = toupper(name);
|
||||
|
||||
# Define function.
|
||||
printf("int\n%s(", extname);
|
||||
for (i=0; i<argc; i++) {
|
||||
printf("%s %s", argtype[i], argname[i]);
|
||||
if (i < (argc-1)) printf(",\n ");
|
||||
}
|
||||
printf(")\n");
|
||||
|
||||
if (rump)
|
||||
bodyrump();
|
||||
else
|
||||
bodynorm();
|
||||
}
|
||||
BEGIN {
|
||||
printf("\n/* Special cases: */\n");
|
||||
# start from 1 (vop_default is at 0)
|
||||
@ -428,7 +474,7 @@ BEGIN {
|
||||
lockstate[0] = -1;
|
||||
arg0special="->b_vp";
|
||||
willrele[0]=0;
|
||||
name=rump "vop_bwrite";
|
||||
name="vop_bwrite";
|
||||
doit();
|
||||
printf("\n/* End of special cases */\n");
|
||||
|
||||
@ -437,6 +483,7 @@ BEGIN {
|
||||
'"$awk_parser" | sed -e "$anal_retentive"
|
||||
|
||||
# End stuff
|
||||
[ -n "${rump}" ] && return
|
||||
|
||||
# Add the vfs_op_descs array to the C file.
|
||||
# Begin stuff
|
||||
|
Loading…
Reference in New Issue
Block a user