summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2017-06-05 05:05:07 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-06-06 11:13:43 -0400
commitfe868356339182f0aa21a4424f5ef08229f8ebd6 (patch)
tree2eb8f340e882adb278bc352ecac0af75120ab6af /drivers
parentd4fcf90047fcf5f576801b8c1cfbca5b9ac44844 (diff)
gpu: nvgpu: fix resource leak
We pass (struct device_attribute *) to gp10b_ecc_stat_create() and gr_gp10b_ecc_stat_create() and then assign a memory allocation to this pointer But since this pointer is local copy to function, static pointer variables are never set in gr_gp10b_create_sysfs() This also results in a resource leak since we never free the storage assigned to local variable Fix this by adding correct parameter (struct device_attribute **) so that the address of the allocation is returned to the caller correctly Bug 200291879 Coverity id : 2567934 Change-Id: I7ac79810d9e22a568ae3cd1a69eb3f59a8d356ac Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1495905 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Sachin Nikam <snikam@nvidia.com> Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.c37
-rw-r--r--drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.h4
2 files changed, 22 insertions, 19 deletions
diff --git a/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.c b/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.c
index a2878c8b..b7cbf56e 100644
--- a/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.c
+++ b/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.c
@@ -518,7 +518,7 @@ int gr_gp10b_ecc_stat_create(struct device *dev,
518 int is_l2, 518 int is_l2,
519 char *ecc_stat_name, 519 char *ecc_stat_name,
520 struct gk20a_ecc_stat *ecc_stat, 520 struct gk20a_ecc_stat *ecc_stat,
521 struct device_attribute *dev_attr_array) 521 struct device_attribute **dev_attr_array)
522{ 522{
523 struct gk20a *g = get_gk20a(dev); 523 struct gk20a *g = get_gk20a(dev);
524 char *ltc_unit_name = "ltc"; 524 char *ltc_unit_name = "ltc";
@@ -543,12 +543,13 @@ int gp10b_ecc_stat_create(struct device *dev,
543 char *ecc_unit_name, 543 char *ecc_unit_name,
544 char *ecc_stat_name, 544 char *ecc_stat_name,
545 struct gk20a_ecc_stat *ecc_stat, 545 struct gk20a_ecc_stat *ecc_stat,
546 struct device_attribute *dev_attr_array) 546 struct device_attribute **__dev_attr_array)
547{ 547{
548 int error = 0; 548 int error = 0;
549 struct gk20a *g = get_gk20a(dev); 549 struct gk20a *g = get_gk20a(dev);
550 int hw_unit = 0; 550 int hw_unit = 0;
551 u32 hash_key = 0; 551 u32 hash_key = 0;
552 struct device_attribute *dev_attr_array;
552 553
553 /* Allocate arrays */ 554 /* Allocate arrays */
554 dev_attr_array = nvgpu_kzalloc(g, sizeof(struct device_attribute) * 555 dev_attr_array = nvgpu_kzalloc(g, sizeof(struct device_attribute) *
@@ -585,6 +586,8 @@ int gp10b_ecc_stat_create(struct device *dev,
585 &ecc_stat->hash_node, 586 &ecc_stat->hash_node,
586 hash_key); 587 hash_key);
587 588
589 *__dev_attr_array = dev_attr_array;
590
588 return error; 591 return error;
589} 592}
590 593
@@ -645,80 +648,80 @@ void gr_gp10b_create_sysfs(struct device *dev)
645 0, 648 0,
646 "sm_lrf_ecc_single_err_count", 649 "sm_lrf_ecc_single_err_count",
647 &g->ecc.gr.t18x.sm_lrf_single_err_count, 650 &g->ecc.gr.t18x.sm_lrf_single_err_count,
648 dev_attr_sm_lrf_ecc_single_err_count_array); 651 &dev_attr_sm_lrf_ecc_single_err_count_array);
649 error |= gr_gp10b_ecc_stat_create(dev, 652 error |= gr_gp10b_ecc_stat_create(dev,
650 0, 653 0,
651 "sm_lrf_ecc_double_err_count", 654 "sm_lrf_ecc_double_err_count",
652 &g->ecc.gr.t18x.sm_lrf_double_err_count, 655 &g->ecc.gr.t18x.sm_lrf_double_err_count,
653 dev_attr_sm_lrf_ecc_double_err_count_array); 656 &dev_attr_sm_lrf_ecc_double_err_count_array);
654 657
655 error |= gr_gp10b_ecc_stat_create(dev, 658 error |= gr_gp10b_ecc_stat_create(dev,
656 0, 659 0,
657 "sm_shm_ecc_sec_count", 660 "sm_shm_ecc_sec_count",
658 &g->ecc.gr.t18x.sm_shm_sec_count, 661 &g->ecc.gr.t18x.sm_shm_sec_count,
659 dev_attr_sm_shm_ecc_sec_count_array); 662 &dev_attr_sm_shm_ecc_sec_count_array);
660 error |= gr_gp10b_ecc_stat_create(dev, 663 error |= gr_gp10b_ecc_stat_create(dev,
661 0, 664 0,
662 "sm_shm_ecc_sed_count", 665 "sm_shm_ecc_sed_count",
663 &g->ecc.gr.t18x.sm_shm_sed_count, 666 &g->ecc.gr.t18x.sm_shm_sed_count,
664 dev_attr_sm_shm_ecc_sed_count_array); 667 &dev_attr_sm_shm_ecc_sed_count_array);
665 error |= gr_gp10b_ecc_stat_create(dev, 668 error |= gr_gp10b_ecc_stat_create(dev,
666 0, 669 0,
667 "sm_shm_ecc_ded_count", 670 "sm_shm_ecc_ded_count",
668 &g->ecc.gr.t18x.sm_shm_ded_count, 671 &g->ecc.gr.t18x.sm_shm_ded_count,
669 dev_attr_sm_shm_ecc_ded_count_array); 672 &dev_attr_sm_shm_ecc_ded_count_array);
670 673
671 error |= gr_gp10b_ecc_stat_create(dev, 674 error |= gr_gp10b_ecc_stat_create(dev,
672 0, 675 0,
673 "tex_ecc_total_sec_pipe0_count", 676 "tex_ecc_total_sec_pipe0_count",
674 &g->ecc.gr.t18x.tex_total_sec_pipe0_count, 677 &g->ecc.gr.t18x.tex_total_sec_pipe0_count,
675 dev_attr_tex_ecc_total_sec_pipe0_count_array); 678 &dev_attr_tex_ecc_total_sec_pipe0_count_array);
676 error |= gr_gp10b_ecc_stat_create(dev, 679 error |= gr_gp10b_ecc_stat_create(dev,
677 0, 680 0,
678 "tex_ecc_total_ded_pipe0_count", 681 "tex_ecc_total_ded_pipe0_count",
679 &g->ecc.gr.t18x.tex_total_ded_pipe0_count, 682 &g->ecc.gr.t18x.tex_total_ded_pipe0_count,
680 dev_attr_tex_ecc_total_ded_pipe0_count_array); 683 &dev_attr_tex_ecc_total_ded_pipe0_count_array);
681 error |= gr_gp10b_ecc_stat_create(dev, 684 error |= gr_gp10b_ecc_stat_create(dev,
682 0, 685 0,
683 "tex_ecc_unique_sec_pipe0_count", 686 "tex_ecc_unique_sec_pipe0_count",
684 &g->ecc.gr.t18x.tex_unique_sec_pipe0_count, 687 &g->ecc.gr.t18x.tex_unique_sec_pipe0_count,
685 dev_attr_tex_ecc_unique_sec_pipe0_count_array); 688 &dev_attr_tex_ecc_unique_sec_pipe0_count_array);
686 error |= gr_gp10b_ecc_stat_create(dev, 689 error |= gr_gp10b_ecc_stat_create(dev,
687 0, 690 0,
688 "tex_ecc_unique_ded_pipe0_count", 691 "tex_ecc_unique_ded_pipe0_count",
689 &g->ecc.gr.t18x.tex_unique_ded_pipe0_count, 692 &g->ecc.gr.t18x.tex_unique_ded_pipe0_count,
690 dev_attr_tex_ecc_unique_ded_pipe0_count_array); 693 &dev_attr_tex_ecc_unique_ded_pipe0_count_array);
691 error |= gr_gp10b_ecc_stat_create(dev, 694 error |= gr_gp10b_ecc_stat_create(dev,
692 0, 695 0,
693 "tex_ecc_total_sec_pipe1_count", 696 "tex_ecc_total_sec_pipe1_count",
694 &g->ecc.gr.t18x.tex_total_sec_pipe1_count, 697 &g->ecc.gr.t18x.tex_total_sec_pipe1_count,
695 dev_attr_tex_ecc_total_sec_pipe1_count_array); 698 &dev_attr_tex_ecc_total_sec_pipe1_count_array);
696 error |= gr_gp10b_ecc_stat_create(dev, 699 error |= gr_gp10b_ecc_stat_create(dev,
697 0, 700 0,
698 "tex_ecc_total_ded_pipe1_count", 701 "tex_ecc_total_ded_pipe1_count",
699 &g->ecc.gr.t18x.tex_total_ded_pipe1_count, 702 &g->ecc.gr.t18x.tex_total_ded_pipe1_count,
700 dev_attr_tex_ecc_total_ded_pipe1_count_array); 703 &dev_attr_tex_ecc_total_ded_pipe1_count_array);
701 error |= gr_gp10b_ecc_stat_create(dev, 704 error |= gr_gp10b_ecc_stat_create(dev,
702 0, 705 0,
703 "tex_ecc_unique_sec_pipe1_count", 706 "tex_ecc_unique_sec_pipe1_count",
704 &g->ecc.gr.t18x.tex_unique_sec_pipe1_count, 707 &g->ecc.gr.t18x.tex_unique_sec_pipe1_count,
705 dev_attr_tex_ecc_unique_sec_pipe1_count_array); 708 &dev_attr_tex_ecc_unique_sec_pipe1_count_array);
706 error |= gr_gp10b_ecc_stat_create(dev, 709 error |= gr_gp10b_ecc_stat_create(dev,
707 0, 710 0,
708 "tex_ecc_unique_ded_pipe1_count", 711 "tex_ecc_unique_ded_pipe1_count",
709 &g->ecc.gr.t18x.tex_unique_ded_pipe1_count, 712 &g->ecc.gr.t18x.tex_unique_ded_pipe1_count,
710 dev_attr_tex_ecc_unique_ded_pipe1_count_array); 713 &dev_attr_tex_ecc_unique_ded_pipe1_count_array);
711 714
712 error |= gr_gp10b_ecc_stat_create(dev, 715 error |= gr_gp10b_ecc_stat_create(dev,
713 1, 716 1,
714 "lts0_ecc_sec_count", 717 "lts0_ecc_sec_count",
715 &g->ecc.gr.t18x.l2_sec_count, 718 &g->ecc.gr.t18x.l2_sec_count,
716 dev_attr_l2_ecc_sec_count_array); 719 &dev_attr_l2_ecc_sec_count_array);
717 error |= gr_gp10b_ecc_stat_create(dev, 720 error |= gr_gp10b_ecc_stat_create(dev,
718 1, 721 1,
719 "lts0_ecc_ded_count", 722 "lts0_ecc_ded_count",
720 &g->ecc.gr.t18x.l2_ded_count, 723 &g->ecc.gr.t18x.l2_ded_count,
721 dev_attr_l2_ecc_ded_count_array); 724 &dev_attr_l2_ecc_ded_count_array);
722 725
723 if (error) 726 if (error)
724 dev_err(dev, "Failed to create sysfs attributes!\n"); 727 dev_err(dev, "Failed to create sysfs attributes!\n");
diff --git a/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.h b/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.h
index fb69fa98..74db60d1 100644
--- a/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.h
+++ b/drivers/gpu/nvgpu/tegra/linux/platform_gp10b_tegra.h
@@ -23,13 +23,13 @@ int gr_gp10b_ecc_stat_create(struct device *dev,
23 int is_l2, 23 int is_l2,
24 char *ecc_stat_name, 24 char *ecc_stat_name,
25 struct gk20a_ecc_stat *ecc_stat, 25 struct gk20a_ecc_stat *ecc_stat,
26 struct device_attribute *dev_attr_array); 26 struct device_attribute **dev_attr_array);
27int gp10b_ecc_stat_create(struct device *dev, 27int gp10b_ecc_stat_create(struct device *dev,
28 int hw_units, 28 int hw_units,
29 char *ecc_unit_name, 29 char *ecc_unit_name,
30 char *ecc_stat_name, 30 char *ecc_stat_name,
31 struct gk20a_ecc_stat *ecc_stat, 31 struct gk20a_ecc_stat *ecc_stat,
32 struct device_attribute *dev_attr_array); 32 struct device_attribute **dev_attr_array);
33 33
34void gr_gp10b_ecc_stat_remove(struct device *dev, 34void gr_gp10b_ecc_stat_remove(struct device *dev,
35 int is_l2, 35 int is_l2,