return -ENOENT;
 }
 
+
+static struct acpi_table_header *acpi_get_pptt(void)
+{
+       static struct acpi_table_header *pptt;
+       acpi_status status;
+
+       /*
+        * PPTT will be used at runtime on every CPU hotplug in path, so we
+        * don't need to call acpi_put_table() to release the table mapping.
+        */
+       if (!pptt) {
+               status = acpi_get_table(ACPI_SIG_PPTT, 0, &pptt);
+               if (ACPI_FAILURE(status))
+                       acpi_pptt_warn_missing();
+       }
+
+       return pptt;
+}
+
 static int find_acpi_cpu_topology_tag(unsigned int cpu, int level, int flag)
 {
        struct acpi_table_header *table;
-       acpi_status status;
        int retval;
 
-       status = acpi_get_table(ACPI_SIG_PPTT, 0, &table);
-       if (ACPI_FAILURE(status)) {
-               acpi_pptt_warn_missing();
+       table = acpi_get_pptt();
+       if (!table)
                return -ENOENT;
-       }
+
        retval = topology_get_acpi_cpu_tag(table, cpu, level, flag);
        pr_debug("Topology Setup ACPI CPU %d, level %d ret = %d\n",
                 cpu, level, retval);
-       acpi_put_table(table);
 
        return retval;
 }
 static int check_acpi_cpu_flag(unsigned int cpu, int rev, u32 flag)
 {
        struct acpi_table_header *table;
-       acpi_status status;
        u32 acpi_cpu_id = get_acpi_id_for_cpu(cpu);
        struct acpi_pptt_processor *cpu_node = NULL;
        int ret = -ENOENT;
 
-       status = acpi_get_table(ACPI_SIG_PPTT, 0, &table);
-       if (ACPI_FAILURE(status)) {
-               acpi_pptt_warn_missing();
-               return ret;
-       }
+       table = acpi_get_pptt();
+       if (!table)
+               return -ENOENT;
 
        if (table->revision >= rev)
                cpu_node = acpi_find_processor_node(table, acpi_cpu_id);
        if (cpu_node)
                ret = (cpu_node->flags & flag) != 0;
 
-       acpi_put_table(table);
-
        return ret;
 }
 
        u32 acpi_cpu_id;
        struct acpi_table_header *table;
        int number_of_levels = 0;
-       acpi_status status;
+
+       table = acpi_get_pptt();
+       if (!table)
+               return -ENOENT;
 
        pr_debug("Cache Setup find last level CPU=%d\n", cpu);
 
        acpi_cpu_id = get_acpi_id_for_cpu(cpu);
-       status = acpi_get_table(ACPI_SIG_PPTT, 0, &table);
-       if (ACPI_FAILURE(status)) {
-               acpi_pptt_warn_missing();
-       } else {
-               number_of_levels = acpi_find_cache_levels(table, acpi_cpu_id);
-               acpi_put_table(table);
-       }
+       number_of_levels = acpi_find_cache_levels(table, acpi_cpu_id);
        pr_debug("Cache Setup find last level level=%d\n", number_of_levels);
 
        return number_of_levels;
 int cache_setup_acpi(unsigned int cpu)
 {
        struct acpi_table_header *table;
-       acpi_status status;
-
-       pr_debug("Cache Setup ACPI CPU %d\n", cpu);
 
-       status = acpi_get_table(ACPI_SIG_PPTT, 0, &table);
-       if (ACPI_FAILURE(status)) {
-               acpi_pptt_warn_missing();
+       table = acpi_get_pptt();
+       if (!table)
                return -ENOENT;
-       }
+
+       pr_debug("Cache Setup ACPI CPU %d\n", cpu);
 
        cache_setup_acpi_cpu(table, cpu);
-       acpi_put_table(table);
 
-       return status;
+       return 0;
 }
 
 /**
 int find_acpi_cpu_topology_cluster(unsigned int cpu)
 {
        struct acpi_table_header *table;
-       acpi_status status;
        struct acpi_pptt_processor *cpu_node, *cluster_node;
        u32 acpi_cpu_id;
        int retval;
        int is_thread;
 
-       status = acpi_get_table(ACPI_SIG_PPTT, 0, &table);
-       if (ACPI_FAILURE(status)) {
-               acpi_pptt_warn_missing();
+       table = acpi_get_pptt();
+       if (!table)
                return -ENOENT;
-       }
 
        acpi_cpu_id = get_acpi_id_for_cpu(cpu);
        cpu_node = acpi_find_processor_node(table, acpi_cpu_id);
-       if (cpu_node == NULL || !cpu_node->parent) {
-               retval = -ENOENT;
-               goto put_table;
-       }
+       if (!cpu_node || !cpu_node->parent)
+               return -ENOENT;
 
        is_thread = cpu_node->flags & ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD;
        cluster_node = fetch_pptt_node(table, cpu_node->parent);
-       if (cluster_node == NULL) {
-               retval = -ENOENT;
-               goto put_table;
-       }
+       if (!cluster_node)
+               return -ENOENT;
+
        if (is_thread) {
-               if (!cluster_node->parent) {
-                       retval = -ENOENT;
-                       goto put_table;
-               }
+               if (!cluster_node->parent)
+                       return -ENOENT;
+
                cluster_node = fetch_pptt_node(table, cluster_node->parent);
-               if (cluster_node == NULL) {
-                       retval = -ENOENT;
-                       goto put_table;
-               }
+               if (!cluster_node)
+                       return -ENOENT;
        }
        if (cluster_node->flags & ACPI_PPTT_ACPI_PROCESSOR_ID_VALID)
                retval = cluster_node->acpi_processor_id;
        else
                retval = ACPI_PTR_DIFF(cluster_node, table);
 
-put_table:
-       acpi_put_table(table);
-
        return retval;
 }