Lines Matching refs:wsm
1014 static void init_workspace_manager(struct workspace_manager *wsm)
1016 INIT_LIST_HEAD(&wsm->idle_ws);
1017 spin_lock_init(&wsm->ws_lock);
1018 atomic_set(&wsm->total_ws, 0);
1019 wsm->free_ws = 0;
1020 init_waitqueue_head(&wsm->ws_wait);
1023 static void add_initial_workspace(struct workspace_manager *wsm,
1026 WARN_ON(!list_empty(&wsm->idle_ws));
1028 list_add(&work->item, &wsm->idle_ws);
1029 atomic_set(&wsm->total_ws, 1);
1030 wsm->free_ws = 1;
1033 static void cleanup_workspace_manager(struct workspace_manager *wsm)
1037 while (!list_empty(&wsm->idle_ws)) {
1038 work = list_first_entry(&wsm->idle_ws, struct crush_work,
1043 atomic_set(&wsm->total_ws, 0);
1044 wsm->free_ws = 0;
1051 static struct crush_work *get_workspace(struct workspace_manager *wsm,
1058 spin_lock(&wsm->ws_lock);
1059 if (!list_empty(&wsm->idle_ws)) {
1060 work = list_first_entry(&wsm->idle_ws, struct crush_work,
1063 wsm->free_ws--;
1064 spin_unlock(&wsm->ws_lock);
1068 if (atomic_read(&wsm->total_ws) > cpus) {
1071 spin_unlock(&wsm->ws_lock);
1072 prepare_to_wait(&wsm->ws_wait, &wait, TASK_UNINTERRUPTIBLE);
1073 if (atomic_read(&wsm->total_ws) > cpus && !wsm->free_ws)
1075 finish_wait(&wsm->ws_wait, &wait);
1078 atomic_inc(&wsm->total_ws);
1079 spin_unlock(&wsm->ws_lock);
1083 atomic_dec(&wsm->total_ws);
1084 wake_up(&wsm->ws_wait);
1091 WARN_ON(atomic_read(&wsm->total_ws) < 1);
1101 static void put_workspace(struct workspace_manager *wsm,
1104 spin_lock(&wsm->ws_lock);
1105 if (wsm->free_ws <= num_online_cpus()) {
1106 list_add(&work->item, &wsm->idle_ws);
1107 wsm->free_ws++;
1108 spin_unlock(&wsm->ws_lock);
1111 spin_unlock(&wsm->ws_lock);
1114 atomic_dec(&wsm->total_ws);
1116 if (wq_has_sleeper(&wsm->ws_wait))
1117 wake_up(&wsm->ws_wait);