Lines Matching refs:wsm

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