* [bug report] RDMA/hns: Optimize cmd init and mode selection for hip08
@ 2021-07-28 11:43 Dan Carpenter
2021-07-29 1:28 ` Wenpeng Liang
0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2021-07-28 11:43 UTC (permalink / raw)
To: liuyixian; +Cc: linux-rdma
Hello Yixian Liu,
The patch 3d50503b3b33: "RDMA/hns: Optimize cmd init and mode
selection for hip08" from Aug 29, 2019, leads to the following static
checker warning:
drivers/infiniband/hw/hns/hns_roce_main.c:926 hns_roce_init()
error: double unlocked '&hr_dev->cmd.poll_sem' (orig line 879)
drivers/infiniband/hw/hns/hns_roce_main.c
833 int hns_roce_init(struct hns_roce_dev *hr_dev)
834 {
835 struct device *dev = hr_dev->dev;
836 int ret;
837
838 if (hr_dev->hw->reset) {
839 ret = hr_dev->hw->reset(hr_dev, true);
840 if (ret) {
841 dev_err(dev, "Reset RoCE engine failed!\n");
842 return ret;
843 }
844 }
845 hr_dev->is_reset = false;
846
847 if (hr_dev->hw->cmq_init) {
848 ret = hr_dev->hw->cmq_init(hr_dev);
849 if (ret) {
850 dev_err(dev, "Init RoCE Command Queue failed!\n");
851 goto error_failed_cmq_init;
852 }
853 }
854
855 ret = hr_dev->hw->hw_profile(hr_dev);
856 if (ret) {
857 dev_err(dev, "Get RoCE engine profile failed!\n");
858 goto error_failed_cmd_init;
859 }
860
861 ret = hns_roce_cmd_init(hr_dev);
862 if (ret) {
863 dev_err(dev, "cmd init failed!\n");
864 goto error_failed_cmd_init;
865 }
866
867 /* EQ depends on poll mode, event mode depends on EQ */
868 ret = hr_dev->hw->init_eq(hr_dev);
869 if (ret) {
870 dev_err(dev, "eq init failed!\n");
871 goto error_failed_eq_table;
872 }
873
874 if (hr_dev->cmd_mod) {
875 ret = hns_roce_cmd_use_events(hr_dev);
If hns_roce_cmd_use_events() fails then that means we haven't taken the
semaphore.
876 if (ret) {
877 dev_warn(dev,
878 "Cmd event mode failed, set back to poll!\n");
879 hns_roce_cmd_use_polling(hr_dev);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This releases a semaphore but we are not holding it.
880 }
881 }
882
883 ret = hns_roce_init_hem(hr_dev);
884 if (ret) {
885 dev_err(dev, "init HEM(Hardware Entry Memory) failed!\n");
886 goto error_failed_init_hem;
^^^^^^^^^^^^^^^^^^^^^^^^^^
Let's assume we hit this goto
887 }
888
889 ret = hns_roce_setup_hca(hr_dev);
890 if (ret) {
891 dev_err(dev, "setup hca failed!\n");
892 goto error_failed_setup_hca;
893 }
894
895 if (hr_dev->hw->hw_init) {
896 ret = hr_dev->hw->hw_init(hr_dev);
897 if (ret) {
898 dev_err(dev, "hw_init failed!\n");
899 goto error_failed_engine_init;
900 }
901 }
902
903 INIT_LIST_HEAD(&hr_dev->qp_list);
904 spin_lock_init(&hr_dev->qp_list_lock);
905 INIT_LIST_HEAD(&hr_dev->dip_list);
906 spin_lock_init(&hr_dev->dip_list_lock);
907
908 ret = hns_roce_register_device(hr_dev);
909 if (ret)
910 goto error_failed_register_device;
911
912 return 0;
913
914 error_failed_register_device:
915 if (hr_dev->hw->hw_exit)
916 hr_dev->hw->hw_exit(hr_dev);
917
918 error_failed_engine_init:
919 hns_roce_cleanup_bitmap(hr_dev);
920
921 error_failed_setup_hca:
922 hns_roce_cleanup_hem(hr_dev);
923
924 error_failed_init_hem:
925 if (hr_dev->cmd_mod)
--> 926 hns_roce_cmd_use_polling(hr_dev);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This will release the semaphore a second time again.
927 hr_dev->hw->cleanup_eq(hr_dev);
928
929 error_failed_eq_table:
930 hns_roce_cmd_cleanup(hr_dev);
931
932 error_failed_cmd_init:
933 if (hr_dev->hw->cmq_exit)
934 hr_dev->hw->cmq_exit(hr_dev);
935
936 error_failed_cmq_init:
937 if (hr_dev->hw->reset) {
938 if (hr_dev->hw->reset(hr_dev, false))
939 dev_err(dev, "Dereset RoCE engine failed!\n");
940 }
941
942 return ret;
943 }
regards,
dan carpenter
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [bug report] RDMA/hns: Optimize cmd init and mode selection for hip08
2021-07-28 11:43 [bug report] RDMA/hns: Optimize cmd init and mode selection for hip08 Dan Carpenter
@ 2021-07-29 1:28 ` Wenpeng Liang
0 siblings, 0 replies; 2+ messages in thread
From: Wenpeng Liang @ 2021-07-29 1:28 UTC (permalink / raw)
To: Dan Carpenter, liuyixian; +Cc: linux-rdma
On 2021/7/28 19:43, Dan Carpenter wrote:
> Hello Yixian Liu,
>
> The patch 3d50503b3b33: "RDMA/hns: Optimize cmd init and mode
> selection for hip08" from Aug 29, 2019, leads to the following static
> checker warning:
>
> drivers/infiniband/hw/hns/hns_roce_main.c:926 hns_roce_init()
> error: double unlocked '&hr_dev->cmd.poll_sem' (orig line 879)
>
> drivers/infiniband/hw/hns/hns_roce_main.c
> 833 int hns_roce_init(struct hns_roce_dev *hr_dev)
> 834 {
> 835 struct device *dev = hr_dev->dev;
> 836 int ret;
> 837
> 838 if (hr_dev->hw->reset) {
> 839 ret = hr_dev->hw->reset(hr_dev, true);
> 840 if (ret) {
> 841 dev_err(dev, "Reset RoCE engine failed!\n");
> 842 return ret;
> 843 }
> 844 }
> 845 hr_dev->is_reset = false;
> 846
> 847 if (hr_dev->hw->cmq_init) {
> 848 ret = hr_dev->hw->cmq_init(hr_dev);
> 849 if (ret) {
> 850 dev_err(dev, "Init RoCE Command Queue failed!\n");
> 851 goto error_failed_cmq_init;
> 852 }
> 853 }
> 854
> 855 ret = hr_dev->hw->hw_profile(hr_dev);
> 856 if (ret) {
> 857 dev_err(dev, "Get RoCE engine profile failed!\n");
> 858 goto error_failed_cmd_init;
> 859 }
> 860
> 861 ret = hns_roce_cmd_init(hr_dev);
> 862 if (ret) {
> 863 dev_err(dev, "cmd init failed!\n");
> 864 goto error_failed_cmd_init;
> 865 }
> 866
> 867 /* EQ depends on poll mode, event mode depends on EQ */
> 868 ret = hr_dev->hw->init_eq(hr_dev);
> 869 if (ret) {
> 870 dev_err(dev, "eq init failed!\n");
> 871 goto error_failed_eq_table;
> 872 }
> 873
> 874 if (hr_dev->cmd_mod) {
> 875 ret = hns_roce_cmd_use_events(hr_dev);
>
> If hns_roce_cmd_use_events() fails then that means we haven't taken the
> semaphore.
>
> 876 if (ret) {
> 877 dev_warn(dev,
> 878 "Cmd event mode failed, set back to poll!\n");
> 879 hns_roce_cmd_use_polling(hr_dev);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> This releases a semaphore but we are not holding it.
>
>
> 880 }
> 881 }
> 882
> 883 ret = hns_roce_init_hem(hr_dev);
> 884 if (ret) {
> 885 dev_err(dev, "init HEM(Hardware Entry Memory) failed!\n");
> 886 goto error_failed_init_hem;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^
> Let's assume we hit this goto
>
> 887 }
> 888
> 889 ret = hns_roce_setup_hca(hr_dev);
> 890 if (ret) {
> 891 dev_err(dev, "setup hca failed!\n");
> 892 goto error_failed_setup_hca;
> 893 }
> 894
> 895 if (hr_dev->hw->hw_init) {
> 896 ret = hr_dev->hw->hw_init(hr_dev);
> 897 if (ret) {
> 898 dev_err(dev, "hw_init failed!\n");
> 899 goto error_failed_engine_init;
> 900 }
> 901 }
> 902
> 903 INIT_LIST_HEAD(&hr_dev->qp_list);
> 904 spin_lock_init(&hr_dev->qp_list_lock);
> 905 INIT_LIST_HEAD(&hr_dev->dip_list);
> 906 spin_lock_init(&hr_dev->dip_list_lock);
> 907
> 908 ret = hns_roce_register_device(hr_dev);
> 909 if (ret)
> 910 goto error_failed_register_device;
> 911
> 912 return 0;
> 913
> 914 error_failed_register_device:
> 915 if (hr_dev->hw->hw_exit)
> 916 hr_dev->hw->hw_exit(hr_dev);
> 917
> 918 error_failed_engine_init:
> 919 hns_roce_cleanup_bitmap(hr_dev);
> 920
> 921 error_failed_setup_hca:
> 922 hns_roce_cleanup_hem(hr_dev);
> 923
> 924 error_failed_init_hem:
> 925 if (hr_dev->cmd_mod)
> --> 926 hns_roce_cmd_use_polling(hr_dev);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> This will release the semaphore a second time again.
>
> 927 hr_dev->hw->cleanup_eq(hr_dev);
> 928
> 929 error_failed_eq_table:
> 930 hns_roce_cmd_cleanup(hr_dev);
> 931
> 932 error_failed_cmd_init:
> 933 if (hr_dev->hw->cmq_exit)
> 934 hr_dev->hw->cmq_exit(hr_dev);
> 935
> 936 error_failed_cmq_init:
> 937 if (hr_dev->hw->reset) {
> 938 if (hr_dev->hw->reset(hr_dev, false))
> 939 dev_err(dev, "Dereset RoCE engine failed!\n");
> 940 }
> 941
> 942 return ret;
> 943 }
>
> regards,
> dan carpenter
> .
>
Thank you for reporting this bug and I will submit a patch to fix it
as soon as possible.
regards,
Wenpeng Liang
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-07-29 1:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-28 11:43 [bug report] RDMA/hns: Optimize cmd init and mode selection for hip08 Dan Carpenter
2021-07-29 1:28 ` Wenpeng Liang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).