Lines Matching refs:scmrq

42 static void __scm_free_rq(struct scm_request *scmrq)
44 struct aob_rq_header *aobrq = to_aobrq(scmrq);
46 free_page((unsigned long) scmrq->aob);
47 kfree(scmrq->request);
54 struct scm_request *scmrq;
58 scmrq = list_entry(iter, struct scm_request, list);
59 list_del(&scmrq->list);
60 __scm_free_rq(scmrq);
70 struct scm_request *scmrq;
72 aobrq = kzalloc(sizeof(*aobrq) + sizeof(*scmrq), GFP_KERNEL);
76 scmrq = (void *) aobrq->data;
77 scmrq->aob = (void *) get_zeroed_page(GFP_DMA);
78 if (!scmrq->aob)
81 scmrq->request = kcalloc(nr_requests_per_io, sizeof(scmrq->request[0]),
83 if (!scmrq->request)
86 INIT_LIST_HEAD(&scmrq->list);
88 list_add(&scmrq->list, &inactive_requests);
93 __scm_free_rq(scmrq);
113 struct scm_request *scmrq = NULL;
118 scmrq = list_first_entry(&inactive_requests, struct scm_request, list);
119 list_del(&scmrq->list);
122 return scmrq;
125 static void scm_request_done(struct scm_request *scmrq)
132 for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) {
133 msb = &scmrq->aob->msb[i];
142 list_add(&scmrq->list, &inactive_requests);
166 struct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes)
170 if (scm_aidaw_bytes(scmrq->next_aidaw) >= bytes)
171 return scmrq->next_aidaw;
179 static int scm_request_prepare(struct scm_request *scmrq)
181 struct scm_blk_dev *bdev = scmrq->bdev;
183 int pos = scmrq->aob->request.msb_count;
184 struct msb *msb = &scmrq->aob->msb[pos];
185 struct request *req = scmrq->request[pos];
190 aidaw = scm_aidaw_fetch(scmrq, blk_rq_bytes(req));
195 scmrq->aob->request.msb_count++;
208 scmrq->next_aidaw = aidaw;
212 static inline void scm_request_set(struct scm_request *scmrq,
215 scmrq->request[scmrq->aob->request.msb_count] = req;
219 struct scm_request *scmrq)
221 struct aob_rq_header *aobrq = to_aobrq(scmrq);
222 struct aob *aob = scmrq->aob;
224 memset(scmrq->request, 0,
225 nr_requests_per_io * sizeof(scmrq->request[0]));
230 scmrq->bdev = bdev;
231 scmrq->retries = 4;
232 scmrq->error = BLK_STS_OK;
234 scmrq->next_aidaw = (void *) &aob->msb[nr_requests_per_io];
237 static void scm_request_requeue(struct scm_request *scmrq)
239 struct scm_blk_dev *bdev = scmrq->bdev;
242 for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++)
243 blk_mq_requeue_request(scmrq->request[i], false);
246 scm_request_done(scmrq);
250 static void scm_request_finish(struct scm_request *scmrq)
252 struct scm_blk_dev *bdev = scmrq->bdev;
256 for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) {
257 error = blk_mq_rq_to_pdu(scmrq->request[i]);
258 *error = scmrq->error;
259 if (likely(!blk_should_fake_timeout(scmrq->request[i]->q)))
260 blk_mq_complete_request(scmrq->request[i]);
264 scm_request_done(scmrq);
267 static void scm_request_start(struct scm_request *scmrq)
269 struct scm_blk_dev *bdev = scmrq->bdev;
272 if (eadm_start_aob(scmrq->aob)) {
274 scm_request_requeue(scmrq);
279 struct scm_request *scmrq;
290 struct scm_request *scmrq;
298 scmrq = sq->scmrq;
299 if (!scmrq) {
300 scmrq = scm_request_fetch();
301 if (!scmrq) {
306 scm_request_init(bdev, scmrq);
307 sq->scmrq = scmrq;
309 scm_request_set(scmrq, req);
311 if (scm_request_prepare(scmrq)) {
313 scm_request_set(scmrq, NULL);
315 if (scmrq->aob->request.msb_count)
316 scm_request_start(scmrq);
318 sq->scmrq = NULL;
324 if (qd->last || scmrq->aob->request.msb_count == nr_requests_per_io) {
325 scm_request_start(scmrq);
326 sq->scmrq = NULL;
350 WARN_ON(qd->scmrq);
355 static void __scmrq_log_error(struct scm_request *scmrq)
357 struct aob *aob = scmrq->aob;
359 if (scmrq->error == BLK_STS_TIMEOUT)
365 if (scmrq->retries)
369 scmrq->error);
372 static void scm_blk_handle_error(struct scm_request *scmrq)
374 struct scm_blk_dev *bdev = scmrq->bdev;
377 if (scmrq->error != BLK_STS_IOERR)
381 switch (scmrq->aob->response.eqc) {
395 if (!eadm_start_aob(scmrq->aob))
399 scm_request_requeue(scmrq);
404 struct scm_request *scmrq = data;
406 scmrq->error = error;
408 __scmrq_log_error(scmrq);
409 if (scmrq->retries-- > 0) {
410 scm_blk_handle_error(scmrq);
415 scm_request_finish(scmrq);