clear_fixmap(FIX_APEI_GHES_IRQ);
 }
 
-static int ghes_estatus_pool_expand(unsigned long len); //temporary
-
-int ghes_estatus_pool_init(void)
+int ghes_estatus_pool_init(int num_ghes)
 {
+       unsigned long addr, len;
+
        ghes_estatus_pool = gen_pool_create(GHES_ESTATUS_POOL_MIN_ALLOC_ORDER, -1);
        if (!ghes_estatus_pool)
                return -ENOMEM;
 
-       return ghes_estatus_pool_expand(GHES_ESTATUS_CACHE_AVG_SIZE *
-                                       GHES_ESTATUS_CACHE_ALLOCED_MAX);
-}
-
-static int ghes_estatus_pool_expand(unsigned long len)
-{
-       unsigned long size, addr;
-
-       ghes_estatus_pool_size_request += PAGE_ALIGN(len);
-       size = gen_pool_size(ghes_estatus_pool);
-       if (size >= ghes_estatus_pool_size_request)
-               return 0;
+       len = GHES_ESTATUS_CACHE_AVG_SIZE * GHES_ESTATUS_CACHE_ALLOCED_MAX;
+       len += (num_ghes * GHES_ESOURCE_PREALLOC_MAX_SIZE);
 
+       ghes_estatus_pool_size_request = PAGE_ALIGN(len);
        addr = (unsigned long)vmalloc(PAGE_ALIGN(len));
        if (!addr)
                return -ENOMEM;
        return ret;
 }
 
-static unsigned long ghes_esource_prealloc_size(
-       const struct acpi_hest_generic *generic)
-{
-       unsigned long block_length, prealloc_records, prealloc_size;
-
-       block_length = min_t(unsigned long, generic->error_block_length,
-                            GHES_ESTATUS_MAX_SIZE);
-       prealloc_records = max_t(unsigned long,
-                                generic->records_to_preallocate, 1);
-       prealloc_size = min_t(unsigned long, block_length * prealloc_records,
-                             GHES_ESOURCE_PREALLOC_MAX_SIZE);
-
-       return prealloc_size;
-}
-
-static void ghes_estatus_pool_shrink(unsigned long len)
-{
-       ghes_estatus_pool_size_request -= PAGE_ALIGN(len);
-}
-
 static void ghes_nmi_add(struct ghes *ghes)
 {
-       unsigned long len;
-
-       len = ghes_esource_prealloc_size(ghes->generic);
-       ghes_estatus_pool_expand(len);
        mutex_lock(&ghes_list_mutex);
        if (list_empty(&ghes_nmi))
                register_nmi_handler(NMI_LOCAL, ghes_notify_nmi, 0, "ghes");
 
 static void ghes_nmi_remove(struct ghes *ghes)
 {
-       unsigned long len;
-
        mutex_lock(&ghes_list_mutex);
        list_del_rcu(&ghes->list);
        if (list_empty(&ghes_nmi))
         * freed after NMI handler finishes.
         */
        synchronize_rcu();
-       len = ghes_esource_prealloc_size(ghes->generic);
-       ghes_estatus_pool_shrink(len);
 }
 
 static void ghes_nmi_init_cxt(void)