hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/infiniband/core/verbs.c
....@@ -535,6 +535,8 @@
535535
536536 ret = device->ops.create_ah(ah, &init_attr, udata);
537537 if (ret) {
538
+ if (ah->sgid_attr)
539
+ rdma_put_gid_attr(ah->sgid_attr);
538540 kfree(ah);
539541 return ERR_PTR(ret);
540542 }
....@@ -2911,15 +2913,18 @@
29112913 bool __rdma_block_iter_next(struct ib_block_iter *biter)
29122914 {
29132915 unsigned int block_offset;
2916
+ unsigned int sg_delta;
29142917
29152918 if (!biter->__sg_nents || !biter->__sg)
29162919 return false;
29172920
29182921 biter->__dma_addr = sg_dma_address(biter->__sg) + biter->__sg_advance;
29192922 block_offset = biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1);
2920
- biter->__sg_advance += BIT_ULL(biter->__pg_bit) - block_offset;
2923
+ sg_delta = BIT_ULL(biter->__pg_bit) - block_offset;
29212924
2922
- if (biter->__sg_advance >= sg_dma_len(biter->__sg)) {
2925
+ if (sg_dma_len(biter->__sg) - biter->__sg_advance > sg_delta) {
2926
+ biter->__sg_advance += sg_delta;
2927
+ } else {
29232928 biter->__sg_advance = 0;
29242929 biter->__sg = sg_next(biter->__sg);
29252930 biter->__sg_nents--;