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