Lines Matching defs:scmrq

43 static void __scm_free_rq(struct scm_request *scmrq)
45 struct aob_rq_header *aobrq = to_aobrq(scmrq);
47 free_page((unsigned long) scmrq->aob);
48 kfree(scmrq->request);
55 struct scm_request *scmrq;
59 scmrq = list_entry(iter, struct scm_request, list);
60 list_del(&scmrq->list);
61 __scm_free_rq(scmrq);
71 struct scm_request *scmrq;
73 aobrq = kzalloc(sizeof(*aobrq) + sizeof(*scmrq), GFP_KERNEL);
77 scmrq = (void *) aobrq->data;
78 scmrq->aob = (void *) get_zeroed_page(GFP_DMA);
79 if (!scmrq->aob)
82 scmrq->request = kcalloc(nr_requests_per_io, sizeof(scmrq->request[0]),
84 if (!scmrq->request)
87 INIT_LIST_HEAD(&scmrq->list);
89 list_add(&scmrq->list, &inactive_requests);
94 __scm_free_rq(scmrq);
114 struct scm_request *scmrq = NULL;
119 scmrq = list_first_entry(&inactive_requests, struct scm_request, list);
120 list_del(&scmrq->list);
123 return scmrq;
126 static void scm_request_done(struct scm_request *scmrq)
133 for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) {
134 msb = &scmrq->aob->msb[i];
143 list_add(&scmrq->list, &inactive_requests);
167 struct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes)
171 if (scm_aidaw_bytes(scmrq->next_aidaw) >= bytes)
172 return scmrq->next_aidaw;
180 static int scm_request_prepare(struct scm_request *scmrq)
182 struct scm_blk_dev *bdev = scmrq->bdev;
184 int pos = scmrq->aob->request.msb_count;
185 struct msb *msb = &scmrq->aob->msb[pos];
186 struct request *req = scmrq->request[pos];
191 aidaw = scm_aidaw_fetch(scmrq, blk_rq_bytes(req));
196 scmrq->aob->request.msb_count++;
209 scmrq->next_aidaw = aidaw;
213 static inline void scm_request_set(struct scm_request *scmrq,
216 scmrq->request[scmrq->aob->request.msb_count] = req;
220 struct scm_request *scmrq)
222 struct aob_rq_header *aobrq = to_aobrq(scmrq);
223 struct aob *aob = scmrq->aob;
225 memset(scmrq->request, 0,
226 nr_requests_per_io * sizeof(scmrq->request[0]));
231 scmrq->bdev = bdev;
232 scmrq->retries = 4;
233 scmrq->error = BLK_STS_OK;
235 scmrq->next_aidaw = (void *) &aob->msb[nr_requests_per_io];
238 static void scm_request_requeue(struct scm_request *scmrq)
240 struct scm_blk_dev *bdev = scmrq->bdev;
243 for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++)
244 blk_mq_requeue_request(scmrq->request[i], false);
247 scm_request_done(scmrq);
251 static void scm_request_finish(struct scm_request *scmrq)
253 struct scm_blk_dev *bdev = scmrq->bdev;
257 for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) {
258 error = blk_mq_rq_to_pdu(scmrq->request[i]);
259 *error = scmrq->error;
260 if (likely(!blk_should_fake_timeout(scmrq->request[i]->q)))
261 blk_mq_complete_request(scmrq->request[i]);
265 scm_request_done(scmrq);
268 static void scm_request_start(struct scm_request *scmrq)
270 struct scm_blk_dev *bdev = scmrq->bdev;
273 if (eadm_start_aob(scmrq->aob)) {
275 scm_request_requeue(scmrq);
280 struct scm_request *scmrq;
291 struct scm_request *scmrq;
299 scmrq = sq->scmrq;
300 if (!scmrq) {
301 scmrq = scm_request_fetch();
302 if (!scmrq) {
307 scm_request_init(bdev, scmrq);
308 sq->scmrq = scmrq;
310 scm_request_set(scmrq, req);
312 if (scm_request_prepare(scmrq)) {
314 scm_request_set(scmrq, NULL);
316 if (scmrq->aob->request.msb_count)
317 scm_request_start(scmrq);
319 sq->scmrq = NULL;
325 if (qd->last || scmrq->aob->request.msb_count == nr_requests_per_io) {
326 scm_request_start(scmrq);
327 sq->scmrq = NULL;
351 WARN_ON(qd->scmrq);
356 static void __scmrq_log_error(struct scm_request *scmrq)
358 struct aob *aob = scmrq->aob;
360 if (scmrq->error == BLK_STS_TIMEOUT)
366 if (scmrq->retries)
370 scmrq->error);
373 static void scm_blk_handle_error(struct scm_request *scmrq)
375 struct scm_blk_dev *bdev = scmrq->bdev;
378 if (scmrq->error != BLK_STS_IOERR)
382 switch (scmrq->aob->response.eqc) {
396 if (!eadm_start_aob(scmrq->aob))
400 scm_request_requeue(scmrq);
405 struct scm_request *scmrq = data;
407 scmrq->error = error;
409 __scmrq_log_error(scmrq);
410 if (scmrq->retries-- > 0) {
411 scm_blk_handle_error(scmrq);
416 scm_request_finish(scmrq);