Lines Matching refs:session

60 static void vmcp_response_alloc(struct vmcp_session *session)  in vmcp_response_alloc()  argument
65 order = get_order(session->bufsize); in vmcp_response_alloc()
66 nr_pages = ALIGN(session->bufsize, PAGE_SIZE) >> PAGE_SHIFT; in vmcp_response_alloc()
75 session->response = (char *)page_to_virt(page); in vmcp_response_alloc()
76 session->cma_alloc = 1; in vmcp_response_alloc()
79 session->response = (char *)__get_free_pages(GFP_KERNEL | __GFP_RETRY_MAYFAIL, order); in vmcp_response_alloc()
82 static void vmcp_response_free(struct vmcp_session *session) in vmcp_response_free() argument
87 if (!session->response) in vmcp_response_free()
89 order = get_order(session->bufsize); in vmcp_response_free()
90 nr_pages = ALIGN(session->bufsize, PAGE_SIZE) >> PAGE_SHIFT; in vmcp_response_free()
91 if (session->cma_alloc) { in vmcp_response_free()
92 page = virt_to_page(session->response); in vmcp_response_free()
94 session->cma_alloc = 0; in vmcp_response_free()
96 free_pages((unsigned long)session->response, order); in vmcp_response_free()
98 session->response = NULL; in vmcp_response_free()
103 struct vmcp_session *session; in vmcp_open() local
108 session = kmalloc(sizeof(*session), GFP_KERNEL); in vmcp_open()
109 if (!session) in vmcp_open()
112 session->bufsize = PAGE_SIZE; in vmcp_open()
113 session->response = NULL; in vmcp_open()
114 session->resp_size = 0; in vmcp_open()
115 mutex_init(&session->mutex); in vmcp_open()
116 file->private_data = session; in vmcp_open()
122 struct vmcp_session *session; in vmcp_release() local
124 session = file->private_data; in vmcp_release()
126 vmcp_response_free(session); in vmcp_release()
127 kfree(session); in vmcp_release()
136 struct vmcp_session *session; in vmcp_read() local
138 session = file->private_data; in vmcp_read()
139 if (mutex_lock_interruptible(&session->mutex)) in vmcp_read()
141 if (!session->response) { in vmcp_read()
142 mutex_unlock(&session->mutex); in vmcp_read()
145 size = min_t(size_t, session->resp_size, session->bufsize); in vmcp_read()
147 session->response, size); in vmcp_read()
149 mutex_unlock(&session->mutex); in vmcp_read()
159 struct vmcp_session *session; in vmcp_write() local
166 session = file->private_data; in vmcp_write()
167 if (mutex_lock_interruptible(&session->mutex)) { in vmcp_write()
171 if (!session->response) in vmcp_write()
172 vmcp_response_alloc(session); in vmcp_write()
173 if (!session->response) { in vmcp_write()
174 mutex_unlock(&session->mutex); in vmcp_write()
179 session->resp_size = cpcmd(cmd, session->response, session->bufsize, in vmcp_write()
180 &session->resp_code); in vmcp_write()
181 mutex_unlock(&session->mutex); in vmcp_write()
202 struct vmcp_session *session; in vmcp_ioctl() local
206 session = file->private_data; in vmcp_ioctl()
211 if (mutex_lock_interruptible(&session->mutex)) in vmcp_ioctl()
215 ret = put_user(session->resp_code, argp); in vmcp_ioctl()
218 vmcp_response_free(session); in vmcp_ioctl()
219 ret = get_user(session->bufsize, argp); in vmcp_ioctl()
221 session->bufsize = PAGE_SIZE; in vmcp_ioctl()
222 if (!session->bufsize || get_order(session->bufsize) > 8) { in vmcp_ioctl()
223 session->bufsize = PAGE_SIZE; in vmcp_ioctl()
228 ret = put_user(session->resp_size, argp); in vmcp_ioctl()
233 mutex_unlock(&session->mutex); in vmcp_ioctl()