Lines Matching refs:wsm

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