[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [Xen-devel] [PATCH] tmem: fix 32-on-64 support
Looks good Jan. Thanks again. Do you want me to re-submit the Linux-side patch with the necessary changes or are you working on that too? Thanks, Dan > -----Original Message----- > From: Jan Beulich [mailto:JBeulich@xxxxxxxxxx] > Sent: Tuesday, June 16, 2009 8:59 AM > To: xen-devel@xxxxxxxxxxxxxxxxxxx > Cc: Dan Magenheimer > Subject: [Xen-devel] [PATCH] tmem: fix 32-on-64 support > > > This implicitly required coverting the tmem_op structure from > anonymous > to standard struct/union sub-fields, and extending the get-fields.sh > helper script to deal with typedef-ed guest handles used as types of > translated compound type fields. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> > > --- 2009-06-10.orig/tools/libxc/xc_tmem.c 2009-05-27 > 13:54:05.000000000 +0200 > +++ 2009-06-10/tools/libxc/xc_tmem.c 2009-06-16 > 16:39:08.000000000 +0200 > @@ -43,11 +43,11 @@ int xc_tmem_control(int xc, > > op.cmd = TMEM_CONTROL; > op.pool_id = pool_id; > - op.subop = subop; > - op.cli_id = cli_id; > - op.arg1 = arg1; > - op.arg2 = arg2; > - op.buf.p = buf; > + op.u.ctrl.subop = subop; > + op.u.ctrl.cli_id = cli_id; > + op.u.ctrl.arg1 = arg1; > + op.u.ctrl.arg2 = arg2; > + op.u.ctrl.buf.p = buf; > > if (subop == TMEMC_LIST) { > if ((arg1 != 0) && (lock_pages(buf, arg1) != 0)) > --- 2009-06-10.orig/xen/common/tmem.c 2009-06-16 > 16:38:02.000000000 +0200 > +++ 2009-06-10/xen/common/tmem.c 2009-06-16 > 11:34:21.000000000 +0200 > @@ -1842,7 +1842,8 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop > { > tmem_write_lock(&tmem_rwlock); > tmem_write_lock_set = 1; > - rc = do_tmem_control(op.subop, op.cli_id, op.arg1, > op.arg2, op.buf); > + rc = do_tmem_control(op.u.ctrl.subop, op.u.ctrl.cli_id, > + op.u.ctrl.arg1, op.u.ctrl.arg2, > op.u.ctrl.buf); > goto out; > } > > @@ -1887,27 +1888,31 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop > switch ( op.cmd ) > { > case TMEM_NEW_POOL: > - rc = do_tmem_new_pool(op.flags,op.uuid[0],op.uuid[1]); > + rc = do_tmem_new_pool(op.u.new.flags, > + op.u.new.uuid[0], op.u.new.uuid[1]); > break; > case TMEM_NEW_PAGE: > - rc = do_tmem_put(pool, op.object, op.index, op.cmfn, > 0, 0, 0); > + rc = do_tmem_put(pool, op.u.gen.object, > op.u.gen.index, op.u.gen.cmfn, > + 0, 0, 0); > break; > case TMEM_PUT_PAGE: > - rc = do_tmem_put(pool, op.object, op.index, op.cmfn, > 0, 0, PAGE_SIZE); > + rc = do_tmem_put(pool, op.u.gen.object, > op.u.gen.index, op.u.gen.cmfn, > + 0, 0, PAGE_SIZE); > if (rc == 1) succ_put = 1; > else non_succ_put = 1; > break; > case TMEM_GET_PAGE: > - rc = do_tmem_get(pool, op.object, op.index, op.cmfn, > 0, 0, PAGE_SIZE); > + rc = do_tmem_get(pool, op.u.gen.object, > op.u.gen.index, op.u.gen.cmfn, > + 0, 0, PAGE_SIZE); > if (rc == 1) succ_get = 1; > else non_succ_get = 1; > break; > case TMEM_FLUSH_PAGE: > flush = 1; > - rc = do_tmem_flush_page(pool, op.object, op.index); > + rc = do_tmem_flush_page(pool, op.u.gen.object, > op.u.gen.index); > break; > case TMEM_FLUSH_OBJECT: > - rc = do_tmem_flush_object(pool, op.object); > + rc = do_tmem_flush_object(pool, op.u.gen.object); > flush_obj = 1; > break; > case TMEM_DESTROY_POOL: > @@ -1915,12 +1920,14 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop > rc = do_tmem_destroy_pool(op.pool_id); > break; > case TMEM_READ: > - rc = do_tmem_get(pool, op.object, op.index, op.cmfn, > - op.tmem_offset, op.pfn_offset, op.len); > + rc = do_tmem_get(pool, op.u.gen.object, > op.u.gen.index, op.u.gen.cmfn, > + op.u.gen.tmem_offset, op.u.gen.pfn_offset, > + op.u.gen.len); > break; > case TMEM_WRITE: > - rc = do_tmem_put(pool, op.object, op.index, op.cmfn, > - op.tmem_offset, op.pfn_offset, op.len); > + rc = do_tmem_put(pool, op.u.gen.object, > op.u.gen.index, op.u.gen.cmfn, > + op.u.gen.tmem_offset, op.u.gen.pfn_offset, > + op.u.gen.len); > break; > case TMEM_XCHG: > /* need to hold global lock to ensure xchg is atomic */ > --- 2009-06-10.orig/xen/include/xen/tmem_xen.h > 2009-06-15 15:11:54.000000000 +0200 > +++ 2009-06-10/xen/include/xen/tmem_xen.h 2009-06-16 > 15:09:40.000000000 +0200 > @@ -16,6 +16,9 @@ > #include <xen/guest_access.h> /* copy_from_guest */ > #include <xen/hash.h> /* hash_long */ > #include <public/tmem.h> > +#ifdef CONFIG_COMPAT > +#include <compat/tmem.h> > +#endif > > struct tmem_host_dependent_client { > struct domain *domain; > @@ -286,6 +289,29 @@ typedef XEN_GUEST_HANDLE(tmem_op_t) tmem > > static inline int tmh_get_tmemop_from_client(tmem_op_t *op, > tmem_cli_op_t uops) > { > +#ifdef CONFIG_COMPAT > + if ( is_pv_32on64_vcpu(current) ) > + { > + int rc; > + enum XLAT_tmem_op_u u; > + tmem_op_compat_t cop; > + > + rc = copy_from_guest(&cop, guest_handle_cast(uops, void), 1); > + if ( rc ) > + return rc; > + switch ( cop.cmd ) > + { > + case TMEM_NEW_POOL: u = XLAT_tmem_op_u_new; break; > + case TMEM_CONTROL: u = XLAT_tmem_op_u_ctrl; break; > + default: u = XLAT_tmem_op_u_gen; break; > + } > +#define XLAT_tmem_op_HNDL_u_ctrl_buf(_d_, _s_) \ > + guest_from_compat_handle((_d_)->u.ctrl.buf, > (_s_)->u.ctrl.buf) > + XLAT_tmem_op(op, &cop); > +#undef XLAT_tmem_op_HNDL_u_ctrl_buf > + return 0; > + } > +#endif > return copy_from_guest(op, uops, 1); > } > > --- 2009-06-10.orig/xen/include/xlat.lst 2009-06-16 > 16:38:02.000000000 +0200 > +++ 2009-06-10/xen/include/xlat.lst 2009-06-15 > 15:14:25.000000000 +0200 > @@ -57,6 +57,7 @@ > ! sched_poll sched.h > ? sched_remote_shutdown sched.h > ? sched_shutdown sched.h > +! tmem_op tmem.h > ? t_buf trace.h > ? vcpu_get_physid vcpu.h > ? vcpu_register_vcpu_info vcpu.h > @@ -74,6 +75,3 @@ > ? processor_px platform.h > ! psd_package platform.h > ! processor_performance platform.h > -# ? tmem_op_t tmem.h > -# ? tmem_cli_mfn_t tmem.h > -# ? tmem_cli_va_t tmem.h > --- 2009-06-10.orig/xen/include/public/tmem.h 2009-06-15 > 14:58:25.000000000 +0200 > +++ 2009-06-10/xen/include/public/tmem.h 2009-06-16 > 11:30:05.000000000 +0200 > @@ -75,14 +75,14 @@ struct tmem_op { > struct { /* for cmd == TMEM_NEW_POOL */ > uint64_t uuid[2]; > uint32_t flags; > - }; > + } new; > struct { /* for cmd == TMEM_CONTROL */ > uint32_t subop; > uint32_t cli_id; > uint32_t arg1; > uint32_t arg2; > tmem_cli_va_t buf; > - }; > + } ctrl; > struct { > uint64_t object; > uint32_t index; > @@ -90,8 +90,8 @@ struct tmem_op { > uint32_t pfn_offset; > uint32_t len; > tmem_cli_mfn_t cmfn; /* client machine page frame */ > - }; > - }; > + } gen; > + } u; > }; > typedef struct tmem_op tmem_op_t; > DEFINE_XEN_GUEST_HANDLE(tmem_op_t); > --- 2009-06-10.orig/xen/tools/get-fields.sh 2009-06-16 > 16:38:02.000000000 +0200 > +++ 2009-06-10/xen/tools/get-fields.sh 2009-06-16 > 15:08:22.000000000 +0200 > @@ -34,6 +34,34 @@ get_fields () > done > } > > +get_typedefs () > +{ > + local level=1 state= > + for token in $1 > + do > + case "$token" in > + typedef) > + test $level != 1 || state=1 > + ;; > + COMPAT_HANDLE\(*\)) > + test $level != 1 -o "$state" != 1 || state=2 > + ;; > + [\{\[]) > + level=$(expr $level + 1) > + ;; > + [\}\]]) > + level=$(expr $level - 1) > + ;; > + ";") > + test $level != 1 || state= > + ;; > + [a-zA-Z_]*) > + test $level != 1 -o "$state" != 2 || > echo "$token" > + ;; > + esac > + done > +} > + > build_enums () > { > local level=1 kind= fields= members= named= id= token > @@ -166,7 +194,21 @@ for line in sys.stdin.readlines(): > fi > ;; > [a-zA-Z]*) > - id=$token > + if [ -z "$id" -a -z "$type" -a > -z "$array_type" ] > + then > + for id in $typedefs > + do > + test $id != > "$token" || type=$id > + done > + if [ -z "$type" ] > + then > + id=$token > + else > + id= > + fi > + else > + id=$token > + fi > ;; > [\,\;]) > if [ $level = 2 -a -n "$(echo > $id | $SED 's,^_pad[[:digit:]]*,,')" ] > @@ -281,6 +323,18 @@ build_body () > if [ -n "$array" ] > then > array="$array $token" > + elif [ -z "$id" -a -z "$type" -a -z > "$array_type" ] > + then > + for id in $typedefs > + do > + test $id != "$token" || type=$id > + done > + if [ -z "$type" ] > + then > + id=$token > + else > + id= > + fi > else > id=$token > fi > @@ -419,7 +473,8 @@ build_check () > echo "" > } > > -fields="$(get_fields $(echo $2 | $SED > 's,^compat_xen,compat_,') "$($SED -e 's,^[[:space:]]#.*,,' -e > 's!\([]\[,;:{}]\)! \1 !g' $3)")" > +list="$($SED -e 's,^[[:space:]]#.*,,' -e 's!\([]\[,;:{}]\)! > \1 !g' $3)" > +fields="$(get_fields $(echo $2 | $SED > 's,^compat_xen,compat_,') "$list")" > if [ -z "$fields" ] > then > echo "Fields of '$2' not found in '$3'" >&2 > @@ -429,6 +484,7 @@ name=${2#compat_} > name=${name#xen} > case "$1" in > "!") > + typedefs="$(get_typedefs "$list")" > build_enums $name "$fields" > build_body $name "$fields" > ;; > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |