Lines Matching refs:wsm
998 static void init_workspace_manager(struct workspace_manager *wsm)
1000 INIT_LIST_HEAD(&wsm->idle_ws);
1001 spin_lock_init(&wsm->ws_lock);
1002 atomic_set(&wsm->total_ws, 0);
1003 wsm->free_ws = 0;
1004 init_waitqueue_head(&wsm->ws_wait);
1007 static void add_initial_workspace(struct workspace_manager *wsm,
1010 WARN_ON(!list_empty(&wsm->idle_ws));
1012 list_add(&work->item, &wsm->idle_ws);
1013 atomic_set(&wsm->total_ws, 1);
1014 wsm->free_ws = 1;
1017 static void cleanup_workspace_manager(struct workspace_manager *wsm)
1021 while (!list_empty(&wsm->idle_ws)) {
1022 work = list_first_entry(&wsm->idle_ws, struct crush_work,
1027 atomic_set(&wsm->total_ws, 0);
1028 wsm->free_ws = 0;
1035 static struct crush_work *get_workspace(struct workspace_manager *wsm,
1042 spin_lock(&wsm->ws_lock);
1043 if (!list_empty(&wsm->idle_ws)) {
1044 work = list_first_entry(&wsm->idle_ws, struct crush_work,
1047 wsm->free_ws--;
1048 spin_unlock(&wsm->ws_lock);
1052 if (atomic_read(&wsm->total_ws) > cpus) {
1055 spin_unlock(&wsm->ws_lock);
1056 prepare_to_wait(&wsm->ws_wait, &wait, TASK_UNINTERRUPTIBLE);
1057 if (atomic_read(&wsm->total_ws) > cpus && !wsm->free_ws)
1059 finish_wait(&wsm->ws_wait, &wait);
1062 atomic_inc(&wsm->total_ws);
1063 spin_unlock(&wsm->ws_lock);
1067 atomic_dec(&wsm->total_ws);
1068 wake_up(&wsm->ws_wait);
1075 WARN_ON(atomic_read(&wsm->total_ws) < 1);
1085 static void put_workspace(struct workspace_manager *wsm,
1088 spin_lock(&wsm->ws_lock);
1089 if (wsm->free_ws <= num_online_cpus()) {
1090 list_add(&work->item, &wsm->idle_ws);
1091 wsm->free_ws++;
1092 spin_unlock(&wsm->ws_lock);
1095 spin_unlock(&wsm->ws_lock);
1098 atomic_dec(&wsm->total_ws);
1100 if (wq_has_sleeper(&wsm->ws_wait))
1101 wake_up(&wsm->ws_wait);