Linux-libre 4.19.123-gnu
[librecmc/linux-libre.git] / fs / cifs / smbdirect.c
1 /*
2  *   Copyright (C) 2017, Microsoft Corporation.
3  *
4  *   Author(s): Long Li <longli@microsoft.com>
5  *
6  *   This program is free software;  you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14  *   the GNU General Public License for more details.
15  */
16 #include <linux/module.h>
17 #include <linux/highmem.h>
18 #include "smbdirect.h"
19 #include "cifs_debug.h"
20 #include "cifsproto.h"
21 #include "smb2proto.h"
22
23 static struct smbd_response *get_empty_queue_buffer(
24                 struct smbd_connection *info);
25 static struct smbd_response *get_receive_buffer(
26                 struct smbd_connection *info);
27 static void put_receive_buffer(
28                 struct smbd_connection *info,
29                 struct smbd_response *response);
30 static int allocate_receive_buffers(struct smbd_connection *info, int num_buf);
31 static void destroy_receive_buffers(struct smbd_connection *info);
32
33 static void put_empty_packet(
34                 struct smbd_connection *info, struct smbd_response *response);
35 static void enqueue_reassembly(
36                 struct smbd_connection *info,
37                 struct smbd_response *response, int data_length);
38 static struct smbd_response *_get_first_reassembly(
39                 struct smbd_connection *info);
40
41 static int smbd_post_recv(
42                 struct smbd_connection *info,
43                 struct smbd_response *response);
44
45 static int smbd_post_send_empty(struct smbd_connection *info);
46 static int smbd_post_send_data(
47                 struct smbd_connection *info,
48                 struct kvec *iov, int n_vec, int remaining_data_length);
49 static int smbd_post_send_page(struct smbd_connection *info,
50                 struct page *page, unsigned long offset,
51                 size_t size, int remaining_data_length);
52
53 static void destroy_mr_list(struct smbd_connection *info);
54 static int allocate_mr_list(struct smbd_connection *info);
55
56 /* SMBD version number */
57 #define SMBD_V1 0x0100
58
59 /* Port numbers for SMBD transport */
60 #define SMB_PORT        445
61 #define SMBD_PORT       5445
62
63 /* Address lookup and resolve timeout in ms */
64 #define RDMA_RESOLVE_TIMEOUT    5000
65
66 /* SMBD negotiation timeout in seconds */
67 #define SMBD_NEGOTIATE_TIMEOUT  120
68
69 /* SMBD minimum receive size and fragmented sized defined in [MS-SMBD] */
70 #define SMBD_MIN_RECEIVE_SIZE           128
71 #define SMBD_MIN_FRAGMENTED_SIZE        131072
72
73 /*
74  * Default maximum number of RDMA read/write outstanding on this connection
75  * This value is possibly decreased during QP creation on hardware limit
76  */
77 #define SMBD_CM_RESPONDER_RESOURCES     32
78
79 /* Maximum number of retries on data transfer operations */
80 #define SMBD_CM_RETRY                   6
81 /* No need to retry on Receiver Not Ready since SMBD manages credits */
82 #define SMBD_CM_RNR_RETRY               0
83
84 /*
85  * User configurable initial values per SMBD transport connection
86  * as defined in [MS-SMBD] 3.1.1.1
87  * Those may change after a SMBD negotiation
88  */
89 /* The local peer's maximum number of credits to grant to the peer */
90 int smbd_receive_credit_max = 255;
91
92 /* The remote peer's credit request of local peer */
93 int smbd_send_credit_target = 255;
94
95 /* The maximum single message size can be sent to remote peer */
96 int smbd_max_send_size = 1364;
97
98 /*  The maximum fragmented upper-layer payload receive size supported */
99 int smbd_max_fragmented_recv_size = 1024 * 1024;
100
101 /*  The maximum single-message size which can be received */
102 int smbd_max_receive_size = 8192;
103
104 /* The timeout to initiate send of a keepalive message on idle */
105 int smbd_keep_alive_interval = 120;
106
107 /*
108  * User configurable initial values for RDMA transport
109  * The actual values used may be lower and are limited to hardware capabilities
110  */
111 /* Default maximum number of SGEs in a RDMA write/read */
112 int smbd_max_frmr_depth = 2048;
113
114 /* If payload is less than this byte, use RDMA send/recv not read/write */
115 int rdma_readwrite_threshold = 4096;
116
117 /* Transport logging functions
118  * Logging are defined as classes. They can be OR'ed to define the actual
119  * logging level via module parameter smbd_logging_class
120  * e.g. cifs.smbd_logging_class=0xa0 will log all log_rdma_recv() and
121  * log_rdma_event()
122  */
123 #define LOG_OUTGOING                    0x1
124 #define LOG_INCOMING                    0x2
125 #define LOG_READ                        0x4
126 #define LOG_WRITE                       0x8
127 #define LOG_RDMA_SEND                   0x10
128 #define LOG_RDMA_RECV                   0x20
129 #define LOG_KEEP_ALIVE                  0x40
130 #define LOG_RDMA_EVENT                  0x80
131 #define LOG_RDMA_MR                     0x100
132 static unsigned int smbd_logging_class;
133 module_param(smbd_logging_class, uint, 0644);
134 MODULE_PARM_DESC(smbd_logging_class,
135         "Logging class for SMBD transport 0x0 to 0x100");
136
137 #define ERR             0x0
138 #define INFO            0x1
139 static unsigned int smbd_logging_level = ERR;
140 module_param(smbd_logging_level, uint, 0644);
141 MODULE_PARM_DESC(smbd_logging_level,
142         "Logging level for SMBD transport, 0 (default): error, 1: info");
143
144 #define log_rdma(level, class, fmt, args...)                            \
145 do {                                                                    \
146         if (level <= smbd_logging_level || class & smbd_logging_class)  \
147                 cifs_dbg(VFS, "%s:%d " fmt, __func__, __LINE__, ##args);\
148 } while (0)
149
150 #define log_outgoing(level, fmt, args...) \
151                 log_rdma(level, LOG_OUTGOING, fmt, ##args)
152 #define log_incoming(level, fmt, args...) \
153                 log_rdma(level, LOG_INCOMING, fmt, ##args)
154 #define log_read(level, fmt, args...)   log_rdma(level, LOG_READ, fmt, ##args)
155 #define log_write(level, fmt, args...)  log_rdma(level, LOG_WRITE, fmt, ##args)
156 #define log_rdma_send(level, fmt, args...) \
157                 log_rdma(level, LOG_RDMA_SEND, fmt, ##args)
158 #define log_rdma_recv(level, fmt, args...) \
159                 log_rdma(level, LOG_RDMA_RECV, fmt, ##args)
160 #define log_keep_alive(level, fmt, args...) \
161                 log_rdma(level, LOG_KEEP_ALIVE, fmt, ##args)
162 #define log_rdma_event(level, fmt, args...) \
163                 log_rdma(level, LOG_RDMA_EVENT, fmt, ##args)
164 #define log_rdma_mr(level, fmt, args...) \
165                 log_rdma(level, LOG_RDMA_MR, fmt, ##args)
166
167 /*
168  * Destroy the transport and related RDMA and memory resources
169  * Need to go through all the pending counters and make sure on one is using
170  * the transport while it is destroyed
171  */
172 static void smbd_destroy_rdma_work(struct work_struct *work)
173 {
174         struct smbd_response *response;
175         struct smbd_connection *info =
176                 container_of(work, struct smbd_connection, destroy_work);
177         unsigned long flags;
178
179         log_rdma_event(INFO, "destroying qp\n");
180         ib_drain_qp(info->id->qp);
181         rdma_destroy_qp(info->id);
182
183         /* Unblock all I/O waiting on the send queue */
184         wake_up_interruptible_all(&info->wait_send_queue);
185
186         log_rdma_event(INFO, "cancelling idle timer\n");
187         cancel_delayed_work_sync(&info->idle_timer_work);
188         log_rdma_event(INFO, "cancelling send immediate work\n");
189         cancel_delayed_work_sync(&info->send_immediate_work);
190
191         log_rdma_event(INFO, "wait for all send to finish\n");
192         wait_event(info->wait_smbd_send_pending,
193                 info->smbd_send_pending == 0);
194
195         log_rdma_event(INFO, "wait for all recv to finish\n");
196         wake_up_interruptible(&info->wait_reassembly_queue);
197         wait_event(info->wait_smbd_recv_pending,
198                 info->smbd_recv_pending == 0);
199
200         log_rdma_event(INFO, "wait for all send posted to IB to finish\n");
201         wait_event(info->wait_send_pending,
202                 atomic_read(&info->send_pending) == 0);
203         wait_event(info->wait_send_payload_pending,
204                 atomic_read(&info->send_payload_pending) == 0);
205
206         log_rdma_event(INFO, "freeing mr list\n");
207         wake_up_interruptible_all(&info->wait_mr);
208         wait_event(info->wait_for_mr_cleanup,
209                 atomic_read(&info->mr_used_count) == 0);
210         destroy_mr_list(info);
211
212         /* It's not posssible for upper layer to get to reassembly */
213         log_rdma_event(INFO, "drain the reassembly queue\n");
214         do {
215                 spin_lock_irqsave(&info->reassembly_queue_lock, flags);
216                 response = _get_first_reassembly(info);
217                 if (response) {
218                         list_del(&response->list);
219                         spin_unlock_irqrestore(
220                                 &info->reassembly_queue_lock, flags);
221                         put_receive_buffer(info, response);
222                 } else
223                         spin_unlock_irqrestore(&info->reassembly_queue_lock, flags);
224         } while (response);
225
226         info->reassembly_data_length = 0;
227
228         log_rdma_event(INFO, "free receive buffers\n");
229         wait_event(info->wait_receive_queues,
230                 info->count_receive_queue + info->count_empty_packet_queue
231                         == info->receive_credit_max);
232         destroy_receive_buffers(info);
233
234         ib_free_cq(info->send_cq);
235         ib_free_cq(info->recv_cq);
236         ib_dealloc_pd(info->pd);
237         rdma_destroy_id(info->id);
238
239         /* free mempools */
240         mempool_destroy(info->request_mempool);
241         kmem_cache_destroy(info->request_cache);
242
243         mempool_destroy(info->response_mempool);
244         kmem_cache_destroy(info->response_cache);
245
246         info->transport_status = SMBD_DESTROYED;
247         wake_up_all(&info->wait_destroy);
248 }
249
250 static int smbd_process_disconnected(struct smbd_connection *info)
251 {
252         schedule_work(&info->destroy_work);
253         return 0;
254 }
255
256 static void smbd_disconnect_rdma_work(struct work_struct *work)
257 {
258         struct smbd_connection *info =
259                 container_of(work, struct smbd_connection, disconnect_work);
260
261         if (info->transport_status == SMBD_CONNECTED) {
262                 info->transport_status = SMBD_DISCONNECTING;
263                 rdma_disconnect(info->id);
264         }
265 }
266
267 static void smbd_disconnect_rdma_connection(struct smbd_connection *info)
268 {
269         queue_work(info->workqueue, &info->disconnect_work);
270 }
271
272 /* Upcall from RDMA CM */
273 static int smbd_conn_upcall(
274                 struct rdma_cm_id *id, struct rdma_cm_event *event)
275 {
276         struct smbd_connection *info = id->context;
277
278         log_rdma_event(INFO, "event=%d status=%d\n",
279                 event->event, event->status);
280
281         switch (event->event) {
282         case RDMA_CM_EVENT_ADDR_RESOLVED:
283         case RDMA_CM_EVENT_ROUTE_RESOLVED:
284                 info->ri_rc = 0;
285                 complete(&info->ri_done);
286                 break;
287
288         case RDMA_CM_EVENT_ADDR_ERROR:
289                 info->ri_rc = -EHOSTUNREACH;
290                 complete(&info->ri_done);
291                 break;
292
293         case RDMA_CM_EVENT_ROUTE_ERROR:
294                 info->ri_rc = -ENETUNREACH;
295                 complete(&info->ri_done);
296                 break;
297
298         case RDMA_CM_EVENT_ESTABLISHED:
299                 log_rdma_event(INFO, "connected event=%d\n", event->event);
300                 info->transport_status = SMBD_CONNECTED;
301                 wake_up_interruptible(&info->conn_wait);
302                 break;
303
304         case RDMA_CM_EVENT_CONNECT_ERROR:
305         case RDMA_CM_EVENT_UNREACHABLE:
306         case RDMA_CM_EVENT_REJECTED:
307                 log_rdma_event(INFO, "connecting failed event=%d\n", event->event);
308                 info->transport_status = SMBD_DISCONNECTED;
309                 wake_up_interruptible(&info->conn_wait);
310                 break;
311
312         case RDMA_CM_EVENT_DEVICE_REMOVAL:
313         case RDMA_CM_EVENT_DISCONNECTED:
314                 /* This happenes when we fail the negotiation */
315                 if (info->transport_status == SMBD_NEGOTIATE_FAILED) {
316                         info->transport_status = SMBD_DISCONNECTED;
317                         wake_up(&info->conn_wait);
318                         break;
319                 }
320
321                 info->transport_status = SMBD_DISCONNECTED;
322                 smbd_process_disconnected(info);
323                 break;
324
325         default:
326                 break;
327         }
328
329         return 0;
330 }
331
332 /* Upcall from RDMA QP */
333 static void
334 smbd_qp_async_error_upcall(struct ib_event *event, void *context)
335 {
336         struct smbd_connection *info = context;
337
338         log_rdma_event(ERR, "%s on device %s info %p\n",
339                 ib_event_msg(event->event), event->device->name, info);
340
341         switch (event->event) {
342         case IB_EVENT_CQ_ERR:
343         case IB_EVENT_QP_FATAL:
344                 smbd_disconnect_rdma_connection(info);
345
346         default:
347                 break;
348         }
349 }
350
351 static inline void *smbd_request_payload(struct smbd_request *request)
352 {
353         return (void *)request->packet;
354 }
355
356 static inline void *smbd_response_payload(struct smbd_response *response)
357 {
358         return (void *)response->packet;
359 }
360
361 /* Called when a RDMA send is done */
362 static void send_done(struct ib_cq *cq, struct ib_wc *wc)
363 {
364         int i;
365         struct smbd_request *request =
366                 container_of(wc->wr_cqe, struct smbd_request, cqe);
367
368         log_rdma_send(INFO, "smbd_request %p completed wc->status=%d\n",
369                 request, wc->status);
370
371         if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_SEND) {
372                 log_rdma_send(ERR, "wc->status=%d wc->opcode=%d\n",
373                         wc->status, wc->opcode);
374                 smbd_disconnect_rdma_connection(request->info);
375         }
376
377         for (i = 0; i < request->num_sge; i++)
378                 ib_dma_unmap_single(request->info->id->device,
379                         request->sge[i].addr,
380                         request->sge[i].length,
381                         DMA_TO_DEVICE);
382
383         if (request->has_payload) {
384                 if (atomic_dec_and_test(&request->info->send_payload_pending))
385                         wake_up(&request->info->wait_send_payload_pending);
386         } else {
387                 if (atomic_dec_and_test(&request->info->send_pending))
388                         wake_up(&request->info->wait_send_pending);
389         }
390
391         mempool_free(request, request->info->request_mempool);
392 }
393
394 static void dump_smbd_negotiate_resp(struct smbd_negotiate_resp *resp)
395 {
396         log_rdma_event(INFO, "resp message min_version %u max_version %u "
397                 "negotiated_version %u credits_requested %u "
398                 "credits_granted %u status %u max_readwrite_size %u "
399                 "preferred_send_size %u max_receive_size %u "
400                 "max_fragmented_size %u\n",
401                 resp->min_version, resp->max_version, resp->negotiated_version,
402                 resp->credits_requested, resp->credits_granted, resp->status,
403                 resp->max_readwrite_size, resp->preferred_send_size,
404                 resp->max_receive_size, resp->max_fragmented_size);
405 }
406
407 /*
408  * Process a negotiation response message, according to [MS-SMBD]3.1.5.7
409  * response, packet_length: the negotiation response message
410  * return value: true if negotiation is a success, false if failed
411  */
412 static bool process_negotiation_response(
413                 struct smbd_response *response, int packet_length)
414 {
415         struct smbd_connection *info = response->info;
416         struct smbd_negotiate_resp *packet = smbd_response_payload(response);
417
418         if (packet_length < sizeof(struct smbd_negotiate_resp)) {
419                 log_rdma_event(ERR,
420                         "error: packet_length=%d\n", packet_length);
421                 return false;
422         }
423
424         if (le16_to_cpu(packet->negotiated_version) != SMBD_V1) {
425                 log_rdma_event(ERR, "error: negotiated_version=%x\n",
426                         le16_to_cpu(packet->negotiated_version));
427                 return false;
428         }
429         info->protocol = le16_to_cpu(packet->negotiated_version);
430
431         if (packet->credits_requested == 0) {
432                 log_rdma_event(ERR, "error: credits_requested==0\n");
433                 return false;
434         }
435         info->receive_credit_target = le16_to_cpu(packet->credits_requested);
436
437         if (packet->credits_granted == 0) {
438                 log_rdma_event(ERR, "error: credits_granted==0\n");
439                 return false;
440         }
441         atomic_set(&info->send_credits, le16_to_cpu(packet->credits_granted));
442
443         atomic_set(&info->receive_credits, 0);
444
445         if (le32_to_cpu(packet->preferred_send_size) > info->max_receive_size) {
446                 log_rdma_event(ERR, "error: preferred_send_size=%d\n",
447                         le32_to_cpu(packet->preferred_send_size));
448                 return false;
449         }
450         info->max_receive_size = le32_to_cpu(packet->preferred_send_size);
451
452         if (le32_to_cpu(packet->max_receive_size) < SMBD_MIN_RECEIVE_SIZE) {
453                 log_rdma_event(ERR, "error: max_receive_size=%d\n",
454                         le32_to_cpu(packet->max_receive_size));
455                 return false;
456         }
457         info->max_send_size = min_t(int, info->max_send_size,
458                                         le32_to_cpu(packet->max_receive_size));
459
460         if (le32_to_cpu(packet->max_fragmented_size) <
461                         SMBD_MIN_FRAGMENTED_SIZE) {
462                 log_rdma_event(ERR, "error: max_fragmented_size=%d\n",
463                         le32_to_cpu(packet->max_fragmented_size));
464                 return false;
465         }
466         info->max_fragmented_send_size =
467                 le32_to_cpu(packet->max_fragmented_size);
468         info->rdma_readwrite_threshold =
469                 rdma_readwrite_threshold > info->max_fragmented_send_size ?
470                 info->max_fragmented_send_size :
471                 rdma_readwrite_threshold;
472
473
474         info->max_readwrite_size = min_t(u32,
475                         le32_to_cpu(packet->max_readwrite_size),
476                         info->max_frmr_depth * PAGE_SIZE);
477         info->max_frmr_depth = info->max_readwrite_size / PAGE_SIZE;
478
479         return true;
480 }
481
482 /*
483  * Check and schedule to send an immediate packet
484  * This is used to extend credtis to remote peer to keep the transport busy
485  */
486 static void check_and_send_immediate(struct smbd_connection *info)
487 {
488         if (info->transport_status != SMBD_CONNECTED)
489                 return;
490
491         info->send_immediate = true;
492
493         /*
494          * Promptly send a packet if our peer is running low on receive
495          * credits
496          */
497         if (atomic_read(&info->receive_credits) <
498                 info->receive_credit_target - 1)
499                 queue_delayed_work(
500                         info->workqueue, &info->send_immediate_work, 0);
501 }
502
503 static void smbd_post_send_credits(struct work_struct *work)
504 {
505         int ret = 0;
506         int use_receive_queue = 1;
507         int rc;
508         struct smbd_response *response;
509         struct smbd_connection *info =
510                 container_of(work, struct smbd_connection,
511                         post_send_credits_work);
512
513         if (info->transport_status != SMBD_CONNECTED) {
514                 wake_up(&info->wait_receive_queues);
515                 return;
516         }
517
518         if (info->receive_credit_target >
519                 atomic_read(&info->receive_credits)) {
520                 while (true) {
521                         if (use_receive_queue)
522                                 response = get_receive_buffer(info);
523                         else
524                                 response = get_empty_queue_buffer(info);
525                         if (!response) {
526                                 /* now switch to emtpy packet queue */
527                                 if (use_receive_queue) {
528                                         use_receive_queue = 0;
529                                         continue;
530                                 } else
531                                         break;
532                         }
533
534                         response->type = SMBD_TRANSFER_DATA;
535                         response->first_segment = false;
536                         rc = smbd_post_recv(info, response);
537                         if (rc) {
538                                 log_rdma_recv(ERR,
539                                         "post_recv failed rc=%d\n", rc);
540                                 put_receive_buffer(info, response);
541                                 break;
542                         }
543
544                         ret++;
545                 }
546         }
547
548         spin_lock(&info->lock_new_credits_offered);
549         info->new_credits_offered += ret;
550         spin_unlock(&info->lock_new_credits_offered);
551
552         atomic_add(ret, &info->receive_credits);
553
554         /* Check if we can post new receive and grant credits to peer */
555         check_and_send_immediate(info);
556 }
557
558 static void smbd_recv_done_work(struct work_struct *work)
559 {
560         struct smbd_connection *info =
561                 container_of(work, struct smbd_connection, recv_done_work);
562
563         /*
564          * We may have new send credits granted from remote peer
565          * If any sender is blcoked on lack of credets, unblock it
566          */
567         if (atomic_read(&info->send_credits))
568                 wake_up_interruptible(&info->wait_send_queue);
569
570         /*
571          * Check if we need to send something to remote peer to
572          * grant more credits or respond to KEEP_ALIVE packet
573          */
574         check_and_send_immediate(info);
575 }
576
577 /* Called from softirq, when recv is done */
578 static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
579 {
580         struct smbd_data_transfer *data_transfer;
581         struct smbd_response *response =
582                 container_of(wc->wr_cqe, struct smbd_response, cqe);
583         struct smbd_connection *info = response->info;
584         int data_length = 0;
585
586         log_rdma_recv(INFO, "response=%p type=%d wc status=%d wc opcode %d "
587                       "byte_len=%d pkey_index=%x\n",
588                 response, response->type, wc->status, wc->opcode,
589                 wc->byte_len, wc->pkey_index);
590
591         if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_RECV) {
592                 log_rdma_recv(INFO, "wc->status=%d opcode=%d\n",
593                         wc->status, wc->opcode);
594                 smbd_disconnect_rdma_connection(info);
595                 goto error;
596         }
597
598         ib_dma_sync_single_for_cpu(
599                 wc->qp->device,
600                 response->sge.addr,
601                 response->sge.length,
602                 DMA_FROM_DEVICE);
603
604         switch (response->type) {
605         /* SMBD negotiation response */
606         case SMBD_NEGOTIATE_RESP:
607                 dump_smbd_negotiate_resp(smbd_response_payload(response));
608                 info->full_packet_received = true;
609                 info->negotiate_done =
610                         process_negotiation_response(response, wc->byte_len);
611                 complete(&info->negotiate_completion);
612                 break;
613
614         /* SMBD data transfer packet */
615         case SMBD_TRANSFER_DATA:
616                 data_transfer = smbd_response_payload(response);
617                 data_length = le32_to_cpu(data_transfer->data_length);
618
619                 /*
620                  * If this is a packet with data playload place the data in
621                  * reassembly queue and wake up the reading thread
622                  */
623                 if (data_length) {
624                         if (info->full_packet_received)
625                                 response->first_segment = true;
626
627                         if (le32_to_cpu(data_transfer->remaining_data_length))
628                                 info->full_packet_received = false;
629                         else
630                                 info->full_packet_received = true;
631
632                         enqueue_reassembly(
633                                 info,
634                                 response,
635                                 data_length);
636                 } else
637                         put_empty_packet(info, response);
638
639                 if (data_length)
640                         wake_up_interruptible(&info->wait_reassembly_queue);
641
642                 atomic_dec(&info->receive_credits);
643                 info->receive_credit_target =
644                         le16_to_cpu(data_transfer->credits_requested);
645                 atomic_add(le16_to_cpu(data_transfer->credits_granted),
646                         &info->send_credits);
647
648                 log_incoming(INFO, "data flags %d data_offset %d "
649                         "data_length %d remaining_data_length %d\n",
650                         le16_to_cpu(data_transfer->flags),
651                         le32_to_cpu(data_transfer->data_offset),
652                         le32_to_cpu(data_transfer->data_length),
653                         le32_to_cpu(data_transfer->remaining_data_length));
654
655                 /* Send a KEEP_ALIVE response right away if requested */
656                 info->keep_alive_requested = KEEP_ALIVE_NONE;
657                 if (le16_to_cpu(data_transfer->flags) &
658                                 SMB_DIRECT_RESPONSE_REQUESTED) {
659                         info->keep_alive_requested = KEEP_ALIVE_PENDING;
660                 }
661
662                 queue_work(info->workqueue, &info->recv_done_work);
663                 return;
664
665         default:
666                 log_rdma_recv(ERR,
667                         "unexpected response type=%d\n", response->type);
668         }
669
670 error:
671         put_receive_buffer(info, response);
672 }
673
674 static struct rdma_cm_id *smbd_create_id(
675                 struct smbd_connection *info,
676                 struct sockaddr *dstaddr, int port)
677 {
678         struct rdma_cm_id *id;
679         int rc;
680         __be16 *sport;
681
682         id = rdma_create_id(&init_net, smbd_conn_upcall, info,
683                 RDMA_PS_TCP, IB_QPT_RC);
684         if (IS_ERR(id)) {
685                 rc = PTR_ERR(id);
686                 log_rdma_event(ERR, "rdma_create_id() failed %i\n", rc);
687                 return id;
688         }
689
690         if (dstaddr->sa_family == AF_INET6)
691                 sport = &((struct sockaddr_in6 *)dstaddr)->sin6_port;
692         else
693                 sport = &((struct sockaddr_in *)dstaddr)->sin_port;
694
695         *sport = htons(port);
696
697         init_completion(&info->ri_done);
698         info->ri_rc = -ETIMEDOUT;
699
700         rc = rdma_resolve_addr(id, NULL, (struct sockaddr *)dstaddr,
701                 RDMA_RESOLVE_TIMEOUT);
702         if (rc) {
703                 log_rdma_event(ERR, "rdma_resolve_addr() failed %i\n", rc);
704                 goto out;
705         }
706         wait_for_completion_interruptible_timeout(
707                 &info->ri_done, msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT));
708         rc = info->ri_rc;
709         if (rc) {
710                 log_rdma_event(ERR, "rdma_resolve_addr() completed %i\n", rc);
711                 goto out;
712         }
713
714         info->ri_rc = -ETIMEDOUT;
715         rc = rdma_resolve_route(id, RDMA_RESOLVE_TIMEOUT);
716         if (rc) {
717                 log_rdma_event(ERR, "rdma_resolve_route() failed %i\n", rc);
718                 goto out;
719         }
720         wait_for_completion_interruptible_timeout(
721                 &info->ri_done, msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT));
722         rc = info->ri_rc;
723         if (rc) {
724                 log_rdma_event(ERR, "rdma_resolve_route() completed %i\n", rc);
725                 goto out;
726         }
727
728         return id;
729
730 out:
731         rdma_destroy_id(id);
732         return ERR_PTR(rc);
733 }
734
735 /*
736  * Test if FRWR (Fast Registration Work Requests) is supported on the device
737  * This implementation requries FRWR on RDMA read/write
738  * return value: true if it is supported
739  */
740 static bool frwr_is_supported(struct ib_device_attr *attrs)
741 {
742         if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
743                 return false;
744         if (attrs->max_fast_reg_page_list_len == 0)
745                 return false;
746         return true;
747 }
748
749 static int smbd_ia_open(
750                 struct smbd_connection *info,
751                 struct sockaddr *dstaddr, int port)
752 {
753         int rc;
754
755         info->id = smbd_create_id(info, dstaddr, port);
756         if (IS_ERR(info->id)) {
757                 rc = PTR_ERR(info->id);
758                 goto out1;
759         }
760
761         if (!frwr_is_supported(&info->id->device->attrs)) {
762                 log_rdma_event(ERR,
763                         "Fast Registration Work Requests "
764                         "(FRWR) is not supported\n");
765                 log_rdma_event(ERR,
766                         "Device capability flags = %llx "
767                         "max_fast_reg_page_list_len = %u\n",
768                         info->id->device->attrs.device_cap_flags,
769                         info->id->device->attrs.max_fast_reg_page_list_len);
770                 rc = -EPROTONOSUPPORT;
771                 goto out2;
772         }
773         info->max_frmr_depth = min_t(int,
774                 smbd_max_frmr_depth,
775                 info->id->device->attrs.max_fast_reg_page_list_len);
776         info->mr_type = IB_MR_TYPE_MEM_REG;
777         if (info->id->device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
778                 info->mr_type = IB_MR_TYPE_SG_GAPS;
779
780         info->pd = ib_alloc_pd(info->id->device, 0);
781         if (IS_ERR(info->pd)) {
782                 rc = PTR_ERR(info->pd);
783                 log_rdma_event(ERR, "ib_alloc_pd() returned %d\n", rc);
784                 goto out2;
785         }
786
787         return 0;
788
789 out2:
790         rdma_destroy_id(info->id);
791         info->id = NULL;
792
793 out1:
794         return rc;
795 }
796
797 /*
798  * Send a negotiation request message to the peer
799  * The negotiation procedure is in [MS-SMBD] 3.1.5.2 and 3.1.5.3
800  * After negotiation, the transport is connected and ready for
801  * carrying upper layer SMB payload
802  */
803 static int smbd_post_send_negotiate_req(struct smbd_connection *info)
804 {
805         struct ib_send_wr send_wr;
806         int rc = -ENOMEM;
807         struct smbd_request *request;
808         struct smbd_negotiate_req *packet;
809
810         request = mempool_alloc(info->request_mempool, GFP_KERNEL);
811         if (!request)
812                 return rc;
813
814         request->info = info;
815
816         packet = smbd_request_payload(request);
817         packet->min_version = cpu_to_le16(SMBD_V1);
818         packet->max_version = cpu_to_le16(SMBD_V1);
819         packet->reserved = 0;
820         packet->credits_requested = cpu_to_le16(info->send_credit_target);
821         packet->preferred_send_size = cpu_to_le32(info->max_send_size);
822         packet->max_receive_size = cpu_to_le32(info->max_receive_size);
823         packet->max_fragmented_size =
824                 cpu_to_le32(info->max_fragmented_recv_size);
825
826         request->num_sge = 1;
827         request->sge[0].addr = ib_dma_map_single(
828                                 info->id->device, (void *)packet,
829                                 sizeof(*packet), DMA_TO_DEVICE);
830         if (ib_dma_mapping_error(info->id->device, request->sge[0].addr)) {
831                 rc = -EIO;
832                 goto dma_mapping_failed;
833         }
834
835         request->sge[0].length = sizeof(*packet);
836         request->sge[0].lkey = info->pd->local_dma_lkey;
837
838         ib_dma_sync_single_for_device(
839                 info->id->device, request->sge[0].addr,
840                 request->sge[0].length, DMA_TO_DEVICE);
841
842         request->cqe.done = send_done;
843
844         send_wr.next = NULL;
845         send_wr.wr_cqe = &request->cqe;
846         send_wr.sg_list = request->sge;
847         send_wr.num_sge = request->num_sge;
848         send_wr.opcode = IB_WR_SEND;
849         send_wr.send_flags = IB_SEND_SIGNALED;
850
851         log_rdma_send(INFO, "sge addr=%llx length=%x lkey=%x\n",
852                 request->sge[0].addr,
853                 request->sge[0].length, request->sge[0].lkey);
854
855         request->has_payload = false;
856         atomic_inc(&info->send_pending);
857         rc = ib_post_send(info->id->qp, &send_wr, NULL);
858         if (!rc)
859                 return 0;
860
861         /* if we reach here, post send failed */
862         log_rdma_send(ERR, "ib_post_send failed rc=%d\n", rc);
863         atomic_dec(&info->send_pending);
864         ib_dma_unmap_single(info->id->device, request->sge[0].addr,
865                 request->sge[0].length, DMA_TO_DEVICE);
866
867         smbd_disconnect_rdma_connection(info);
868
869 dma_mapping_failed:
870         mempool_free(request, info->request_mempool);
871         return rc;
872 }
873
874 /*
875  * Extend the credits to remote peer
876  * This implements [MS-SMBD] 3.1.5.9
877  * The idea is that we should extend credits to remote peer as quickly as
878  * it's allowed, to maintain data flow. We allocate as much receive
879  * buffer as possible, and extend the receive credits to remote peer
880  * return value: the new credtis being granted.
881  */
882 static int manage_credits_prior_sending(struct smbd_connection *info)
883 {
884         int new_credits;
885
886         spin_lock(&info->lock_new_credits_offered);
887         new_credits = info->new_credits_offered;
888         info->new_credits_offered = 0;
889         spin_unlock(&info->lock_new_credits_offered);
890
891         return new_credits;
892 }
893
894 /*
895  * Check if we need to send a KEEP_ALIVE message
896  * The idle connection timer triggers a KEEP_ALIVE message when expires
897  * SMB_DIRECT_RESPONSE_REQUESTED is set in the message flag to have peer send
898  * back a response.
899  * return value:
900  * 1 if SMB_DIRECT_RESPONSE_REQUESTED needs to be set
901  * 0: otherwise
902  */
903 static int manage_keep_alive_before_sending(struct smbd_connection *info)
904 {
905         if (info->keep_alive_requested == KEEP_ALIVE_PENDING) {
906                 info->keep_alive_requested = KEEP_ALIVE_SENT;
907                 return 1;
908         }
909         return 0;
910 }
911
912 /*
913  * Build and prepare the SMBD packet header
914  * This function waits for avaialbe send credits and build a SMBD packet
915  * header. The caller then optional append payload to the packet after
916  * the header
917  * intput values
918  * size: the size of the payload
919  * remaining_data_length: remaining data to send if this is part of a
920  * fragmented packet
921  * output values
922  * request_out: the request allocated from this function
923  * return values: 0 on success, otherwise actual error code returned
924  */
925 static int smbd_create_header(struct smbd_connection *info,
926                 int size, int remaining_data_length,
927                 struct smbd_request **request_out)
928 {
929         struct smbd_request *request;
930         struct smbd_data_transfer *packet;
931         int header_length;
932         int rc;
933
934         /* Wait for send credits. A SMBD packet needs one credit */
935         rc = wait_event_interruptible(info->wait_send_queue,
936                 atomic_read(&info->send_credits) > 0 ||
937                 info->transport_status != SMBD_CONNECTED);
938         if (rc)
939                 return rc;
940
941         if (info->transport_status != SMBD_CONNECTED) {
942                 log_outgoing(ERR, "disconnected not sending\n");
943                 return -ENOENT;
944         }
945         atomic_dec(&info->send_credits);
946
947         request = mempool_alloc(info->request_mempool, GFP_KERNEL);
948         if (!request) {
949                 rc = -ENOMEM;
950                 goto err;
951         }
952
953         request->info = info;
954
955         /* Fill in the packet header */
956         packet = smbd_request_payload(request);
957         packet->credits_requested = cpu_to_le16(info->send_credit_target);
958         packet->credits_granted =
959                 cpu_to_le16(manage_credits_prior_sending(info));
960         info->send_immediate = false;
961
962         packet->flags = 0;
963         if (manage_keep_alive_before_sending(info))
964                 packet->flags |= cpu_to_le16(SMB_DIRECT_RESPONSE_REQUESTED);
965
966         packet->reserved = 0;
967         if (!size)
968                 packet->data_offset = 0;
969         else
970                 packet->data_offset = cpu_to_le32(24);
971         packet->data_length = cpu_to_le32(size);
972         packet->remaining_data_length = cpu_to_le32(remaining_data_length);
973         packet->padding = 0;
974
975         log_outgoing(INFO, "credits_requested=%d credits_granted=%d "
976                 "data_offset=%d data_length=%d remaining_data_length=%d\n",
977                 le16_to_cpu(packet->credits_requested),
978                 le16_to_cpu(packet->credits_granted),
979                 le32_to_cpu(packet->data_offset),
980                 le32_to_cpu(packet->data_length),
981                 le32_to_cpu(packet->remaining_data_length));
982
983         /* Map the packet to DMA */
984         header_length = sizeof(struct smbd_data_transfer);
985         /* If this is a packet without payload, don't send padding */
986         if (!size)
987                 header_length = offsetof(struct smbd_data_transfer, padding);
988
989         request->num_sge = 1;
990         request->sge[0].addr = ib_dma_map_single(info->id->device,
991                                                  (void *)packet,
992                                                  header_length,
993                                                  DMA_BIDIRECTIONAL);
994         if (ib_dma_mapping_error(info->id->device, request->sge[0].addr)) {
995                 mempool_free(request, info->request_mempool);
996                 rc = -EIO;
997                 goto err;
998         }
999
1000         request->sge[0].length = header_length;
1001         request->sge[0].lkey = info->pd->local_dma_lkey;
1002
1003         *request_out = request;
1004         return 0;
1005
1006 err:
1007         atomic_inc(&info->send_credits);
1008         return rc;
1009 }
1010
1011 static void smbd_destroy_header(struct smbd_connection *info,
1012                 struct smbd_request *request)
1013 {
1014
1015         ib_dma_unmap_single(info->id->device,
1016                             request->sge[0].addr,
1017                             request->sge[0].length,
1018                             DMA_TO_DEVICE);
1019         mempool_free(request, info->request_mempool);
1020         atomic_inc(&info->send_credits);
1021 }
1022
1023 /* Post the send request */
1024 static int smbd_post_send(struct smbd_connection *info,
1025                 struct smbd_request *request, bool has_payload)
1026 {
1027         struct ib_send_wr send_wr;
1028         int rc, i;
1029
1030         for (i = 0; i < request->num_sge; i++) {
1031                 log_rdma_send(INFO,
1032                         "rdma_request sge[%d] addr=%llu length=%u\n",
1033                         i, request->sge[i].addr, request->sge[i].length);
1034                 ib_dma_sync_single_for_device(
1035                         info->id->device,
1036                         request->sge[i].addr,
1037                         request->sge[i].length,
1038                         DMA_TO_DEVICE);
1039         }
1040
1041         request->cqe.done = send_done;
1042
1043         send_wr.next = NULL;
1044         send_wr.wr_cqe = &request->cqe;
1045         send_wr.sg_list = request->sge;
1046         send_wr.num_sge = request->num_sge;
1047         send_wr.opcode = IB_WR_SEND;
1048         send_wr.send_flags = IB_SEND_SIGNALED;
1049
1050         if (has_payload) {
1051                 request->has_payload = true;
1052                 atomic_inc(&info->send_payload_pending);
1053         } else {
1054                 request->has_payload = false;
1055                 atomic_inc(&info->send_pending);
1056         }
1057
1058         rc = ib_post_send(info->id->qp, &send_wr, NULL);
1059         if (rc) {
1060                 log_rdma_send(ERR, "ib_post_send failed rc=%d\n", rc);
1061                 if (has_payload) {
1062                         if (atomic_dec_and_test(&info->send_payload_pending))
1063                                 wake_up(&info->wait_send_payload_pending);
1064                 } else {
1065                         if (atomic_dec_and_test(&info->send_pending))
1066                                 wake_up(&info->wait_send_pending);
1067                 }
1068                 smbd_disconnect_rdma_connection(info);
1069         } else
1070                 /* Reset timer for idle connection after packet is sent */
1071                 mod_delayed_work(info->workqueue, &info->idle_timer_work,
1072                         info->keep_alive_interval*HZ);
1073
1074         return rc;
1075 }
1076
1077 static int smbd_post_send_sgl(struct smbd_connection *info,
1078         struct scatterlist *sgl, int data_length, int remaining_data_length)
1079 {
1080         int num_sgs;
1081         int i, rc;
1082         struct smbd_request *request;
1083         struct scatterlist *sg;
1084
1085         rc = smbd_create_header(
1086                 info, data_length, remaining_data_length, &request);
1087         if (rc)
1088                 return rc;
1089
1090         num_sgs = sgl ? sg_nents(sgl) : 0;
1091         for_each_sg(sgl, sg, num_sgs, i) {
1092                 request->sge[i+1].addr =
1093                         ib_dma_map_page(info->id->device, sg_page(sg),
1094                                sg->offset, sg->length, DMA_BIDIRECTIONAL);
1095                 if (ib_dma_mapping_error(
1096                                 info->id->device, request->sge[i+1].addr)) {
1097                         rc = -EIO;
1098                         request->sge[i+1].addr = 0;
1099                         goto dma_mapping_failure;
1100                 }
1101                 request->sge[i+1].length = sg->length;
1102                 request->sge[i+1].lkey = info->pd->local_dma_lkey;
1103                 request->num_sge++;
1104         }
1105
1106         rc = smbd_post_send(info, request, data_length);
1107         if (!rc)
1108                 return 0;
1109
1110 dma_mapping_failure:
1111         for (i = 1; i < request->num_sge; i++)
1112                 if (request->sge[i].addr)
1113                         ib_dma_unmap_single(info->id->device,
1114                                             request->sge[i].addr,
1115                                             request->sge[i].length,
1116                                             DMA_TO_DEVICE);
1117         smbd_destroy_header(info, request);
1118         return rc;
1119 }
1120
1121 /*
1122  * Send a page
1123  * page: the page to send
1124  * offset: offset in the page to send
1125  * size: length in the page to send
1126  * remaining_data_length: remaining data to send in this payload
1127  */
1128 static int smbd_post_send_page(struct smbd_connection *info, struct page *page,
1129                 unsigned long offset, size_t size, int remaining_data_length)
1130 {
1131         struct scatterlist sgl;
1132
1133         sg_init_table(&sgl, 1);
1134         sg_set_page(&sgl, page, size, offset);
1135
1136         return smbd_post_send_sgl(info, &sgl, size, remaining_data_length);
1137 }
1138
1139 /*
1140  * Send an empty message
1141  * Empty message is used to extend credits to peer to for keep live
1142  * while there is no upper layer payload to send at the time
1143  */
1144 static int smbd_post_send_empty(struct smbd_connection *info)
1145 {
1146         info->count_send_empty++;
1147         return smbd_post_send_sgl(info, NULL, 0, 0);
1148 }
1149
1150 /*
1151  * Send a data buffer
1152  * iov: the iov array describing the data buffers
1153  * n_vec: number of iov array
1154  * remaining_data_length: remaining data to send following this packet
1155  * in segmented SMBD packet
1156  */
1157 static int smbd_post_send_data(
1158         struct smbd_connection *info, struct kvec *iov, int n_vec,
1159         int remaining_data_length)
1160 {
1161         int i;
1162         u32 data_length = 0;
1163         struct scatterlist sgl[SMBDIRECT_MAX_SGE];
1164
1165         if (n_vec > SMBDIRECT_MAX_SGE) {
1166                 cifs_dbg(VFS, "Can't fit data to SGL, n_vec=%d\n", n_vec);
1167                 return -EINVAL;
1168         }
1169
1170         sg_init_table(sgl, n_vec);
1171         for (i = 0; i < n_vec; i++) {
1172                 data_length += iov[i].iov_len;
1173                 sg_set_buf(&sgl[i], iov[i].iov_base, iov[i].iov_len);
1174         }
1175
1176         return smbd_post_send_sgl(info, sgl, data_length, remaining_data_length);
1177 }
1178
1179 /*
1180  * Post a receive request to the transport
1181  * The remote peer can only send data when a receive request is posted
1182  * The interaction is controlled by send/receive credit system
1183  */
1184 static int smbd_post_recv(
1185                 struct smbd_connection *info, struct smbd_response *response)
1186 {
1187         struct ib_recv_wr recv_wr;
1188         int rc = -EIO;
1189
1190         response->sge.addr = ib_dma_map_single(
1191                                 info->id->device, response->packet,
1192                                 info->max_receive_size, DMA_FROM_DEVICE);
1193         if (ib_dma_mapping_error(info->id->device, response->sge.addr))
1194                 return rc;
1195
1196         response->sge.length = info->max_receive_size;
1197         response->sge.lkey = info->pd->local_dma_lkey;
1198
1199         response->cqe.done = recv_done;
1200
1201         recv_wr.wr_cqe = &response->cqe;
1202         recv_wr.next = NULL;
1203         recv_wr.sg_list = &response->sge;
1204         recv_wr.num_sge = 1;
1205
1206         rc = ib_post_recv(info->id->qp, &recv_wr, NULL);
1207         if (rc) {
1208                 ib_dma_unmap_single(info->id->device, response->sge.addr,
1209                                     response->sge.length, DMA_FROM_DEVICE);
1210                 smbd_disconnect_rdma_connection(info);
1211                 log_rdma_recv(ERR, "ib_post_recv failed rc=%d\n", rc);
1212         }
1213
1214         return rc;
1215 }
1216
1217 /* Perform SMBD negotiate according to [MS-SMBD] 3.1.5.2 */
1218 static int smbd_negotiate(struct smbd_connection *info)
1219 {
1220         int rc;
1221         struct smbd_response *response = get_receive_buffer(info);
1222
1223         response->type = SMBD_NEGOTIATE_RESP;
1224         rc = smbd_post_recv(info, response);
1225         log_rdma_event(INFO,
1226                 "smbd_post_recv rc=%d iov.addr=%llx iov.length=%x "
1227                 "iov.lkey=%x\n",
1228                 rc, response->sge.addr,
1229                 response->sge.length, response->sge.lkey);
1230         if (rc)
1231                 return rc;
1232
1233         init_completion(&info->negotiate_completion);
1234         info->negotiate_done = false;
1235         rc = smbd_post_send_negotiate_req(info);
1236         if (rc)
1237                 return rc;
1238
1239         rc = wait_for_completion_interruptible_timeout(
1240                 &info->negotiate_completion, SMBD_NEGOTIATE_TIMEOUT * HZ);
1241         log_rdma_event(INFO, "wait_for_completion_timeout rc=%d\n", rc);
1242
1243         if (info->negotiate_done)
1244                 return 0;
1245
1246         if (rc == 0)
1247                 rc = -ETIMEDOUT;
1248         else if (rc == -ERESTARTSYS)
1249                 rc = -EINTR;
1250         else
1251                 rc = -ENOTCONN;
1252
1253         return rc;
1254 }
1255
1256 static void put_empty_packet(
1257                 struct smbd_connection *info, struct smbd_response *response)
1258 {
1259         spin_lock(&info->empty_packet_queue_lock);
1260         list_add_tail(&response->list, &info->empty_packet_queue);
1261         info->count_empty_packet_queue++;
1262         spin_unlock(&info->empty_packet_queue_lock);
1263
1264         queue_work(info->workqueue, &info->post_send_credits_work);
1265 }
1266
1267 /*
1268  * Implement Connection.FragmentReassemblyBuffer defined in [MS-SMBD] 3.1.1.1
1269  * This is a queue for reassembling upper layer payload and present to upper
1270  * layer. All the inncoming payload go to the reassembly queue, regardless of
1271  * if reassembly is required. The uuper layer code reads from the queue for all
1272  * incoming payloads.
1273  * Put a received packet to the reassembly queue
1274  * response: the packet received
1275  * data_length: the size of payload in this packet
1276  */
1277 static void enqueue_reassembly(
1278         struct smbd_connection *info,
1279         struct smbd_response *response,
1280         int data_length)
1281 {
1282         spin_lock(&info->reassembly_queue_lock);
1283         list_add_tail(&response->list, &info->reassembly_queue);
1284         info->reassembly_queue_length++;
1285         /*
1286          * Make sure reassembly_data_length is updated after list and
1287          * reassembly_queue_length are updated. On the dequeue side
1288          * reassembly_data_length is checked without a lock to determine
1289          * if reassembly_queue_length and list is up to date
1290          */
1291         virt_wmb();
1292         info->reassembly_data_length += data_length;
1293         spin_unlock(&info->reassembly_queue_lock);
1294         info->count_reassembly_queue++;
1295         info->count_enqueue_reassembly_queue++;
1296 }
1297
1298 /*
1299  * Get the first entry at the front of reassembly queue
1300  * Caller is responsible for locking
1301  * return value: the first entry if any, NULL if queue is empty
1302  */
1303 static struct smbd_response *_get_first_reassembly(struct smbd_connection *info)
1304 {
1305         struct smbd_response *ret = NULL;
1306
1307         if (!list_empty(&info->reassembly_queue)) {
1308                 ret = list_first_entry(
1309                         &info->reassembly_queue,
1310                         struct smbd_response, list);
1311         }
1312         return ret;
1313 }
1314
1315 static struct smbd_response *get_empty_queue_buffer(
1316                 struct smbd_connection *info)
1317 {
1318         struct smbd_response *ret = NULL;
1319         unsigned long flags;
1320
1321         spin_lock_irqsave(&info->empty_packet_queue_lock, flags);
1322         if (!list_empty(&info->empty_packet_queue)) {
1323                 ret = list_first_entry(
1324                         &info->empty_packet_queue,
1325                         struct smbd_response, list);
1326                 list_del(&ret->list);
1327                 info->count_empty_packet_queue--;
1328         }
1329         spin_unlock_irqrestore(&info->empty_packet_queue_lock, flags);
1330
1331         return ret;
1332 }
1333
1334 /*
1335  * Get a receive buffer
1336  * For each remote send, we need to post a receive. The receive buffers are
1337  * pre-allocated in advance.
1338  * return value: the receive buffer, NULL if none is available
1339  */
1340 static struct smbd_response *get_receive_buffer(struct smbd_connection *info)
1341 {
1342         struct smbd_response *ret = NULL;
1343         unsigned long flags;
1344
1345         spin_lock_irqsave(&info->receive_queue_lock, flags);
1346         if (!list_empty(&info->receive_queue)) {
1347                 ret = list_first_entry(
1348                         &info->receive_queue,
1349                         struct smbd_response, list);
1350                 list_del(&ret->list);
1351                 info->count_receive_queue--;
1352                 info->count_get_receive_buffer++;
1353         }
1354         spin_unlock_irqrestore(&info->receive_queue_lock, flags);
1355
1356         return ret;
1357 }
1358
1359 /*
1360  * Return a receive buffer
1361  * Upon returning of a receive buffer, we can post new receive and extend
1362  * more receive credits to remote peer. This is done immediately after a
1363  * receive buffer is returned.
1364  */
1365 static void put_receive_buffer(
1366         struct smbd_connection *info, struct smbd_response *response)
1367 {
1368         unsigned long flags;
1369
1370         ib_dma_unmap_single(info->id->device, response->sge.addr,
1371                 response->sge.length, DMA_FROM_DEVICE);
1372
1373         spin_lock_irqsave(&info->receive_queue_lock, flags);
1374         list_add_tail(&response->list, &info->receive_queue);
1375         info->count_receive_queue++;
1376         info->count_put_receive_buffer++;
1377         spin_unlock_irqrestore(&info->receive_queue_lock, flags);
1378
1379         queue_work(info->workqueue, &info->post_send_credits_work);
1380 }
1381
1382 /* Preallocate all receive buffer on transport establishment */
1383 static int allocate_receive_buffers(struct smbd_connection *info, int num_buf)
1384 {
1385         int i;
1386         struct smbd_response *response;
1387
1388         INIT_LIST_HEAD(&info->reassembly_queue);
1389         spin_lock_init(&info->reassembly_queue_lock);
1390         info->reassembly_data_length = 0;
1391         info->reassembly_queue_length = 0;
1392
1393         INIT_LIST_HEAD(&info->receive_queue);
1394         spin_lock_init(&info->receive_queue_lock);
1395         info->count_receive_queue = 0;
1396
1397         INIT_LIST_HEAD(&info->empty_packet_queue);
1398         spin_lock_init(&info->empty_packet_queue_lock);
1399         info->count_empty_packet_queue = 0;
1400
1401         init_waitqueue_head(&info->wait_receive_queues);
1402
1403         for (i = 0; i < num_buf; i++) {
1404                 response = mempool_alloc(info->response_mempool, GFP_KERNEL);
1405                 if (!response)
1406                         goto allocate_failed;
1407
1408                 response->info = info;
1409                 list_add_tail(&response->list, &info->receive_queue);
1410                 info->count_receive_queue++;
1411         }
1412
1413         return 0;
1414
1415 allocate_failed:
1416         while (!list_empty(&info->receive_queue)) {
1417                 response = list_first_entry(
1418                                 &info->receive_queue,
1419                                 struct smbd_response, list);
1420                 list_del(&response->list);
1421                 info->count_receive_queue--;
1422
1423                 mempool_free(response, info->response_mempool);
1424         }
1425         return -ENOMEM;
1426 }
1427
1428 static void destroy_receive_buffers(struct smbd_connection *info)
1429 {
1430         struct smbd_response *response;
1431
1432         while ((response = get_receive_buffer(info)))
1433                 mempool_free(response, info->response_mempool);
1434
1435         while ((response = get_empty_queue_buffer(info)))
1436                 mempool_free(response, info->response_mempool);
1437 }
1438
1439 /*
1440  * Check and send an immediate or keep alive packet
1441  * The condition to send those packets are defined in [MS-SMBD] 3.1.1.1
1442  * Connection.KeepaliveRequested and Connection.SendImmediate
1443  * The idea is to extend credits to server as soon as it becomes available
1444  */
1445 static void send_immediate_work(struct work_struct *work)
1446 {
1447         struct smbd_connection *info = container_of(
1448                                         work, struct smbd_connection,
1449                                         send_immediate_work.work);
1450
1451         if (info->keep_alive_requested == KEEP_ALIVE_PENDING ||
1452             info->send_immediate) {
1453                 log_keep_alive(INFO, "send an empty message\n");
1454                 smbd_post_send_empty(info);
1455         }
1456 }
1457
1458 /* Implement idle connection timer [MS-SMBD] 3.1.6.2 */
1459 static void idle_connection_timer(struct work_struct *work)
1460 {
1461         struct smbd_connection *info = container_of(
1462                                         work, struct smbd_connection,
1463                                         idle_timer_work.work);
1464
1465         if (info->keep_alive_requested != KEEP_ALIVE_NONE) {
1466                 log_keep_alive(ERR,
1467                         "error status info->keep_alive_requested=%d\n",
1468                         info->keep_alive_requested);
1469                 smbd_disconnect_rdma_connection(info);
1470                 return;
1471         }
1472
1473         log_keep_alive(INFO, "about to send an empty idle message\n");
1474         smbd_post_send_empty(info);
1475
1476         /* Setup the next idle timeout work */
1477         queue_delayed_work(info->workqueue, &info->idle_timer_work,
1478                         info->keep_alive_interval*HZ);
1479 }
1480
1481 /* Destroy this SMBD connection, called from upper layer */
1482 void smbd_destroy(struct smbd_connection *info)
1483 {
1484         log_rdma_event(INFO, "destroying rdma session\n");
1485
1486         /* Kick off the disconnection process */
1487         smbd_disconnect_rdma_connection(info);
1488
1489         log_rdma_event(INFO, "wait for transport being destroyed\n");
1490         wait_event(info->wait_destroy,
1491                 info->transport_status == SMBD_DESTROYED);
1492
1493         destroy_workqueue(info->workqueue);
1494         log_rdma_event(INFO,  "rdma session destroyed\n");
1495         kfree(info);
1496 }
1497
1498 /*
1499  * Reconnect this SMBD connection, called from upper layer
1500  * return value: 0 on success, or actual error code
1501  */
1502 int smbd_reconnect(struct TCP_Server_Info *server)
1503 {
1504         log_rdma_event(INFO, "reconnecting rdma session\n");
1505
1506         if (!server->smbd_conn) {
1507                 log_rdma_event(INFO, "rdma session already destroyed\n");
1508                 goto create_conn;
1509         }
1510
1511         /*
1512          * This is possible if transport is disconnected and we haven't received
1513          * notification from RDMA, but upper layer has detected timeout
1514          */
1515         if (server->smbd_conn->transport_status == SMBD_CONNECTED) {
1516                 log_rdma_event(INFO, "disconnecting transport\n");
1517                 smbd_disconnect_rdma_connection(server->smbd_conn);
1518         }
1519
1520         /* wait until the transport is destroyed */
1521         if (!wait_event_timeout(server->smbd_conn->wait_destroy,
1522                 server->smbd_conn->transport_status == SMBD_DESTROYED, 5*HZ))
1523                 return -EAGAIN;
1524
1525         destroy_workqueue(server->smbd_conn->workqueue);
1526         kfree(server->smbd_conn);
1527
1528 create_conn:
1529         log_rdma_event(INFO, "creating rdma session\n");
1530         server->smbd_conn = smbd_get_connection(
1531                 server, (struct sockaddr *) &server->dstaddr);
1532
1533         if (server->smbd_conn)
1534                 cifs_dbg(VFS, "RDMA transport re-established\n");
1535
1536         return server->smbd_conn ? 0 : -ENOENT;
1537 }
1538
1539 static void destroy_caches_and_workqueue(struct smbd_connection *info)
1540 {
1541         destroy_receive_buffers(info);
1542         destroy_workqueue(info->workqueue);
1543         mempool_destroy(info->response_mempool);
1544         kmem_cache_destroy(info->response_cache);
1545         mempool_destroy(info->request_mempool);
1546         kmem_cache_destroy(info->request_cache);
1547 }
1548
1549 #define MAX_NAME_LEN    80
1550 static int allocate_caches_and_workqueue(struct smbd_connection *info)
1551 {
1552         char name[MAX_NAME_LEN];
1553         int rc;
1554
1555         snprintf(name, MAX_NAME_LEN, "smbd_request_%p", info);
1556         info->request_cache =
1557                 kmem_cache_create(
1558                         name,
1559                         sizeof(struct smbd_request) +
1560                                 sizeof(struct smbd_data_transfer),
1561                         0, SLAB_HWCACHE_ALIGN, NULL);
1562         if (!info->request_cache)
1563                 return -ENOMEM;
1564
1565         info->request_mempool =
1566                 mempool_create(info->send_credit_target, mempool_alloc_slab,
1567                         mempool_free_slab, info->request_cache);
1568         if (!info->request_mempool)
1569                 goto out1;
1570
1571         snprintf(name, MAX_NAME_LEN, "smbd_response_%p", info);
1572         info->response_cache =
1573                 kmem_cache_create(
1574                         name,
1575                         sizeof(struct smbd_response) +
1576                                 info->max_receive_size,
1577                         0, SLAB_HWCACHE_ALIGN, NULL);
1578         if (!info->response_cache)
1579                 goto out2;
1580
1581         info->response_mempool =
1582                 mempool_create(info->receive_credit_max, mempool_alloc_slab,
1583                        mempool_free_slab, info->response_cache);
1584         if (!info->response_mempool)
1585                 goto out3;
1586
1587         snprintf(name, MAX_NAME_LEN, "smbd_%p", info);
1588         info->workqueue = create_workqueue(name);
1589         if (!info->workqueue)
1590                 goto out4;
1591
1592         rc = allocate_receive_buffers(info, info->receive_credit_max);
1593         if (rc) {
1594                 log_rdma_event(ERR, "failed to allocate receive buffers\n");
1595                 goto out5;
1596         }
1597
1598         return 0;
1599
1600 out5:
1601         destroy_workqueue(info->workqueue);
1602 out4:
1603         mempool_destroy(info->response_mempool);
1604 out3:
1605         kmem_cache_destroy(info->response_cache);
1606 out2:
1607         mempool_destroy(info->request_mempool);
1608 out1:
1609         kmem_cache_destroy(info->request_cache);
1610         return -ENOMEM;
1611 }
1612
1613 /* Create a SMBD connection, called by upper layer */
1614 static struct smbd_connection *_smbd_get_connection(
1615         struct TCP_Server_Info *server, struct sockaddr *dstaddr, int port)
1616 {
1617         int rc;
1618         struct smbd_connection *info;
1619         struct rdma_conn_param conn_param;
1620         struct ib_qp_init_attr qp_attr;
1621         struct sockaddr_in *addr_in = (struct sockaddr_in *) dstaddr;
1622         struct ib_port_immutable port_immutable;
1623         u32 ird_ord_hdr[2];
1624
1625         info = kzalloc(sizeof(struct smbd_connection), GFP_KERNEL);
1626         if (!info)
1627                 return NULL;
1628
1629         info->transport_status = SMBD_CONNECTING;
1630         rc = smbd_ia_open(info, dstaddr, port);
1631         if (rc) {
1632                 log_rdma_event(INFO, "smbd_ia_open rc=%d\n", rc);
1633                 goto create_id_failed;
1634         }
1635
1636         if (smbd_send_credit_target > info->id->device->attrs.max_cqe ||
1637             smbd_send_credit_target > info->id->device->attrs.max_qp_wr) {
1638                 log_rdma_event(ERR,
1639                         "consider lowering send_credit_target = %d. "
1640                         "Possible CQE overrun, device "
1641                         "reporting max_cpe %d max_qp_wr %d\n",
1642                         smbd_send_credit_target,
1643                         info->id->device->attrs.max_cqe,
1644                         info->id->device->attrs.max_qp_wr);
1645                 goto config_failed;
1646         }
1647
1648         if (smbd_receive_credit_max > info->id->device->attrs.max_cqe ||
1649             smbd_receive_credit_max > info->id->device->attrs.max_qp_wr) {
1650                 log_rdma_event(ERR,
1651                         "consider lowering receive_credit_max = %d. "
1652                         "Possible CQE overrun, device "
1653                         "reporting max_cpe %d max_qp_wr %d\n",
1654                         smbd_receive_credit_max,
1655                         info->id->device->attrs.max_cqe,
1656                         info->id->device->attrs.max_qp_wr);
1657                 goto config_failed;
1658         }
1659
1660         info->receive_credit_max = smbd_receive_credit_max;
1661         info->send_credit_target = smbd_send_credit_target;
1662         info->max_send_size = smbd_max_send_size;
1663         info->max_fragmented_recv_size = smbd_max_fragmented_recv_size;
1664         info->max_receive_size = smbd_max_receive_size;
1665         info->keep_alive_interval = smbd_keep_alive_interval;
1666
1667         if (info->id->device->attrs.max_send_sge < SMBDIRECT_MAX_SGE) {
1668                 log_rdma_event(ERR,
1669                         "warning: device max_send_sge = %d too small\n",
1670                         info->id->device->attrs.max_send_sge);
1671                 log_rdma_event(ERR, "Queue Pair creation may fail\n");
1672         }
1673         if (info->id->device->attrs.max_recv_sge < SMBDIRECT_MAX_SGE) {
1674                 log_rdma_event(ERR,
1675                         "warning: device max_recv_sge = %d too small\n",
1676                         info->id->device->attrs.max_recv_sge);
1677                 log_rdma_event(ERR, "Queue Pair creation may fail\n");
1678         }
1679
1680         info->send_cq = NULL;
1681         info->recv_cq = NULL;
1682         info->send_cq = ib_alloc_cq(info->id->device, info,
1683                         info->send_credit_target, 0, IB_POLL_SOFTIRQ);
1684         if (IS_ERR(info->send_cq)) {
1685                 info->send_cq = NULL;
1686                 goto alloc_cq_failed;
1687         }
1688
1689         info->recv_cq = ib_alloc_cq(info->id->device, info,
1690                         info->receive_credit_max, 0, IB_POLL_SOFTIRQ);
1691         if (IS_ERR(info->recv_cq)) {
1692                 info->recv_cq = NULL;
1693                 goto alloc_cq_failed;
1694         }
1695
1696         memset(&qp_attr, 0, sizeof(qp_attr));
1697         qp_attr.event_handler = smbd_qp_async_error_upcall;
1698         qp_attr.qp_context = info;
1699         qp_attr.cap.max_send_wr = info->send_credit_target;
1700         qp_attr.cap.max_recv_wr = info->receive_credit_max;
1701         qp_attr.cap.max_send_sge = SMBDIRECT_MAX_SGE;
1702         qp_attr.cap.max_recv_sge = SMBDIRECT_MAX_SGE;
1703         qp_attr.cap.max_inline_data = 0;
1704         qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR;
1705         qp_attr.qp_type = IB_QPT_RC;
1706         qp_attr.send_cq = info->send_cq;
1707         qp_attr.recv_cq = info->recv_cq;
1708         qp_attr.port_num = ~0;
1709
1710         rc = rdma_create_qp(info->id, info->pd, &qp_attr);
1711         if (rc) {
1712                 log_rdma_event(ERR, "rdma_create_qp failed %i\n", rc);
1713                 goto create_qp_failed;
1714         }
1715
1716         memset(&conn_param, 0, sizeof(conn_param));
1717         conn_param.initiator_depth = 0;
1718
1719         conn_param.responder_resources =
1720                 info->id->device->attrs.max_qp_rd_atom
1721                         < SMBD_CM_RESPONDER_RESOURCES ?
1722                 info->id->device->attrs.max_qp_rd_atom :
1723                 SMBD_CM_RESPONDER_RESOURCES;
1724         info->responder_resources = conn_param.responder_resources;
1725         log_rdma_mr(INFO, "responder_resources=%d\n",
1726                 info->responder_resources);
1727
1728         /* Need to send IRD/ORD in private data for iWARP */
1729         info->id->device->get_port_immutable(
1730                 info->id->device, info->id->port_num, &port_immutable);
1731         if (port_immutable.core_cap_flags & RDMA_CORE_PORT_IWARP) {
1732                 ird_ord_hdr[0] = info->responder_resources;
1733                 ird_ord_hdr[1] = 1;
1734                 conn_param.private_data = ird_ord_hdr;
1735                 conn_param.private_data_len = sizeof(ird_ord_hdr);
1736         } else {
1737                 conn_param.private_data = NULL;
1738                 conn_param.private_data_len = 0;
1739         }
1740
1741         conn_param.retry_count = SMBD_CM_RETRY;
1742         conn_param.rnr_retry_count = SMBD_CM_RNR_RETRY;
1743         conn_param.flow_control = 0;
1744         init_waitqueue_head(&info->wait_destroy);
1745
1746         log_rdma_event(INFO, "connecting to IP %pI4 port %d\n",
1747                 &addr_in->sin_addr, port);
1748
1749         init_waitqueue_head(&info->conn_wait);
1750         rc = rdma_connect(info->id, &conn_param);
1751         if (rc) {
1752                 log_rdma_event(ERR, "rdma_connect() failed with %i\n", rc);
1753                 goto rdma_connect_failed;
1754         }
1755
1756         wait_event_interruptible(
1757                 info->conn_wait, info->transport_status != SMBD_CONNECTING);
1758
1759         if (info->transport_status != SMBD_CONNECTED) {
1760                 log_rdma_event(ERR, "rdma_connect failed port=%d\n", port);
1761                 goto rdma_connect_failed;
1762         }
1763
1764         log_rdma_event(INFO, "rdma_connect connected\n");
1765
1766         rc = allocate_caches_and_workqueue(info);
1767         if (rc) {
1768                 log_rdma_event(ERR, "cache allocation failed\n");
1769                 goto allocate_cache_failed;
1770         }
1771
1772         init_waitqueue_head(&info->wait_send_queue);
1773         init_waitqueue_head(&info->wait_reassembly_queue);
1774
1775         INIT_DELAYED_WORK(&info->idle_timer_work, idle_connection_timer);
1776         INIT_DELAYED_WORK(&info->send_immediate_work, send_immediate_work);
1777         queue_delayed_work(info->workqueue, &info->idle_timer_work,
1778                 info->keep_alive_interval*HZ);
1779
1780         init_waitqueue_head(&info->wait_smbd_send_pending);
1781         info->smbd_send_pending = 0;
1782
1783         init_waitqueue_head(&info->wait_smbd_recv_pending);
1784         info->smbd_recv_pending = 0;
1785
1786         init_waitqueue_head(&info->wait_send_pending);
1787         atomic_set(&info->send_pending, 0);
1788
1789         init_waitqueue_head(&info->wait_send_payload_pending);
1790         atomic_set(&info->send_payload_pending, 0);
1791
1792         INIT_WORK(&info->disconnect_work, smbd_disconnect_rdma_work);
1793         INIT_WORK(&info->destroy_work, smbd_destroy_rdma_work);
1794         INIT_WORK(&info->recv_done_work, smbd_recv_done_work);
1795         INIT_WORK(&info->post_send_credits_work, smbd_post_send_credits);
1796         info->new_credits_offered = 0;
1797         spin_lock_init(&info->lock_new_credits_offered);
1798
1799         rc = smbd_negotiate(info);
1800         if (rc) {
1801                 log_rdma_event(ERR, "smbd_negotiate rc=%d\n", rc);
1802                 goto negotiation_failed;
1803         }
1804
1805         rc = allocate_mr_list(info);
1806         if (rc) {
1807                 log_rdma_mr(ERR, "memory registration allocation failed\n");
1808                 goto allocate_mr_failed;
1809         }
1810
1811         return info;
1812
1813 allocate_mr_failed:
1814         /* At this point, need to a full transport shutdown */
1815         smbd_destroy(info);
1816         return NULL;
1817
1818 negotiation_failed:
1819         cancel_delayed_work_sync(&info->idle_timer_work);
1820         destroy_caches_and_workqueue(info);
1821         info->transport_status = SMBD_NEGOTIATE_FAILED;
1822         init_waitqueue_head(&info->conn_wait);
1823         rdma_disconnect(info->id);
1824         wait_event(info->conn_wait,
1825                 info->transport_status == SMBD_DISCONNECTED);
1826
1827 allocate_cache_failed:
1828 rdma_connect_failed:
1829         rdma_destroy_qp(info->id);
1830
1831 create_qp_failed:
1832 alloc_cq_failed:
1833         if (info->send_cq)
1834                 ib_free_cq(info->send_cq);
1835         if (info->recv_cq)
1836                 ib_free_cq(info->recv_cq);
1837
1838 config_failed:
1839         ib_dealloc_pd(info->pd);
1840         rdma_destroy_id(info->id);
1841
1842 create_id_failed:
1843         kfree(info);
1844         return NULL;
1845 }
1846
1847 struct smbd_connection *smbd_get_connection(
1848         struct TCP_Server_Info *server, struct sockaddr *dstaddr)
1849 {
1850         struct smbd_connection *ret;
1851         int port = SMBD_PORT;
1852
1853 try_again:
1854         ret = _smbd_get_connection(server, dstaddr, port);
1855
1856         /* Try SMB_PORT if SMBD_PORT doesn't work */
1857         if (!ret && port == SMBD_PORT) {
1858                 port = SMB_PORT;
1859                 goto try_again;
1860         }
1861         return ret;
1862 }
1863
1864 /*
1865  * Receive data from receive reassembly queue
1866  * All the incoming data packets are placed in reassembly queue
1867  * buf: the buffer to read data into
1868  * size: the length of data to read
1869  * return value: actual data read
1870  * Note: this implementation copies the data from reassebmly queue to receive
1871  * buffers used by upper layer. This is not the optimal code path. A better way
1872  * to do it is to not have upper layer allocate its receive buffers but rather
1873  * borrow the buffer from reassembly queue, and return it after data is
1874  * consumed. But this will require more changes to upper layer code, and also
1875  * need to consider packet boundaries while they still being reassembled.
1876  */
1877 static int smbd_recv_buf(struct smbd_connection *info, char *buf,
1878                 unsigned int size)
1879 {
1880         struct smbd_response *response;
1881         struct smbd_data_transfer *data_transfer;
1882         int to_copy, to_read, data_read, offset;
1883         u32 data_length, remaining_data_length, data_offset;
1884         int rc;
1885
1886 again:
1887         if (info->transport_status != SMBD_CONNECTED) {
1888                 log_read(ERR, "disconnected\n");
1889                 return -ENODEV;
1890         }
1891
1892         /*
1893          * No need to hold the reassembly queue lock all the time as we are
1894          * the only one reading from the front of the queue. The transport
1895          * may add more entries to the back of the queue at the same time
1896          */
1897         log_read(INFO, "size=%d info->reassembly_data_length=%d\n", size,
1898                 info->reassembly_data_length);
1899         if (info->reassembly_data_length >= size) {
1900                 int queue_length;
1901                 int queue_removed = 0;
1902
1903                 /*
1904                  * Need to make sure reassembly_data_length is read before
1905                  * reading reassembly_queue_length and calling
1906                  * _get_first_reassembly. This call is lock free
1907                  * as we never read at the end of the queue which are being
1908                  * updated in SOFTIRQ as more data is received
1909                  */
1910                 virt_rmb();
1911                 queue_length = info->reassembly_queue_length;
1912                 data_read = 0;
1913                 to_read = size;
1914                 offset = info->first_entry_offset;
1915                 while (data_read < size) {
1916                         response = _get_first_reassembly(info);
1917                         data_transfer = smbd_response_payload(response);
1918                         data_length = le32_to_cpu(data_transfer->data_length);
1919                         remaining_data_length =
1920                                 le32_to_cpu(
1921                                         data_transfer->remaining_data_length);
1922                         data_offset = le32_to_cpu(data_transfer->data_offset);
1923
1924                         /*
1925                          * The upper layer expects RFC1002 length at the
1926                          * beginning of the payload. Return it to indicate
1927                          * the total length of the packet. This minimize the
1928                          * change to upper layer packet processing logic. This
1929                          * will be eventually remove when an intermediate
1930                          * transport layer is added
1931                          */
1932                         if (response->first_segment && size == 4) {
1933                                 unsigned int rfc1002_len =
1934                                         data_length + remaining_data_length;
1935                                 *((__be32 *)buf) = cpu_to_be32(rfc1002_len);
1936                                 data_read = 4;
1937                                 response->first_segment = false;
1938                                 log_read(INFO, "returning rfc1002 length %d\n",
1939                                         rfc1002_len);
1940                                 goto read_rfc1002_done;
1941                         }
1942
1943                         to_copy = min_t(int, data_length - offset, to_read);
1944                         memcpy(
1945                                 buf + data_read,
1946                                 (char *)data_transfer + data_offset + offset,
1947                                 to_copy);
1948
1949                         /* move on to the next buffer? */
1950                         if (to_copy == data_length - offset) {
1951                                 queue_length--;
1952                                 /*
1953                                  * No need to lock if we are not at the
1954                                  * end of the queue
1955                                  */
1956                                 if (queue_length)
1957                                         list_del(&response->list);
1958                                 else {
1959                                         spin_lock_irq(
1960                                                 &info->reassembly_queue_lock);
1961                                         list_del(&response->list);
1962                                         spin_unlock_irq(
1963                                                 &info->reassembly_queue_lock);
1964                                 }
1965                                 queue_removed++;
1966                                 info->count_reassembly_queue--;
1967                                 info->count_dequeue_reassembly_queue++;
1968                                 put_receive_buffer(info, response);
1969                                 offset = 0;
1970                                 log_read(INFO, "put_receive_buffer offset=0\n");
1971                         } else
1972                                 offset += to_copy;
1973
1974                         to_read -= to_copy;
1975                         data_read += to_copy;
1976
1977                         log_read(INFO, "_get_first_reassembly memcpy %d bytes "
1978                                 "data_transfer_length-offset=%d after that "
1979                                 "to_read=%d data_read=%d offset=%d\n",
1980                                 to_copy, data_length - offset,
1981                                 to_read, data_read, offset);
1982                 }
1983
1984                 spin_lock_irq(&info->reassembly_queue_lock);
1985                 info->reassembly_data_length -= data_read;
1986                 info->reassembly_queue_length -= queue_removed;
1987                 spin_unlock_irq(&info->reassembly_queue_lock);
1988
1989                 info->first_entry_offset = offset;
1990                 log_read(INFO, "returning to thread data_read=%d "
1991                         "reassembly_data_length=%d first_entry_offset=%d\n",
1992                         data_read, info->reassembly_data_length,
1993                         info->first_entry_offset);
1994 read_rfc1002_done:
1995                 return data_read;
1996         }
1997
1998         log_read(INFO, "wait_event on more data\n");
1999         rc = wait_event_interruptible(
2000                 info->wait_reassembly_queue,
2001                 info->reassembly_data_length >= size ||
2002                         info->transport_status != SMBD_CONNECTED);
2003         /* Don't return any data if interrupted */
2004         if (rc)
2005                 return -ENODEV;
2006
2007         goto again;
2008 }
2009
2010 /*
2011  * Receive a page from receive reassembly queue
2012  * page: the page to read data into
2013  * to_read: the length of data to read
2014  * return value: actual data read
2015  */
2016 static int smbd_recv_page(struct smbd_connection *info,
2017                 struct page *page, unsigned int page_offset,
2018                 unsigned int to_read)
2019 {
2020         int ret;
2021         char *to_address;
2022         void *page_address;
2023
2024         /* make sure we have the page ready for read */
2025         ret = wait_event_interruptible(
2026                 info->wait_reassembly_queue,
2027                 info->reassembly_data_length >= to_read ||
2028                         info->transport_status != SMBD_CONNECTED);
2029         if (ret)
2030                 return ret;
2031
2032         /* now we can read from reassembly queue and not sleep */
2033         page_address = kmap_atomic(page);
2034         to_address = (char *) page_address + page_offset;
2035
2036         log_read(INFO, "reading from page=%p address=%p to_read=%d\n",
2037                 page, to_address, to_read);
2038
2039         ret = smbd_recv_buf(info, to_address, to_read);
2040         kunmap_atomic(page_address);
2041
2042         return ret;
2043 }
2044
2045 /*
2046  * Receive data from transport
2047  * msg: a msghdr point to the buffer, can be ITER_KVEC or ITER_BVEC
2048  * return: total bytes read, or 0. SMB Direct will not do partial read.
2049  */
2050 int smbd_recv(struct smbd_connection *info, struct msghdr *msg)
2051 {
2052         char *buf;
2053         struct page *page;
2054         unsigned int to_read, page_offset;
2055         int rc;
2056
2057         info->smbd_recv_pending++;
2058
2059         switch (msg->msg_iter.type) {
2060         case READ | ITER_KVEC:
2061                 buf = msg->msg_iter.kvec->iov_base;
2062                 to_read = msg->msg_iter.kvec->iov_len;
2063                 rc = smbd_recv_buf(info, buf, to_read);
2064                 break;
2065
2066         case READ | ITER_BVEC:
2067                 page = msg->msg_iter.bvec->bv_page;
2068                 page_offset = msg->msg_iter.bvec->bv_offset;
2069                 to_read = msg->msg_iter.bvec->bv_len;
2070                 rc = smbd_recv_page(info, page, page_offset, to_read);
2071                 break;
2072
2073         default:
2074                 /* It's a bug in upper layer to get there */
2075                 cifs_dbg(VFS, "CIFS: invalid msg type %d\n",
2076                         msg->msg_iter.type);
2077                 rc = -EINVAL;
2078         }
2079
2080         info->smbd_recv_pending--;
2081         wake_up(&info->wait_smbd_recv_pending);
2082
2083         /* SMBDirect will read it all or nothing */
2084         if (rc > 0)
2085                 msg->msg_iter.count = 0;
2086         return rc;
2087 }
2088
2089 /*
2090  * Send data to transport
2091  * Each rqst is transported as a SMBDirect payload
2092  * rqst: the data to write
2093  * return value: 0 if successfully write, otherwise error code
2094  */
2095 int smbd_send(struct TCP_Server_Info *server,
2096         int num_rqst, struct smb_rqst *rqst_array)
2097 {
2098         struct smbd_connection *info = server->smbd_conn;
2099         struct kvec vec;
2100         int nvecs;
2101         int size;
2102         unsigned int buflen, remaining_data_length;
2103         int start, i, j;
2104         int max_iov_size =
2105                 info->max_send_size - sizeof(struct smbd_data_transfer);
2106         struct kvec *iov;
2107         int rc;
2108         struct smb_rqst *rqst;
2109         int rqst_idx;
2110
2111         info->smbd_send_pending++;
2112         if (info->transport_status != SMBD_CONNECTED) {
2113                 rc = -ENODEV;
2114                 goto done;
2115         }
2116
2117         /*
2118          * Add in the page array if there is one. The caller needs to set
2119          * rq_tailsz to PAGE_SIZE when the buffer has multiple pages and
2120          * ends at page boundary
2121          */
2122         remaining_data_length = 0;
2123         for (i = 0; i < num_rqst; i++)
2124                 remaining_data_length += smb_rqst_len(server, &rqst_array[i]);
2125
2126         if (remaining_data_length + sizeof(struct smbd_data_transfer) >
2127                 info->max_fragmented_send_size) {
2128                 log_write(ERR, "payload size %d > max size %d\n",
2129                         remaining_data_length, info->max_fragmented_send_size);
2130                 rc = -EINVAL;
2131                 goto done;
2132         }
2133
2134         rqst_idx = 0;
2135
2136 next_rqst:
2137         rqst = &rqst_array[rqst_idx];
2138         iov = rqst->rq_iov;
2139
2140         cifs_dbg(FYI, "Sending smb (RDMA): idx=%d smb_len=%lu\n",
2141                 rqst_idx, smb_rqst_len(server, rqst));
2142         for (i = 0; i < rqst->rq_nvec; i++)
2143                 dump_smb(iov[i].iov_base, iov[i].iov_len);
2144
2145
2146         log_write(INFO, "rqst_idx=%d nvec=%d rqst->rq_npages=%d rq_pagesz=%d "
2147                 "rq_tailsz=%d buflen=%lu\n",
2148                 rqst_idx, rqst->rq_nvec, rqst->rq_npages, rqst->rq_pagesz,
2149                 rqst->rq_tailsz, smb_rqst_len(server, rqst));
2150
2151         start = i = 0;
2152         buflen = 0;
2153         while (true) {
2154                 buflen += iov[i].iov_len;
2155                 if (buflen > max_iov_size) {
2156                         if (i > start) {
2157                                 remaining_data_length -=
2158                                         (buflen-iov[i].iov_len);
2159                                 log_write(INFO, "sending iov[] from start=%d "
2160                                         "i=%d nvecs=%d "
2161                                         "remaining_data_length=%d\n",
2162                                         start, i, i-start,
2163                                         remaining_data_length);
2164                                 rc = smbd_post_send_data(
2165                                         info, &iov[start], i-start,
2166                                         remaining_data_length);
2167                                 if (rc)
2168                                         goto done;
2169                         } else {
2170                                 /* iov[start] is too big, break it */
2171                                 nvecs = (buflen+max_iov_size-1)/max_iov_size;
2172                                 log_write(INFO, "iov[%d] iov_base=%p buflen=%d"
2173                                         " break to %d vectors\n",
2174                                         start, iov[start].iov_base,
2175                                         buflen, nvecs);
2176                                 for (j = 0; j < nvecs; j++) {
2177                                         vec.iov_base =
2178                                                 (char *)iov[start].iov_base +
2179                                                 j*max_iov_size;
2180                                         vec.iov_len = max_iov_size;
2181                                         if (j == nvecs-1)
2182                                                 vec.iov_len =
2183                                                         buflen -
2184                                                         max_iov_size*(nvecs-1);
2185                                         remaining_data_length -= vec.iov_len;
2186                                         log_write(INFO,
2187                                                 "sending vec j=%d iov_base=%p"
2188                                                 " iov_len=%zu "
2189                                                 "remaining_data_length=%d\n",
2190                                                 j, vec.iov_base, vec.iov_len,
2191                                                 remaining_data_length);
2192                                         rc = smbd_post_send_data(
2193                                                 info, &vec, 1,
2194                                                 remaining_data_length);
2195                                         if (rc)
2196                                                 goto done;
2197                                 }
2198                                 i++;
2199                                 if (i == rqst->rq_nvec)
2200                                         break;
2201                         }
2202                         start = i;
2203                         buflen = 0;
2204                 } else {
2205                         i++;
2206                         if (i == rqst->rq_nvec) {
2207                                 /* send out all remaining vecs */
2208                                 remaining_data_length -= buflen;
2209                                 log_write(INFO,
2210                                         "sending iov[] from start=%d i=%d "
2211                                         "nvecs=%d remaining_data_length=%d\n",
2212                                         start, i, i-start,
2213                                         remaining_data_length);
2214                                 rc = smbd_post_send_data(info, &iov[start],
2215                                         i-start, remaining_data_length);
2216                                 if (rc)
2217                                         goto done;
2218                                 break;
2219                         }
2220                 }
2221                 log_write(INFO, "looping i=%d buflen=%d\n", i, buflen);
2222         }
2223
2224         /* now sending pages if there are any */
2225         for (i = 0; i < rqst->rq_npages; i++) {
2226                 unsigned int offset;
2227
2228                 rqst_page_get_length(rqst, i, &buflen, &offset);
2229                 nvecs = (buflen + max_iov_size - 1) / max_iov_size;
2230                 log_write(INFO, "sending pages buflen=%d nvecs=%d\n",
2231                         buflen, nvecs);
2232                 for (j = 0; j < nvecs; j++) {
2233                         size = max_iov_size;
2234                         if (j == nvecs-1)
2235                                 size = buflen - j*max_iov_size;
2236                         remaining_data_length -= size;
2237                         log_write(INFO, "sending pages i=%d offset=%d size=%d"
2238                                 " remaining_data_length=%d\n",
2239                                 i, j*max_iov_size+offset, size,
2240                                 remaining_data_length);
2241                         rc = smbd_post_send_page(
2242                                 info, rqst->rq_pages[i],
2243                                 j*max_iov_size + offset,
2244                                 size, remaining_data_length);
2245                         if (rc)
2246                                 goto done;
2247                 }
2248         }
2249
2250         rqst_idx++;
2251         if (rqst_idx < num_rqst)
2252                 goto next_rqst;
2253
2254 done:
2255         /*
2256          * As an optimization, we don't wait for individual I/O to finish
2257          * before sending the next one.
2258          * Send them all and wait for pending send count to get to 0
2259          * that means all the I/Os have been out and we are good to return
2260          */
2261
2262         wait_event(info->wait_send_payload_pending,
2263                 atomic_read(&info->send_payload_pending) == 0);
2264
2265         info->smbd_send_pending--;
2266         wake_up(&info->wait_smbd_send_pending);
2267
2268         return rc;
2269 }
2270
2271 static void register_mr_done(struct ib_cq *cq, struct ib_wc *wc)
2272 {
2273         struct smbd_mr *mr;
2274         struct ib_cqe *cqe;
2275
2276         if (wc->status) {
2277                 log_rdma_mr(ERR, "status=%d\n", wc->status);
2278                 cqe = wc->wr_cqe;
2279                 mr = container_of(cqe, struct smbd_mr, cqe);
2280                 smbd_disconnect_rdma_connection(mr->conn);
2281         }
2282 }
2283
2284 /*
2285  * The work queue function that recovers MRs
2286  * We need to call ib_dereg_mr() and ib_alloc_mr() before this MR can be used
2287  * again. Both calls are slow, so finish them in a workqueue. This will not
2288  * block I/O path.
2289  * There is one workqueue that recovers MRs, there is no need to lock as the
2290  * I/O requests calling smbd_register_mr will never update the links in the
2291  * mr_list.
2292  */
2293 static void smbd_mr_recovery_work(struct work_struct *work)
2294 {
2295         struct smbd_connection *info =
2296                 container_of(work, struct smbd_connection, mr_recovery_work);
2297         struct smbd_mr *smbdirect_mr;
2298         int rc;
2299
2300         list_for_each_entry(smbdirect_mr, &info->mr_list, list) {
2301                 if (smbdirect_mr->state == MR_INVALIDATED ||
2302                         smbdirect_mr->state == MR_ERROR) {
2303
2304                         /* recover this MR entry */
2305                         rc = ib_dereg_mr(smbdirect_mr->mr);
2306                         if (rc) {
2307                                 log_rdma_mr(ERR,
2308                                         "ib_dereg_mr failed rc=%x\n",
2309                                         rc);
2310                                 smbd_disconnect_rdma_connection(info);
2311                                 continue;
2312                         }
2313
2314                         smbdirect_mr->mr = ib_alloc_mr(
2315                                 info->pd, info->mr_type,
2316                                 info->max_frmr_depth);
2317                         if (IS_ERR(smbdirect_mr->mr)) {
2318                                 log_rdma_mr(ERR,
2319                                         "ib_alloc_mr failed mr_type=%x "
2320                                         "max_frmr_depth=%x\n",
2321                                         info->mr_type,
2322                                         info->max_frmr_depth);
2323                                 smbd_disconnect_rdma_connection(info);
2324                                 continue;
2325                         }
2326
2327                         if (smbdirect_mr->state == MR_INVALIDATED)
2328                                 ib_dma_unmap_sg(
2329                                         info->id->device, smbdirect_mr->sgl,
2330                                         smbdirect_mr->sgl_count,
2331                                         smbdirect_mr->dir);
2332
2333                         smbdirect_mr->state = MR_READY;
2334
2335                         /* smbdirect_mr->state is updated by this function
2336                          * and is read and updated by I/O issuing CPUs trying
2337                          * to get a MR, the call to atomic_inc_return
2338                          * implicates a memory barrier and guarantees this
2339                          * value is updated before waking up any calls to
2340                          * get_mr() from the I/O issuing CPUs
2341                          */
2342                         if (atomic_inc_return(&info->mr_ready_count) == 1)
2343                                 wake_up_interruptible(&info->wait_mr);
2344                 }
2345         }
2346 }
2347
2348 static void destroy_mr_list(struct smbd_connection *info)
2349 {
2350         struct smbd_mr *mr, *tmp;
2351
2352         cancel_work_sync(&info->mr_recovery_work);
2353         list_for_each_entry_safe(mr, tmp, &info->mr_list, list) {
2354                 if (mr->state == MR_INVALIDATED)
2355                         ib_dma_unmap_sg(info->id->device, mr->sgl,
2356                                 mr->sgl_count, mr->dir);
2357                 ib_dereg_mr(mr->mr);
2358                 kfree(mr->sgl);
2359                 kfree(mr);
2360         }
2361 }
2362
2363 /*
2364  * Allocate MRs used for RDMA read/write
2365  * The number of MRs will not exceed hardware capability in responder_resources
2366  * All MRs are kept in mr_list. The MR can be recovered after it's used
2367  * Recovery is done in smbd_mr_recovery_work. The content of list entry changes
2368  * as MRs are used and recovered for I/O, but the list links will not change
2369  */
2370 static int allocate_mr_list(struct smbd_connection *info)
2371 {
2372         int i;
2373         struct smbd_mr *smbdirect_mr, *tmp;
2374
2375         INIT_LIST_HEAD(&info->mr_list);
2376         init_waitqueue_head(&info->wait_mr);
2377         spin_lock_init(&info->mr_list_lock);
2378         atomic_set(&info->mr_ready_count, 0);
2379         atomic_set(&info->mr_used_count, 0);
2380         init_waitqueue_head(&info->wait_for_mr_cleanup);
2381         /* Allocate more MRs (2x) than hardware responder_resources */
2382         for (i = 0; i < info->responder_resources * 2; i++) {
2383                 smbdirect_mr = kzalloc(sizeof(*smbdirect_mr), GFP_KERNEL);
2384                 if (!smbdirect_mr)
2385                         goto out;
2386                 smbdirect_mr->mr = ib_alloc_mr(info->pd, info->mr_type,
2387                                         info->max_frmr_depth);
2388                 if (IS_ERR(smbdirect_mr->mr)) {
2389                         log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x "
2390                                 "max_frmr_depth=%x\n",
2391                                 info->mr_type, info->max_frmr_depth);
2392                         goto out;
2393                 }
2394                 smbdirect_mr->sgl = kcalloc(
2395                                         info->max_frmr_depth,
2396                                         sizeof(struct scatterlist),
2397                                         GFP_KERNEL);
2398                 if (!smbdirect_mr->sgl) {
2399                         log_rdma_mr(ERR, "failed to allocate sgl\n");
2400                         ib_dereg_mr(smbdirect_mr->mr);
2401                         goto out;
2402                 }
2403                 smbdirect_mr->state = MR_READY;
2404                 smbdirect_mr->conn = info;
2405
2406                 list_add_tail(&smbdirect_mr->list, &info->mr_list);
2407                 atomic_inc(&info->mr_ready_count);
2408         }
2409         INIT_WORK(&info->mr_recovery_work, smbd_mr_recovery_work);
2410         return 0;
2411
2412 out:
2413         kfree(smbdirect_mr);
2414
2415         list_for_each_entry_safe(smbdirect_mr, tmp, &info->mr_list, list) {
2416                 ib_dereg_mr(smbdirect_mr->mr);
2417                 kfree(smbdirect_mr->sgl);
2418                 kfree(smbdirect_mr);
2419         }
2420         return -ENOMEM;
2421 }
2422
2423 /*
2424  * Get a MR from mr_list. This function waits until there is at least one
2425  * MR available in the list. It may access the list while the
2426  * smbd_mr_recovery_work is recovering the MR list. This doesn't need a lock
2427  * as they never modify the same places. However, there may be several CPUs
2428  * issueing I/O trying to get MR at the same time, mr_list_lock is used to
2429  * protect this situation.
2430  */
2431 static struct smbd_mr *get_mr(struct smbd_connection *info)
2432 {
2433         struct smbd_mr *ret;
2434         int rc;
2435 again:
2436         rc = wait_event_interruptible(info->wait_mr,
2437                 atomic_read(&info->mr_ready_count) ||
2438                 info->transport_status != SMBD_CONNECTED);
2439         if (rc) {
2440                 log_rdma_mr(ERR, "wait_event_interruptible rc=%x\n", rc);
2441                 return NULL;
2442         }
2443
2444         if (info->transport_status != SMBD_CONNECTED) {
2445                 log_rdma_mr(ERR, "info->transport_status=%x\n",
2446                         info->transport_status);
2447                 return NULL;
2448         }
2449
2450         spin_lock(&info->mr_list_lock);
2451         list_for_each_entry(ret, &info->mr_list, list) {
2452                 if (ret->state == MR_READY) {
2453                         ret->state = MR_REGISTERED;
2454                         spin_unlock(&info->mr_list_lock);
2455                         atomic_dec(&info->mr_ready_count);
2456                         atomic_inc(&info->mr_used_count);
2457                         return ret;
2458                 }
2459         }
2460
2461         spin_unlock(&info->mr_list_lock);
2462         /*
2463          * It is possible that we could fail to get MR because other processes may
2464          * try to acquire a MR at the same time. If this is the case, retry it.
2465          */
2466         goto again;
2467 }
2468
2469 /*
2470  * Register memory for RDMA read/write
2471  * pages[]: the list of pages to register memory with
2472  * num_pages: the number of pages to register
2473  * tailsz: if non-zero, the bytes to register in the last page
2474  * writing: true if this is a RDMA write (SMB read), false for RDMA read
2475  * need_invalidate: true if this MR needs to be locally invalidated after I/O
2476  * return value: the MR registered, NULL if failed.
2477  */
2478 struct smbd_mr *smbd_register_mr(
2479         struct smbd_connection *info, struct page *pages[], int num_pages,
2480         int offset, int tailsz, bool writing, bool need_invalidate)
2481 {
2482         struct smbd_mr *smbdirect_mr;
2483         int rc, i;
2484         enum dma_data_direction dir;
2485         struct ib_reg_wr *reg_wr;
2486
2487         if (num_pages > info->max_frmr_depth) {
2488                 log_rdma_mr(ERR, "num_pages=%d max_frmr_depth=%d\n",
2489                         num_pages, info->max_frmr_depth);
2490                 return NULL;
2491         }
2492
2493         smbdirect_mr = get_mr(info);
2494         if (!smbdirect_mr) {
2495                 log_rdma_mr(ERR, "get_mr returning NULL\n");
2496                 return NULL;
2497         }
2498         smbdirect_mr->need_invalidate = need_invalidate;
2499         smbdirect_mr->sgl_count = num_pages;
2500         sg_init_table(smbdirect_mr->sgl, num_pages);
2501
2502         log_rdma_mr(INFO, "num_pages=0x%x offset=0x%x tailsz=0x%x\n",
2503                         num_pages, offset, tailsz);
2504
2505         if (num_pages == 1) {
2506                 sg_set_page(&smbdirect_mr->sgl[0], pages[0], tailsz, offset);
2507                 goto skip_multiple_pages;
2508         }
2509
2510         /* We have at least two pages to register */
2511         sg_set_page(
2512                 &smbdirect_mr->sgl[0], pages[0], PAGE_SIZE - offset, offset);
2513         i = 1;
2514         while (i < num_pages - 1) {
2515                 sg_set_page(&smbdirect_mr->sgl[i], pages[i], PAGE_SIZE, 0);
2516                 i++;
2517         }
2518         sg_set_page(&smbdirect_mr->sgl[i], pages[i],
2519                 tailsz ? tailsz : PAGE_SIZE, 0);
2520
2521 skip_multiple_pages:
2522         dir = writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
2523         smbdirect_mr->dir = dir;
2524         rc = ib_dma_map_sg(info->id->device, smbdirect_mr->sgl, num_pages, dir);
2525         if (!rc) {
2526                 log_rdma_mr(ERR, "ib_dma_map_sg num_pages=%x dir=%x rc=%x\n",
2527                         num_pages, dir, rc);
2528                 goto dma_map_error;
2529         }
2530
2531         rc = ib_map_mr_sg(smbdirect_mr->mr, smbdirect_mr->sgl, num_pages,
2532                 NULL, PAGE_SIZE);
2533         if (rc != num_pages) {
2534                 log_rdma_mr(ERR,
2535                         "ib_map_mr_sg failed rc = %d num_pages = %x\n",
2536                         rc, num_pages);
2537                 goto map_mr_error;
2538         }
2539
2540         ib_update_fast_reg_key(smbdirect_mr->mr,
2541                 ib_inc_rkey(smbdirect_mr->mr->rkey));
2542         reg_wr = &smbdirect_mr->wr;
2543         reg_wr->wr.opcode = IB_WR_REG_MR;
2544         smbdirect_mr->cqe.done = register_mr_done;
2545         reg_wr->wr.wr_cqe = &smbdirect_mr->cqe;
2546         reg_wr->wr.num_sge = 0;
2547         reg_wr->wr.send_flags = IB_SEND_SIGNALED;
2548         reg_wr->mr = smbdirect_mr->mr;
2549         reg_wr->key = smbdirect_mr->mr->rkey;
2550         reg_wr->access = writing ?
2551                         IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE :
2552                         IB_ACCESS_REMOTE_READ;
2553
2554         /*
2555          * There is no need for waiting for complemtion on ib_post_send
2556          * on IB_WR_REG_MR. Hardware enforces a barrier and order of execution
2557          * on the next ib_post_send when we actaully send I/O to remote peer
2558          */
2559         rc = ib_post_send(info->id->qp, &reg_wr->wr, NULL);
2560         if (!rc)
2561                 return smbdirect_mr;
2562
2563         log_rdma_mr(ERR, "ib_post_send failed rc=%x reg_wr->key=%x\n",
2564                 rc, reg_wr->key);
2565
2566         /* If all failed, attempt to recover this MR by setting it MR_ERROR*/
2567 map_mr_error:
2568         ib_dma_unmap_sg(info->id->device, smbdirect_mr->sgl,
2569                 smbdirect_mr->sgl_count, smbdirect_mr->dir);
2570
2571 dma_map_error:
2572         smbdirect_mr->state = MR_ERROR;
2573         if (atomic_dec_and_test(&info->mr_used_count))
2574                 wake_up(&info->wait_for_mr_cleanup);
2575
2576         smbd_disconnect_rdma_connection(info);
2577
2578         return NULL;
2579 }
2580
2581 static void local_inv_done(struct ib_cq *cq, struct ib_wc *wc)
2582 {
2583         struct smbd_mr *smbdirect_mr;
2584         struct ib_cqe *cqe;
2585
2586         cqe = wc->wr_cqe;
2587         smbdirect_mr = container_of(cqe, struct smbd_mr, cqe);
2588         smbdirect_mr->state = MR_INVALIDATED;
2589         if (wc->status != IB_WC_SUCCESS) {
2590                 log_rdma_mr(ERR, "invalidate failed status=%x\n", wc->status);
2591                 smbdirect_mr->state = MR_ERROR;
2592         }
2593         complete(&smbdirect_mr->invalidate_done);
2594 }
2595
2596 /*
2597  * Deregister a MR after I/O is done
2598  * This function may wait if remote invalidation is not used
2599  * and we have to locally invalidate the buffer to prevent data is being
2600  * modified by remote peer after upper layer consumes it
2601  */
2602 int smbd_deregister_mr(struct smbd_mr *smbdirect_mr)
2603 {
2604         struct ib_send_wr *wr;
2605         struct smbd_connection *info = smbdirect_mr->conn;
2606         int rc = 0;
2607
2608         if (smbdirect_mr->need_invalidate) {
2609                 /* Need to finish local invalidation before returning */
2610                 wr = &smbdirect_mr->inv_wr;
2611                 wr->opcode = IB_WR_LOCAL_INV;
2612                 smbdirect_mr->cqe.done = local_inv_done;
2613                 wr->wr_cqe = &smbdirect_mr->cqe;
2614                 wr->num_sge = 0;
2615                 wr->ex.invalidate_rkey = smbdirect_mr->mr->rkey;
2616                 wr->send_flags = IB_SEND_SIGNALED;
2617
2618                 init_completion(&smbdirect_mr->invalidate_done);
2619                 rc = ib_post_send(info->id->qp, wr, NULL);
2620                 if (rc) {
2621                         log_rdma_mr(ERR, "ib_post_send failed rc=%x\n", rc);
2622                         smbd_disconnect_rdma_connection(info);
2623                         goto done;
2624                 }
2625                 wait_for_completion(&smbdirect_mr->invalidate_done);
2626                 smbdirect_mr->need_invalidate = false;
2627         } else
2628                 /*
2629                  * For remote invalidation, just set it to MR_INVALIDATED
2630                  * and defer to mr_recovery_work to recover the MR for next use
2631                  */
2632                 smbdirect_mr->state = MR_INVALIDATED;
2633
2634         /*
2635          * Schedule the work to do MR recovery for future I/Os
2636          * MR recovery is slow and we don't want it to block the current I/O
2637          */
2638         queue_work(info->workqueue, &info->mr_recovery_work);
2639
2640 done:
2641         if (atomic_dec_and_test(&info->mr_used_count))
2642                 wake_up(&info->wait_for_mr_cleanup);
2643
2644         return rc;
2645 }