Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gru: check for correct GRU chiplet assignment

Simplify the code that checks for correct assignment of GRU contexts to
users.

Signed-off-by: Jack Steiner <steiner@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Jack Steiner and committed by
Linus Torvalds
41314790 54465dcc

+30 -14
+30 -14
drivers/misc/sgi-gru/grumain.c
··· 53 53 */ 54 54 int gru_cpu_fault_map_id(void) 55 55 { 56 + #ifdef CONFIG_IA64 57 + return uv_blade_processor_id() % GRU_NUM_TFM; 58 + #else 56 59 int cpu = smp_processor_id(); 57 60 int id, core; 58 61 59 62 core = uv_cpu_core_number(cpu); 60 63 id = core + UV_MAX_INT_CORES * uv_cpu_socket_number(cpu); 61 64 return id; 65 + #endif 62 66 } 63 67 64 68 /*--------- ASID Management ------------------------------------------- ··· 703 699 } 704 700 705 701 /* 702 + * Check if a GRU context is allowed to use a specific chiplet. By default 703 + * a context is assigned to any blade-local chiplet. However, users can 704 + * override this. 705 + * Returns 1 if assignment allowed, 0 otherwise 706 + */ 707 + static int gru_check_chiplet_assignment(struct gru_state *gru, 708 + struct gru_thread_state *gts) 709 + { 710 + int blade_id; 711 + int chiplet_id; 712 + 713 + blade_id = gts->ts_user_blade_id; 714 + if (blade_id < 0) 715 + blade_id = uv_numa_blade_id(); 716 + 717 + chiplet_id = gts->ts_user_chiplet_id; 718 + return gru->gs_blade_id == blade_id && 719 + (chiplet_id < 0 || chiplet_id == gru->gs_chiplet_id); 720 + } 721 + 722 + /* 706 723 * Unload the gru context if it is not assigned to the correct blade or 707 724 * chiplet. Misassignment can occur if the process migrates to a different 708 725 * blade or if the user changes the selected blade/chiplet. 709 - * Return 0 if context correct placed, otherwise 1 710 726 */ 711 727 void gru_check_context_placement(struct gru_thread_state *gts) 712 728 { 713 729 struct gru_state *gru; 714 - int blade_id, chiplet_id; 715 730 716 731 /* 717 732 * If the current task is the context owner, verify that the ··· 741 718 if (!gru || gts->ts_tgid_owner != current->tgid) 742 719 return; 743 720 744 - blade_id = gts->ts_user_blade_id; 745 - if (blade_id < 0) 746 - blade_id = uv_numa_blade_id(); 747 - 748 - chiplet_id = gts->ts_user_chiplet_id; 749 - if (gru->gs_blade_id != blade_id || 750 - (chiplet_id >= 0 && chiplet_id != gru->gs_chiplet_id)) { 721 + if (!gru_check_chiplet_assignment(gru, gts)) { 751 722 STAT(check_context_unload); 752 723 gru_unload_context(gts, 1); 753 724 } else if (gru_retarget_intr(gts)) { ··· 785 768 struct gru_state *gru, *gru0; 786 769 struct gru_thread_state *ngts = NULL; 787 770 int ctxnum, ctxnum0, flag = 0, cbr, dsr; 788 - int blade_id = gts->ts_user_blade_id; 789 - int chiplet_id = gts->ts_user_chiplet_id; 771 + int blade_id; 790 772 773 + blade_id = gts->ts_user_blade_id; 791 774 if (blade_id < 0) 792 775 blade_id = uv_numa_blade_id(); 793 776 cbr = gts->ts_cbr_au_count; ··· 805 788 ctxnum0 = ctxnum; 806 789 gru0 = gru; 807 790 while (1) { 808 - if (chiplet_id < 0 || chiplet_id == gru->gs_chiplet_id) { 791 + if (gru_check_chiplet_assignment(gru, gts)) { 809 792 if (check_gru_resources(gru, cbr, dsr, GRU_NUM_CCH)) 810 793 break; 811 794 spin_lock(&gru->gs_lock); ··· 870 853 struct gru_state *gru, *grux; 871 854 int i, max_active_contexts; 872 855 int blade_id = gts->ts_user_blade_id; 873 - int chiplet_id = gts->ts_user_chiplet_id; 874 856 875 857 if (blade_id < 0) 876 858 blade_id = uv_numa_blade_id(); ··· 877 861 gru = NULL; 878 862 max_active_contexts = GRU_NUM_CCH; 879 863 for_each_gru_on_blade(grux, blade_id, i) { 880 - if (chiplet_id >= 0 && chiplet_id != grux->gs_chiplet_id) 864 + if (!gru_check_chiplet_assignment(grux, gts)) 881 865 continue; 882 866 if (check_gru_resources(grux, gts->ts_cbr_au_count, 883 867 gts->ts_dsr_au_count,