aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/cache.c
diff options
context:
space:
mode:
authorParav Pandit <parav@mellanox.com>2018-05-02 06:12:56 -0400
committerDoug Ledford <dledford@redhat.com>2018-05-09 12:08:21 -0400
commitbe0e8f34b66c47fb9bf65858d0cd4b145d1e47b1 (patch)
treeeef4dcfc1889bd58383f372ff5f44dcb598072b1 /drivers/infiniband/core/cache.c
parent25a1cd3fe551bfeffc12d6ef1aafb2f2ef5e54f6 (diff)
IB/core: Reuse gid_table_release_one() in table allocation failure
_gid_table_setup_one() only performs GID table cache memory allocation, marks entries as invalid (free) and marks the reserved entries. At this point GID table is empty and no entries are added. On dual port device if _gid_table_setup_one() fails to allocate the gid table for 2nd port, there is no need to perform cleanup_gid_table_port() to delete GID entries, as GID table is empty. Therefore make use of existing gid_table_release_one() routine which frees the GID table memory and avoid code duplication. Reviewed-by: Daniel Jurgens <danielj@mellanox.com> Signed-off-by: Parav Pandit <parav@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/core/cache.c')
-rw-r--r--drivers/infiniband/core/cache.c42
1 files changed, 16 insertions, 26 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index 140fd351764d..f0887f29da97 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -778,50 +778,40 @@ static void gid_table_reserve_default(struct ib_device *ib_dev, u8 port,
778 } 778 }
779} 779}
780 780
781
782static void gid_table_release_one(struct ib_device *ib_dev)
783{
784 struct ib_gid_table *table;
785 u8 port;
786
787 for (port = 0; port < ib_dev->phys_port_cnt; port++) {
788 table = ib_dev->cache.ports[port].gid;
789 release_gid_table(table);
790 ib_dev->cache.ports[port].gid = NULL;
791 }
792}
793
781static int _gid_table_setup_one(struct ib_device *ib_dev) 794static int _gid_table_setup_one(struct ib_device *ib_dev)
782{ 795{
783 u8 port; 796 u8 port;
784 struct ib_gid_table *table; 797 struct ib_gid_table *table;
785 int err = 0;
786 798
787 for (port = 0; port < ib_dev->phys_port_cnt; port++) { 799 for (port = 0; port < ib_dev->phys_port_cnt; port++) {
788 u8 rdma_port = port + rdma_start_port(ib_dev); 800 u8 rdma_port = port + rdma_start_port(ib_dev);
789 801
790 table = alloc_gid_table( 802 table = alloc_gid_table(
791 ib_dev->port_immutable[rdma_port].gid_tbl_len); 803 ib_dev->port_immutable[rdma_port].gid_tbl_len);
792 if (!table) { 804 if (!table)
793 err = -ENOMEM;
794 goto rollback_table_setup; 805 goto rollback_table_setup;
795 }
796 806
797 gid_table_reserve_default(ib_dev, rdma_port, table); 807 gid_table_reserve_default(ib_dev, rdma_port, table);
798 ib_dev->cache.ports[port].gid = table; 808 ib_dev->cache.ports[port].gid = table;
799 } 809 }
800
801 return 0; 810 return 0;
802 811
803rollback_table_setup: 812rollback_table_setup:
804 for (port = 0; port < ib_dev->phys_port_cnt; port++) { 813 gid_table_release_one(ib_dev);
805 table = ib_dev->cache.ports[port].gid; 814 return -ENOMEM;
806
807 cleanup_gid_table_port(ib_dev, port + rdma_start_port(ib_dev),
808 table);
809 release_gid_table(table);
810 }
811
812 return err;
813}
814
815static void gid_table_release_one(struct ib_device *ib_dev)
816{
817 struct ib_gid_table *table;
818 u8 port;
819
820 for (port = 0; port < ib_dev->phys_port_cnt; port++) {
821 table = ib_dev->cache.ports[port].gid;
822 release_gid_table(table);
823 ib_dev->cache.ports[port].gid = NULL;
824 }
825} 815}
826 816
827static void gid_table_cleanup_one(struct ib_device *ib_dev) 817static void gid_table_cleanup_one(struct ib_device *ib_dev)