]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/misc/vmw_balloon.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / misc / vmw_balloon.c
index 2a1e804a71aa2466199119f2206133fdb409d932..6df5a55da110170ec9a5f0cbada06834fa1dc046 100644 (file)
@@ -45,7 +45,7 @@
 
 MODULE_AUTHOR("VMware, Inc.");
 MODULE_DESCRIPTION("VMware Memory Control (Balloon) Driver");
-MODULE_VERSION("1.2.1.1-k");
+MODULE_VERSION("1.2.1.2-k");
 MODULE_ALIAS("dmi:*:svnVMware*:*");
 MODULE_ALIAS("vmware_vmmemctl");
 MODULE_LICENSE("GPL");
@@ -315,7 +315,8 @@ static bool vmballoon_send_get_target(struct vmballoon *b, u32 *new_target)
  * fear that guest will need it. Host may reject some pages, we need to
  * check the return value and maybe submit a different page.
  */
-static bool vmballoon_send_lock_page(struct vmballoon *b, unsigned long pfn)
+static bool vmballoon_send_lock_page(struct vmballoon *b, unsigned long pfn,
+                                    unsigned int *hv_status)
 {
        unsigned long status, dummy;
        u32 pfn32;
@@ -326,7 +327,7 @@ static bool vmballoon_send_lock_page(struct vmballoon *b, unsigned long pfn)
 
        STATS_INC(b->stats.lock);
 
-       status = VMWARE_BALLOON_CMD(LOCK, pfn, dummy);
+       *hv_status = status = VMWARE_BALLOON_CMD(LOCK, pfn, dummy);
        if (vmballoon_check_status(b, status))
                return true;
 
@@ -410,6 +411,7 @@ static int vmballoon_reserve_page(struct vmballoon *b, bool can_sleep)
 {
        struct page *page;
        gfp_t flags;
+       unsigned int hv_status;
        bool locked = false;
 
        do {
@@ -429,11 +431,12 @@ static int vmballoon_reserve_page(struct vmballoon *b, bool can_sleep)
                }
 
                /* inform monitor */
-               locked = vmballoon_send_lock_page(b, page_to_pfn(page));
+               locked = vmballoon_send_lock_page(b, page_to_pfn(page), &hv_status);
                if (!locked) {
                        STATS_INC(b->stats.refused_alloc);
 
-                       if (b->reset_required) {
+                       if (hv_status == VMW_BALLOON_ERROR_RESET ||
+                           hv_status == VMW_BALLOON_ERROR_PPN_NOTNEEDED) {
                                __free_page(page);
                                return -EIO;
                        }
@@ -782,7 +785,7 @@ static int __init vmballoon_init(void)
        if (x86_hyper != &x86_hyper_vmware)
                return -ENODEV;
 
-       vmballoon_wq = create_freezeable_workqueue("vmmemctl");
+       vmballoon_wq = create_freezable_workqueue("vmmemctl");
        if (!vmballoon_wq) {
                pr_err("failed to create workqueue\n");
                return -ENOMEM;