Problems with hypercalls

Peter Teoh htmldeveloper at gmail.com
Wed Jun 8 21:46:12 EDT 2011


perhaps this example will provide u with more info:

http://a380.informatik.uni-bremen.de/lxr/source/arch/x86/lguest/boot.c

I think the correct step is to disable IRQ instead - before every call
to kvm_hypercallX().   The reason is given in the remark:

110         /*
111          * Disable interrupts if not already disabled: we don't want an
112          * interrupt handler making a hypercall while we're already doing
113          * one!
114          */

On Wed, Jun 8, 2011 at 10:54 PM, emilie lefebvre <tricheurs at hotmail.fr> wrote:
>
> This is my function :
>
> static spinlock_t xgr_learn_lock = SPIN_LOCK_UNLOCKED;
> static int piga_seq_cpt = 1;
>
> /*
> * Function called for each systemcall (Hook SELinux avc function)
> */
> int piga_control(u32 ssid, ...., struct av_decision * avd) {
>
> /*
> * Here my hypercall work but block my vm with this error :
> *                " BUG: scheduling while atomic ... "
> */
>
> spin_lock_bh(&xgr_learn_lock);
>   if ( in_atomic())
>            kvm_hypercall2 ( 6, (unsigned long)2 ,(unsigned
> long)piga_seq_cpt);
>   spin_unlock_bh(&xgr_learn_lock);
>
>  if (piga_on == 1) {
> /*
> * Here my hypercall make a kernel panic with this error:
> *             " divide error: 0000 [#1] SMP"
> */
>                 spin_lock_bh(&xgr_learn_lock);
>                 set_current_state(TASK_UNINTERRUPTIBLE);
>                 kvm_hypercall2 ( 6, (unsigned long)2 ,(unsigned
> long)piga_seq_cpt);
>                 set_current_state(TASK_RUNNING);
>                 spin_lock_bh(&xgr_learn_lock);
> }
> }
>
>

I think u generally set TASK_UNINTERRUPTIBLE whenever about to modify
the scheduling task list (eg, wait queue manipulation) or about to
call "schedule()" (ie, doing your own scheduling).   The function
set_current_state() literally just set the variable value only, it
does not disable interrupt.

-- 
Regards,
Peter Teoh



More information about the Kernelnewbies mailing list