ia64/xen-unstable

changeset 3243:204dcd674164

bitkeeper revision 1.1159.183.44 (41af4afduhCx6q1-uq_lDpK2CMiJ-Q)

Merge scramble.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-2.0-testing.bk
into scramble.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-unstable.bk
author kaf24@scramble.cl.cam.ac.uk
date Thu Dec 02 17:03:57 2004 +0000 (2004-12-02)
parents 551306ae7cd0 199e9c5ef609
children fc7b350be00f
files linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c
line diff
     1.1 --- a/linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c	Thu Dec 02 16:46:54 2004 +0000
     1.2 +++ b/linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c	Thu Dec 02 17:03:57 2004 +0000
     1.3 @@ -161,6 +161,12 @@ static unsigned long current_target(void
     1.4      return target;
     1.5  }
     1.6  
     1.7 +/*
     1.8 + * We avoid multiple worker processes conflicting via the balloon mutex.
     1.9 + * We may of course race updates of the target counts (which are protected
    1.10 + * by the balloon lock), or with changes to the Xen hard limit, but we will
    1.11 + * recover from these in time.
    1.12 + */
    1.13  static void balloon_process(void *unused)
    1.14  {
    1.15      unsigned long *mfn_list, pfn, i, flags;
    1.16 @@ -283,9 +289,10 @@ static void balloon_process(void *unused
    1.17  /* Resets the Xen limit, sets new target, and kicks off processing. */
    1.18  static void set_new_target(unsigned long target)
    1.19  {
    1.20 +    /* No need for lock. Not read-modify-write updates. */
    1.21      hard_limit   = ~0UL;
    1.22      target_pages = target;
    1.23 -    balloon_process(NULL);
    1.24 +    schedule_work(&balloon_worker);
    1.25  }
    1.26  
    1.27  static void balloon_ctrlif_rx(ctrl_msg_t *msg, unsigned long id)
    1.28 @@ -426,8 +433,7 @@ static int __init balloon_init(void)
    1.29  
    1.30      balloon_pde->proc_fops = &balloon_fops;
    1.31  
    1.32 -    (void)ctrl_if_register_receiver(CMSG_MEM_REQUEST, balloon_ctrlif_rx,
    1.33 -                                    CALLBACK_IN_BLOCKING_CONTEXT);
    1.34 +    (void)ctrl_if_register_receiver(CMSG_MEM_REQUEST, balloon_ctrlif_rx, 0);
    1.35  
    1.36      /* Initialise the balloon with excess memory space. */
    1.37      for ( pfn = xen_start_info.nr_pages; pfn < max_pfn; pfn++ )
    1.38 @@ -446,7 +452,7 @@ void balloon_update_driver_allowance(lon
    1.39  {
    1.40      unsigned long flags;
    1.41      balloon_lock(flags);
    1.42 -    driver_pages += delta;
    1.43 +    driver_pages += delta; /* non-atomic update */
    1.44      balloon_unlock(flags);
    1.45  }
    1.46  
    1.47 @@ -458,7 +464,7 @@ void balloon_put_pages(unsigned long *mf
    1.48      if ( HYPERVISOR_dom_mem_op(MEMOP_decrease_reservation, 
    1.49                                 mfn_list, nr_mfns, 0) != nr_mfns )
    1.50          BUG();
    1.51 -    current_pages -= nr_mfns;
    1.52 +    current_pages -= nr_mfns; /* non-atomic update */
    1.53      balloon_unlock(flags);
    1.54  
    1.55      schedule_work(&balloon_worker);