Lines Matching refs:session

58 static void vmcp_response_alloc(struct vmcp_session *session)  in vmcp_response_alloc()  argument
63 order = get_order(session->bufsize); in vmcp_response_alloc()
64 nr_pages = ALIGN(session->bufsize, PAGE_SIZE) >> PAGE_SHIFT; in vmcp_response_alloc()
73 session->response = (char *)page_to_phys(page); in vmcp_response_alloc()
74 session->cma_alloc = 1; in vmcp_response_alloc()
77 session->response = (char *)__get_free_pages(GFP_KERNEL | __GFP_RETRY_MAYFAIL, order); in vmcp_response_alloc()
80 static void vmcp_response_free(struct vmcp_session *session) in vmcp_response_free() argument
85 if (!session->response) in vmcp_response_free()
87 order = get_order(session->bufsize); in vmcp_response_free()
88 nr_pages = ALIGN(session->bufsize, PAGE_SIZE) >> PAGE_SHIFT; in vmcp_response_free()
89 if (session->cma_alloc) { in vmcp_response_free()
90 page = phys_to_page((unsigned long)session->response); in vmcp_response_free()
92 session->cma_alloc = 0; in vmcp_response_free()
94 free_pages((unsigned long)session->response, order); in vmcp_response_free()
96 session->response = NULL; in vmcp_response_free()
101 struct vmcp_session *session; in vmcp_open() local
106 session = kmalloc(sizeof(*session), GFP_KERNEL); in vmcp_open()
107 if (!session) in vmcp_open()
110 session->bufsize = PAGE_SIZE; in vmcp_open()
111 session->response = NULL; in vmcp_open()
112 session->resp_size = 0; in vmcp_open()
113 mutex_init(&session->mutex); in vmcp_open()
114 file->private_data = session; in vmcp_open()
120 struct vmcp_session *session; in vmcp_release() local
122 session = file->private_data; in vmcp_release()
124 vmcp_response_free(session); in vmcp_release()
125 kfree(session); in vmcp_release()
134 struct vmcp_session *session; in vmcp_read() local
136 session = file->private_data; in vmcp_read()
137 if (mutex_lock_interruptible(&session->mutex)) in vmcp_read()
139 if (!session->response) { in vmcp_read()
140 mutex_unlock(&session->mutex); in vmcp_read()
143 size = min_t(size_t, session->resp_size, session->bufsize); in vmcp_read()
145 session->response, size); in vmcp_read()
147 mutex_unlock(&session->mutex); in vmcp_read()
157 struct vmcp_session *session; in vmcp_write() local
164 session = file->private_data; in vmcp_write()
165 if (mutex_lock_interruptible(&session->mutex)) { in vmcp_write()
169 if (!session->response) in vmcp_write()
170 vmcp_response_alloc(session); in vmcp_write()
171 if (!session->response) { in vmcp_write()
172 mutex_unlock(&session->mutex); in vmcp_write()
177 session->resp_size = cpcmd(cmd, session->response, session->bufsize, in vmcp_write()
178 &session->resp_code); in vmcp_write()
179 mutex_unlock(&session->mutex); in vmcp_write()
200 struct vmcp_session *session; in vmcp_ioctl() local
204 session = file->private_data; in vmcp_ioctl()
209 if (mutex_lock_interruptible(&session->mutex)) in vmcp_ioctl()
213 ret = put_user(session->resp_code, argp); in vmcp_ioctl()
216 vmcp_response_free(session); in vmcp_ioctl()
217 ret = get_user(session->bufsize, argp); in vmcp_ioctl()
219 session->bufsize = PAGE_SIZE; in vmcp_ioctl()
220 if (!session->bufsize || get_order(session->bufsize) > 8) { in vmcp_ioctl()
221 session->bufsize = PAGE_SIZE; in vmcp_ioctl()
226 ret = put_user(session->resp_size, argp); in vmcp_ioctl()
231 mutex_unlock(&session->mutex); in vmcp_ioctl()