diff --git a/PBK/pbk_cpu.c b/PBK/pbk_cpu.c
index 5372d53893884b430cbab99e60aafa083c7a89fc..03a789eab931618b6dad773aae56c4239b335cdf 100644
--- a/PBK/pbk_cpu.c
+++ b/PBK/pbk_cpu.c
@@ -50,6 +50,8 @@ static int pbk_cpu_up(unsigned int cpu)
     ret = do_cpu_up(cpu, PBK_CPU_ONLINE_STATE);
     if (ret)
         pr_err("Failed to online CPU %u\n", cpu);
+    else
+        sched_domains_numa_masks_set(cpu);
 
     return ret;
 }
@@ -61,6 +63,8 @@ static int pbk_cpu_down(unsigned int cpu)
     ret = cpu_down(cpu, PBK_CPU_OFFLINE_STATE);
     if (ret)
         pr_err("Failed to offline CPU %u\n", cpu);
+    else
+        sched_domains_numa_masks_clear(cpu);
 
     return ret;
 }
diff --git a/PBK/pbk_domain.c b/PBK/pbk_domain.c
index 47a4fa483fe2b42b654e758bfaaef16c5f755ba7..d4f59dfd3baa3f11a92431615153497e557d6d7e 100644
--- a/PBK/pbk_domain.c
+++ b/PBK/pbk_domain.c
@@ -4,6 +4,7 @@
 #include <linux/sched/signal.h>
 #include <linux/slab.h>
 #include <linux/workqueue.h>
+#include <linux/delay.h>
 
 #include "pbk_cpu.h"
 
@@ -49,8 +50,8 @@ struct pbk_domain *pbk_find_get_domain(pdid_t domain_id)
     spin_lock(&pbk_domains_lock);
     hash_for_each_possible(pbk_domains, pd, ht_node, domain_id) {
         if (pd->domain_id == domain_id) {
-            spin_unlock(&pbk_domains_lock);
             get_pbk_domain(pd);
+            spin_unlock(&pbk_domains_lock);
             return pd;
         }
     }
@@ -60,26 +61,25 @@ struct pbk_domain *pbk_find_get_domain(pdid_t domain_id)
     return NULL;
 }
 
-struct pbk_domain *pbk_find_matched_domain(cpumask_var_t request)
+struct pbk_domain *pbk_find_get_domain_withcpu(cpumask_var_t mask)
 {
-    struct pbk_domain *pd = NULL;
-    int bkt = 0;
-
-    // char buf[80];
-    // cpumap_print_to_pagebuf(1, buf, request);
-    // pr_err("X = request = %s hash_empty = %d\n", buf, hash_empty(pbk_domains));
-
-    spin_lock(&pbk_domains_lock);
-    hash_for_each(pbk_domains, bkt, pd, ht_node) {
-        if (cpumask_equal(pbk_domain_cpu(pd), request)) {
-            spin_unlock(&pbk_domains_lock);
-            get_pbk_domain(pd);
-            return pd;
+    struct pbk_domain *pd;
+    struct hlist_node *tmp;
+    unsigned long timeout;
+    int bkt;
+
+    timeout = USEC_PER_SEC;
+    while (timeout--) {
+        hash_for_each_safe(pbk_domains, bkt, tmp, pd, ht_node) {
+            if (cpumask_equal(mask, pbk_domain_cpu(pd))) {
+                get_pbk_domain(pd);
+                return pd;
+            }
         }
-    }
-    spin_unlock(&pbk_domains_lock);
+        udelay(1);
+    };
 
-    pr_err("PBK can not find matched domain\n");
+    pr_err("invalid cpulist request %*pbl\n", cpumask_pr_args(mask));
     return NULL;
 }
 
diff --git a/PBK/pbk_sysfs.c b/PBK/pbk_sysfs.c
index d3b85686efae6d9eaafe8f6cf9692ca9b2ef6578..8c73af34c017e9d072abf02460b80b7e545a241c 100644
--- a/PBK/pbk_sysfs.c
+++ b/PBK/pbk_sysfs.c
@@ -19,17 +19,14 @@ static ssize_t pbk_create_domain_store(struct kobject *kobj,
     if (ret || !cpumask_subset(&request, pbk_cpuset))
         return -EINVAL;
 
-    pd = pbk_find_matched_domain(&request);
-    if (pd == NULL) {
-        ret = pbk_alloc_cpus(&request);
-        if (ret)
-            return ret;
-        
-        pd = pbk_alloc_domain(&request);
-        if (IS_ERR(pd)) {
-            pr_err("Failed to allocate pbk domain\n");
-            return PTR_ERR(pd);
-        }
+    ret = pbk_alloc_cpus(&request);
+    if (ret)
+        goto try_get_pd;
+
+    pd = pbk_alloc_domain(&request);
+    if (IS_ERR(pd)) {
+        pr_err("Failed to allocate pbk domain\n");
+        return PTR_ERR(pd);
     }
 
     current->pbkd = pd;
@@ -39,25 +36,12 @@ static ssize_t pbk_create_domain_store(struct kobject *kobj,
         return ret;
 
     return count;
-}
-
-static struct kobj_attribute pbk_create_domain_attr = __ATTR_WO(pbk_create_domain);
-
-static ssize_t pbk_join_domain_store(struct kobject *kobj,
-        struct kobj_attribute *attr, const char *buf, size_t count)
-{
-    pdid_t domain_id;
-    struct pbk_domain *pd;
-    int ret;
 
-    ret = kstrtoint(buf, 0, &domain_id);
-    if (ret)
-        return -EINVAL;
-    
-    pd = pbk_find_get_domain(domain_id);
+try_get_pd:
+    pd = pbk_find_get_domain_withcpu(&request);
     if (!pd)
         return -EINVAL;
-    
+
     pbk_attach_domain(current, pd);
     pbk_resched_threads(current, pbk_domain_cpu(pd));
     put_pbk_domain(pd);
@@ -65,7 +49,7 @@ static ssize_t pbk_join_domain_store(struct kobject *kobj,
     return count;
 }
 
-static struct kobj_attribute pbk_join_domain_attr = __ATTR_WO(pbk_join_domain);
+static struct kobj_attribute pbk_create_domain_attr = __ATTR_WO(pbk_create_domain);
 
 static ssize_t pbk_with_nr_cpu_store(struct kobject *kobj,
         struct kobj_attribute *attr, const char *buf, size_t count)
@@ -123,7 +107,6 @@ static struct kobj_attribute pbk_view_attr = __ATTR_WO(pbk_view);
 
 static struct attribute *pbk_attributes[] = {
     &pbk_create_domain_attr.attr,
-    &pbk_join_domain_attr.attr,
     &pbk_with_nr_cpu_attr.attr,
     &pbk_view_attr.attr,
     NULL
@@ -142,7 +125,6 @@ static int __init pbk_sysfs_init(void)
         return -ENOMEM;
     
     pbk_create_domain_attr.attr.mode |= S_IWGRP;
-    pbk_join_domain_attr.attr.mode |= S_IWGRP;
     pbk_with_nr_cpu_attr.attr.mode |= S_IWGRP;
     pbk_view_attr.attr.mode |= S_IWGRP;
 
diff --git a/include/linux/pbk.h b/include/linux/pbk.h
index e01e52c1fa6624bee5d1d82ae5b3a77564b0edeb..914c3355169bc0c90c9eeb4b8ce27b9484a4d589 100644
--- a/include/linux/pbk.h
+++ b/include/linux/pbk.h
@@ -35,7 +35,7 @@ struct pbk_domain {
 
 extern void pbk_create_root_domain(void);
 extern struct pbk_domain *pbk_find_get_domain(pdid_t domain_id);
-extern struct pbk_domain *pbk_find_matched_domain(cpumask_var_t request);
+extern struct pbk_domain *pbk_find_get_domain_withcpu(cpumask_var_t mask);
 extern struct pbk_domain *pbk_alloc_domain(cpumask_var_t request);
 extern void pbk_attach_domain(struct task_struct *p, struct pbk_domain *pd);
 extern void destroy_pbk_domain(struct pbk_domain *pd);
@@ -109,6 +109,9 @@ static inline bool is_pbk_cpu_state(enum cpuhp_state state)
 extern int do_cpu_up(unsigned int cpu, enum cpuhp_state target);
 extern int cpu_down(unsigned int cpu, enum cpuhp_state target);
 
+extern void sched_domains_numa_masks_set(unsigned int cpu);
+extern void sched_domains_numa_masks_clear(unsigned int cpu);
+
 #endif /* _LINUX_PBK_H */
 
 #endif /* CONFIG_PURPOSE_BUILT_KERNEL */
\ No newline at end of file