1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Devmem TCP 4 * 5 * Authors: Mina Almasry <almasrymina@google.com> 6 * Willem de Bruijn <willemdebruijn.kernel@gmail.com> 7 * Kaiyuan Zhang <kaiyuanz@google.com 8 */ 9 10 #include <linux/dma-buf.h> 11 #include <linux/mm.h> 12 #include <linux/netdevice.h> 13 #include <linux/types.h> 14 #include <net/netdev_queues.h> 15 #include <net/netdev_rx_queue.h> 16 #include <net/page_pool/helpers.h> 17 #include <net/page_pool/memory_provider.h> 18 #include <net/sock.h> 19 #include <net/tcp.h> 20 21 #include "devmem.h" 22 #include "mp_dmabuf_devmem.h" 23 24 /* Device memory support */ 25 26 static DEFINE_XARRAY_FLAGS(net_devmem_dmabuf_bindings, XA_FLAGS_ALLOC1); 27 28 static const struct memory_provider_ops dmabuf_devmem_ops; 29 30 static struct net_iov *net_iov_free_pop(struct net_iov_area *area, 31 u32 *freelist, u32 *free_count) 32 { 33 u32 idx; 34 35 if (unlikely(!*free_count)) 36 return NULL; 37 38 idx = freelist[--(*free_count)]; 39 return &area->niovs[idx]; 40 } 41 42 static void net_iov_free_push(struct net_iov_area *area, 43 u32 *freelist, u32 *free_count, 44 struct net_iov *niov) 45 { 46 if (WARN_ON_ONCE(net_iov_owner(niov) != area || 47 *free_count >= area->num_niovs)) 48 return; 49 50 freelist[(*free_count)++] = net_iov_idx(niov); 51 } 52 53 static void net_devmem_dmabuf_binding_release(struct percpu_ref *ref) 54 { 55 struct net_devmem_dmabuf_binding *binding = 56 container_of(ref, struct net_devmem_dmabuf_binding, ref); 57 58 INIT_WORK(&binding->unbind_w, __net_devmem_dmabuf_binding_free); 59 schedule_work(&binding->unbind_w); 60 } 61 62 void __net_devmem_dmabuf_binding_free(struct work_struct *wq) 63 { 64 struct net_devmem_dmabuf_binding *binding = container_of(wq, typeof(*binding), unbind_w); 65 66 if (binding->freelist) 67 WARN(binding->free_count != binding->area.num_niovs, 68 "destroying dmabuf binding with outstanding net_iovs: total=%zu, free=%u", 69 binding->area.num_niovs, binding->free_count); 70 71 kvfree(binding->area.niovs); 72 dma_buf_unmap_attachment_unlocked(binding->attachment, binding->sgt, 73 binding->direction); 74 dma_buf_detach(binding->dmabuf, binding->attachment); 75 dma_buf_put(binding->dmabuf); 76 xa_destroy(&binding->bound_rxqs); 77 percpu_ref_exit(&binding->ref); 78 kvfree(binding->freelist); 79 kvfree(binding->tx_vec); 80 kfree(binding); 81 } 82 83 static unsigned int 84 net_devmem_alloc_dmabuf_bulk(struct net_devmem_dmabuf_binding *binding, 85 netmem_ref *netmems, unsigned int count) 86 { 87 struct net_iov *niov; 88 unsigned int i; 89 90 spin_lock_bh(&binding->freelist_lock); 91 92 count = min(count, binding->free_count); 93 for (i = 0; i < count; i++) { 94 niov = net_iov_free_pop(&binding->area, binding->freelist, 95 &binding->free_count); 96 netmems[i] = net_iov_to_netmem(niov); 97 } 98 99 spin_unlock_bh(&binding->freelist_lock); 100 101 return count; 102 } 103 104 void net_devmem_free_dmabuf(struct net_iov *niov) 105 { 106 struct net_devmem_dmabuf_binding *binding = net_devmem_iov_binding(niov); 107 108 spin_lock_bh(&binding->freelist_lock); 109 net_iov_free_push(&binding->area, binding->freelist, 110 &binding->free_count, niov); 111 spin_unlock_bh(&binding->freelist_lock); 112 } 113 114 void net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding) 115 { 116 struct netdev_rx_queue *rxq; 117 unsigned long xa_idx; 118 unsigned int rxq_idx; 119 120 xa_erase(&net_devmem_dmabuf_bindings, binding->id); 121 122 /* Ensure no tx net_devmem_lookup_dmabuf() are in flight after the 123 * erase. 124 */ 125 synchronize_net(); 126 127 if (binding->list.next) 128 list_del(&binding->list); 129 130 xa_for_each(&binding->bound_rxqs, xa_idx, rxq) { 131 const struct pp_memory_provider_params mp_params = { 132 .mp_priv = binding, 133 .mp_ops = &dmabuf_devmem_ops, 134 }; 135 136 rxq_idx = get_netdev_rx_queue_index(rxq); 137 138 netif_mp_close_rxq(binding->dev, rxq_idx, &mp_params); 139 } 140 141 percpu_ref_kill(&binding->ref); 142 } 143 144 int net_devmem_bind_dmabuf_to_queue(struct net_device *dev, u32 rxq_idx, 145 struct net_devmem_dmabuf_binding *binding, 146 struct netlink_ext_ack *extack) 147 { 148 struct pp_memory_provider_params mp_params = { 149 .mp_priv = binding, 150 .mp_ops = &dmabuf_devmem_ops, 151 }; 152 struct netdev_rx_queue *rxq; 153 u32 xa_idx; 154 int err; 155 156 if (binding->niov_shift != PAGE_SHIFT) 157 mp_params.rx_page_size = 1U << binding->niov_shift; 158 159 err = netif_mp_open_rxq(dev, rxq_idx, &mp_params, extack); 160 if (err) 161 return err; 162 163 rxq = __netif_get_rx_queue(dev, rxq_idx); 164 err = xa_alloc(&binding->bound_rxqs, &xa_idx, rxq, xa_limit_32b, 165 GFP_KERNEL); 166 if (err) 167 goto err_close_rxq; 168 169 return 0; 170 171 err_close_rxq: 172 netif_mp_close_rxq(dev, rxq_idx, &mp_params); 173 return err; 174 } 175 176 struct net_devmem_dmabuf_binding * 177 net_devmem_bind_dmabuf(struct net_device *dev, void *vdev, 178 struct device *dma_dev, 179 enum dma_data_direction direction, 180 unsigned int dmabuf_fd, unsigned int niov_shift, 181 struct netdev_nl_sock *priv, 182 const struct sock *nl_sk, 183 struct netlink_ext_ack *extack) 184 { 185 struct net_devmem_dmabuf_binding *binding; 186 size_t niov_size = 1UL << niov_shift; 187 static u32 id_alloc_next; 188 struct scatterlist *sg; 189 struct dma_buf *dmabuf; 190 unsigned int sg_idx; 191 size_t niov_idx; 192 size_t i; 193 int err; 194 195 if (!dma_dev) { 196 NL_SET_ERR_MSG(extack, "Device doesn't support DMA"); 197 return ERR_PTR(-EOPNOTSUPP); 198 } 199 200 dmabuf = dma_buf_get(dmabuf_fd); 201 if (IS_ERR(dmabuf)) 202 return ERR_CAST(dmabuf); 203 204 binding = kzalloc_node(sizeof(*binding), GFP_KERNEL, 205 dev_to_node(&dev->dev)); 206 if (!binding) { 207 err = -ENOMEM; 208 goto err_put_dmabuf; 209 } 210 211 binding->dev = dev; 212 binding->vdev = vdev; 213 write_pnet(&binding->net, sock_net(nl_sk)); 214 binding->uid = sk_uid(nl_sk); 215 binding->niov_shift = niov_shift; 216 xa_init_flags(&binding->bound_rxqs, XA_FLAGS_ALLOC); 217 218 err = percpu_ref_init(&binding->ref, 219 net_devmem_dmabuf_binding_release, 220 0, GFP_KERNEL); 221 if (err < 0) 222 goto err_free_binding; 223 224 mutex_init(&binding->lock); 225 226 binding->dmabuf = dmabuf; 227 binding->direction = direction; 228 229 binding->attachment = dma_buf_attach(binding->dmabuf, dma_dev); 230 if (IS_ERR(binding->attachment)) { 231 err = PTR_ERR(binding->attachment); 232 NL_SET_ERR_MSG(extack, "Failed to bind dmabuf to device"); 233 goto err_exit_ref; 234 } 235 236 binding->sgt = dma_buf_map_attachment_unlocked(binding->attachment, 237 direction); 238 if (IS_ERR(binding->sgt)) { 239 err = PTR_ERR(binding->sgt); 240 NL_SET_ERR_MSG(extack, "Failed to map dmabuf attachment"); 241 goto err_detach; 242 } 243 244 if (!IS_ALIGNED(dmabuf->size, niov_size)) { 245 err = -EINVAL; 246 NL_SET_ERR_MSG_FMT(extack, 247 "dmabuf size %zu not aligned to niov size %zu", 248 dmabuf->size, niov_size); 249 goto err_unmap; 250 } 251 252 if ((dmabuf->size >> niov_shift) > U32_MAX) { 253 err = -E2BIG; 254 NL_SET_ERR_MSG(extack, "dmabuf contains too many net_iovs"); 255 goto err_unmap; 256 } 257 258 binding->area.num_niovs = dmabuf->size >> niov_shift; 259 if (direction == DMA_TO_DEVICE) { 260 binding->tx_vec = kvmalloc_objs(struct net_iov *, 261 binding->area.num_niovs); 262 if (!binding->tx_vec) { 263 err = -ENOMEM; 264 goto err_unmap; 265 } 266 } else { 267 spin_lock_init(&binding->freelist_lock); 268 binding->freelist = kvmalloc_array(binding->area.num_niovs, 269 sizeof(binding->freelist[0]), 270 GFP_KERNEL); 271 if (!binding->freelist) { 272 err = -ENOMEM; 273 goto err_unmap; 274 } 275 } 276 binding->area.niovs = kvzalloc_objs(*binding->area.niovs, 277 binding->area.num_niovs); 278 if (!binding->area.niovs) { 279 err = -ENOMEM; 280 goto err_free_freelist; 281 } 282 283 niov_idx = 0; 284 for_each_sgtable_dma_sg(binding->sgt, sg, sg_idx) { 285 dma_addr_t dma_addr = sg_dma_address(sg); 286 size_t len = sg_dma_len(sg); 287 struct net_iov *niov; 288 size_t nr_niovs; 289 290 if (!IS_ALIGNED(dma_addr, niov_size) || 291 !IS_ALIGNED(len, niov_size)) { 292 err = -EINVAL; 293 NL_SET_ERR_MSG_FMT(extack, 294 "dmabuf sg entry (addr=%pad, len=%zu) not aligned to niov size %zu", 295 &dma_addr, len, niov_size); 296 goto err_free_niovs; 297 } 298 299 nr_niovs = len >> niov_shift; 300 for (i = 0; i < nr_niovs; i++, niov_idx++) { 301 niov = &binding->area.niovs[niov_idx]; 302 net_iov_init(niov, &binding->area, NET_IOV_DMABUF); 303 if (net_mp_niov_set_dma_addr(niov, dma_addr)) { 304 err = -EFAULT; 305 NL_SET_ERR_MSG(extack, 306 "dmabuf DMA address cannot be represented"); 307 goto err_free_niovs; 308 } 309 if (direction == DMA_TO_DEVICE) 310 binding->tx_vec[niov_idx] = niov; 311 else 312 net_iov_free_push(&binding->area, 313 binding->freelist, 314 &binding->free_count, niov); 315 dma_addr += niov_size; 316 } 317 } 318 319 err = xa_alloc_cyclic(&net_devmem_dmabuf_bindings, &binding->id, 320 binding, xa_limit_32b, &id_alloc_next, 321 GFP_KERNEL); 322 if (err < 0) 323 goto err_free_niovs; 324 325 list_add(&binding->list, &priv->bindings); 326 327 return binding; 328 329 err_free_niovs: 330 kvfree(binding->area.niovs); 331 err_free_freelist: 332 kvfree(binding->freelist); 333 kvfree(binding->tx_vec); 334 err_unmap: 335 dma_buf_unmap_attachment_unlocked(binding->attachment, binding->sgt, 336 direction); 337 err_detach: 338 dma_buf_detach(dmabuf, binding->attachment); 339 err_exit_ref: 340 percpu_ref_exit(&binding->ref); 341 err_free_binding: 342 kfree(binding); 343 err_put_dmabuf: 344 dma_buf_put(dmabuf); 345 return ERR_PTR(err); 346 } 347 348 struct net_devmem_dmabuf_binding *net_devmem_lookup_dmabuf(u32 id) 349 { 350 struct net_devmem_dmabuf_binding *binding; 351 352 rcu_read_lock(); 353 binding = xa_load(&net_devmem_dmabuf_bindings, id); 354 if (binding) { 355 if (!net_devmem_dmabuf_binding_get(binding)) 356 binding = NULL; 357 } 358 rcu_read_unlock(); 359 360 return binding; 361 } 362 363 void net_devmem_get_net_iov(struct net_iov *niov) 364 { 365 net_devmem_dmabuf_binding_get(net_devmem_iov_binding(niov)); 366 } 367 368 void net_devmem_put_net_iov(struct net_iov *niov) 369 { 370 net_devmem_dmabuf_binding_put(net_devmem_iov_binding(niov)); 371 } 372 373 struct net_devmem_dmabuf_binding *net_devmem_get_binding(struct sock *sk, 374 unsigned int dmabuf_id) 375 { 376 struct net_devmem_dmabuf_binding *binding; 377 struct net_device *dst_dev; 378 struct dst_entry *dst; 379 int err = 0; 380 381 binding = net_devmem_lookup_dmabuf(dmabuf_id); 382 if (!binding || !binding->tx_vec || 383 !net_eq(sock_net(sk), read_pnet(&binding->net)) || 384 !uid_eq(sk_uid(sk), binding->uid)) { 385 err = -EINVAL; 386 goto out_err; 387 } 388 389 rcu_read_lock(); 390 dst = __sk_dst_get(sk); 391 /* If dst is NULL (route expired), attempt to rebuild it. */ 392 if (unlikely(!dst)) { 393 if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) { 394 err = -EHOSTUNREACH; 395 goto out_unlock; 396 } 397 dst = __sk_dst_get(sk); 398 if (unlikely(!dst)) { 399 err = -ENODEV; 400 goto out_unlock; 401 } 402 } 403 404 /* The dma-addrs in this binding are only reachable to the corresponding 405 * net_device. 406 */ 407 dst_dev = dst_dev_rcu(dst); 408 if (unlikely(!dst_dev) || 409 unlikely(dst_dev != READ_ONCE(binding->dev) && 410 dst_dev != READ_ONCE(binding->vdev))) { 411 err = -ENODEV; 412 goto out_unlock; 413 } 414 415 rcu_read_unlock(); 416 return binding; 417 418 out_unlock: 419 rcu_read_unlock(); 420 out_err: 421 if (binding) 422 net_devmem_dmabuf_binding_put(binding); 423 424 return ERR_PTR(err); 425 } 426 427 struct net_iov * 428 net_devmem_get_niov_at(struct net_devmem_dmabuf_binding *binding, 429 size_t virt_addr, size_t *off, size_t *size) 430 { 431 if (virt_addr >= binding->dmabuf->size) 432 return NULL; 433 434 *off = virt_addr % PAGE_SIZE; 435 *size = PAGE_SIZE - *off; 436 437 return binding->tx_vec[virt_addr / PAGE_SIZE]; 438 } 439 440 /*** "Dmabuf devmem memory provider" ***/ 441 442 int mp_dmabuf_devmem_init(struct page_pool *pool) 443 { 444 struct net_devmem_dmabuf_binding *binding = pool->mp_priv; 445 446 if (!binding) 447 return -EINVAL; 448 449 /* dma-buf dma addresses do not need and should not be used with 450 * dma_sync_for_cpu/device. Force disable dma_sync. 451 */ 452 pool->dma_sync = false; 453 pool->dma_sync_for_cpu = false; 454 455 if (pool->p.order != binding->niov_shift - PAGE_SHIFT) 456 return -E2BIG; 457 458 net_devmem_dmabuf_binding_get(binding); 459 return 0; 460 } 461 462 netmem_ref mp_dmabuf_devmem_alloc_netmems(struct page_pool *pool, gfp_t gfp) 463 { 464 struct net_devmem_dmabuf_binding *binding = pool->mp_priv; 465 netmem_ref *netmems = pool->alloc.cache; 466 unsigned int allocated, i; 467 468 if (WARN_ON_ONCE(pool->alloc.count)) 469 return 0; 470 471 allocated = net_devmem_alloc_dmabuf_bulk(binding, netmems, 472 PP_ALLOC_CACHE_REFILL); 473 if (unlikely(!allocated)) 474 return 0; 475 476 for (i = 0; i < allocated; i++) 477 net_mp_niov_set_page_pool(pool, 478 netmem_to_net_iov(netmems[i])); 479 480 /* Return the last one, the rest stay in the page_pool cache. */ 481 allocated--; 482 pool->alloc.count = allocated; 483 return netmems[allocated]; 484 } 485 486 void mp_dmabuf_devmem_destroy(struct page_pool *pool) 487 { 488 struct net_devmem_dmabuf_binding *binding = pool->mp_priv; 489 490 net_devmem_dmabuf_binding_put(binding); 491 } 492 493 bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem) 494 { 495 long refcount = atomic_long_read(netmem_get_pp_ref_count_ref(netmem)); 496 497 if (WARN_ON_ONCE(!netmem_is_net_iov(netmem))) 498 return false; 499 500 if (WARN_ON_ONCE(refcount != 1)) 501 return false; 502 503 net_mp_niov_clear_page_pool(netmem_to_net_iov(netmem)); 504 net_devmem_free_dmabuf(netmem_to_net_iov(netmem)); 505 506 /* We don't want the page pool put_page()ing our net_iovs. */ 507 return false; 508 } 509 510 static int mp_dmabuf_devmem_nl_fill(void *mp_priv, struct sk_buff *rsp, 511 struct netdev_rx_queue *rxq) 512 { 513 const struct net_devmem_dmabuf_binding *binding = mp_priv; 514 int type = rxq ? NETDEV_A_QUEUE_DMABUF : NETDEV_A_PAGE_POOL_DMABUF; 515 516 return nla_put_u32(rsp, type, binding->id); 517 } 518 519 static void mp_dmabuf_devmem_uninstall(void *mp_priv, 520 struct netdev_rx_queue *rxq) 521 { 522 struct net_devmem_dmabuf_binding *binding = mp_priv; 523 struct netdev_rx_queue *bound_rxq; 524 unsigned long xa_idx; 525 526 xa_for_each(&binding->bound_rxqs, xa_idx, bound_rxq) { 527 if (bound_rxq == rxq) { 528 xa_erase(&binding->bound_rxqs, xa_idx); 529 if (xa_empty(&binding->bound_rxqs)) { 530 mutex_lock(&binding->lock); 531 ASSERT_EXCLUSIVE_WRITER(binding->dev); 532 WRITE_ONCE(binding->dev, NULL); 533 mutex_unlock(&binding->lock); 534 } 535 break; 536 } 537 } 538 } 539 540 static const struct memory_provider_ops dmabuf_devmem_ops = { 541 .init = mp_dmabuf_devmem_init, 542 .destroy = mp_dmabuf_devmem_destroy, 543 .alloc_netmems = mp_dmabuf_devmem_alloc_netmems, 544 .release_netmem = mp_dmabuf_devmem_release_page, 545 .nl_fill = mp_dmabuf_devmem_nl_fill, 546 .uninstall = mp_dmabuf_devmem_uninstall, 547 }; 548