Re: [patch] fold struct vcpu_info into CPUState

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> Index: kvm-userspace.git/qemu/qemu-kvm-vcpu.h
> ===================================================================
> --- /dev/null
> +++ kvm-userspace.git/qemu/qemu-kvm-vcpu.h
can't it be just qemu-kvm.h ?

> Index: kvm-userspace.git/qemu/qemu-kvm.c
> ===================================================================
> --- kvm-userspace.git.orig/qemu/qemu-kvm.c
> +++ kvm-userspace.git/qemu/qemu-kvm.c
> @@ -22,13 +22,13 @@
>  #include "compatfd.h"
>
> +__thread struct CPUState *current_env;
>
>  static int qemu_system_ready;
>
>  #define SIG_IPI (SIGRTMIN+4)
>

>  pthread_t io_thread;
>  static int io_thread_fd = -1;
>  static int io_thread_sigfd = -1;
> @@ -93,7 +74,20 @@
>
>  CPUState *qemu_kvm_cpu_env(int index)
>  {
> -    return vcpu_info[index].env;
> +    CPUState *penv;
> +
> +    if (current_env->cpu_index == index)
> +        return current_env;
> +
> +    penv = first_cpu;
> +
> +    while (penv) {
> +        if (penv->cpu_index == index)
> +            return penv;
> +        penv = (CPUState *)penv->next_cpu;
> +    }
> +
> +    return NULL;
>  }

This doesn't seem right. This function exists because we used to have
a vcpu and and env structs, that were separated but
should be tied together in some uses.
Now, there's absolutely nothing in here that is not qemu-specific.
This is just a function to return and env given a cpu number.
You'll lose the current_env optimization that probably matters a lot
in your case, but I'm afraid you will just have to live with that:
it sucks for qemu too, and when it is fixed, it will be fixed for both
(means getting rid of the ugly cpu_single_env)

>     if (env) {
> -        if (!vcpu)
> +        if (!current_env->vcpu_info.created)
>             signal = 1;

!vcpu is probably meant to catch the case in witch the vcpu tls
variable is not yet assigned. By dereferencing current_env here,
you are probably doing an invalid access. So unless you can prove this
is not an issue, should add another test.

> -        if (vcpu && env != vcpu->env &&
> !vcpu_info[env->cpu_index].signalled)
> +        /*
> +         * Testing for vcpu_info.created here is really redundant
> +         */
> +        if (current_env->vcpu_info.created &&
> +            env != current_env && env->vcpu_info.signalled)

should be !env->vcpu_info.signalled instead?

>  static void flush_queued_work(CPUState *env)
>  {
> -    struct vcpu_info *vi = &vcpu_info[env->cpu_index];
> +    struct vcpu_info *vi = &env->vcpu_info;
>     struct qemu_kvm_work_item *wi;

"vi" is not a good name, since emacs users will likely complain.
vcpu_info is a much better name.


The rest seems pretty straightforward.

-- 
Glauber  Costa.
"Free as in Freedom"
http://glommer.net

"The less confident you are, the more serious you have to act."
--
To unsubscribe from this list: send the line "unsubscribe kvm-ia64" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux KVM Devel]     [Linux Virtualization]     [Big List of Linux Books]     [Linux SCSI]     [Yosemite Forum]

  Powered by Linux