lkml.org 
[lkml]   [2018]   [Apr]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 2/5] X86: Hyper-V: Enable IPI enlightenments
Hi Srinivasan,

I love your patch! Yet something to improve:

[auto build test ERROR on v4.17-rc2]
[also build test ERROR on next-20180426]
[cannot apply to tip/x86/core]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/kys-linuxonhyperv-com/X86-Hyper-V-APIC-enlightenments/20180427-114416
config: i386-randconfig-s1-04271426 (attached as .config)
compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
reproduce:
# save the attached .config to linux build tree
make ARCH=i386

All errors (new ones prefixed by >>):

arch/x86/hyperv/hv_apic.c: In function 'hv_apic_read':
arch/x86/hyperv/hv_apic.c:73:10: error: implicit declaration of function 'native_apic_mem_read' [-Werror=implicit-function-declaration]
return native_apic_mem_read(reg);
^~~~~~~~~~~~~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_apic_write':
arch/x86/hyperv/hv_apic.c:87:3: error: implicit declaration of function 'native_apic_mem_write' [-Werror=implicit-function-declaration]
native_apic_mem_write(reg, val);
^~~~~~~~~~~~~~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_send_ipi':
arch/x86/hyperv/hv_apic.c:155:3: error: invalid use of undefined type 'struct apic'
orig_apic.send_IPI(cpu, vector);
^~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_send_ipi_mask':
arch/x86/hyperv/hv_apic.c:161:3: error: invalid use of undefined type 'struct apic'
orig_apic.send_IPI_mask(mask, vector);
^~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_send_ipi_mask_allbutself':
arch/x86/hyperv/hv_apic.c:174:3: error: invalid use of undefined type 'struct apic'
orig_apic.send_IPI_mask_allbutself(mask, vector);
^~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_send_ipi_all':
arch/x86/hyperv/hv_apic.c:185:3: error: invalid use of undefined type 'struct apic'
orig_apic.send_IPI_all(vector);
^~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_send_ipi_self':
arch/x86/hyperv/hv_apic.c:191:3: error: invalid use of undefined type 'struct apic'
orig_apic.send_IPI_self(vector);
^~~~~~~~~
arch/x86/hyperv/hv_apic.c: In function 'hv_apic_init':
arch/x86/hyperv/hv_apic.c:204:16: error: 'apic' undeclared (first use in this function)
orig_apic = *apic;
^~~~
arch/x86/hyperv/hv_apic.c:204:16: note: each undeclared identifier is reported only once for each function it appears in
>> arch/x86/hyperv/hv_apic.c:204:3: error: 'orig_apic' has an incomplete type 'struct apic'
orig_apic = *apic;
^~~~~~~~~
arch/x86/hyperv/hv_apic.c:217:3: error: implicit declaration of function 'apic_set_eoi_write' [-Werror=implicit-function-declaration]
apic_set_eoi_write(hv_apic_eoi_write);
^~~~~~~~~~~~~~~~~~
arch/x86/hyperv/hv_apic.c: At top level:
>> arch/x86/hyperv/hv_apic.c:39:20: error: storage size of 'orig_apic' isn't known
static struct apic orig_apic;
^~~~~~~~~
cc1: some warnings being treated as errors

vim +204 arch/x86/hyperv/hv_apic.c

38
> 39 static struct apic orig_apic;
40
41 static u64 hv_apic_icr_read(void)
42 {
43 u64 reg_val;
44
45 rdmsrl(HV_X64_MSR_ICR, reg_val);
46 return reg_val;
47 }
48
49 static void hv_apic_icr_write(u32 low, u32 id)
50 {
51 u64 reg_val;
52
53 reg_val = SET_APIC_DEST_FIELD(id);
54 reg_val = reg_val << 32;
55 reg_val |= low;
56
57 wrmsrl(HV_X64_MSR_ICR, reg_val);
58 }
59
60 static u32 hv_apic_read(u32 reg)
61 {
62 u32 reg_val, hi;
63
64 switch (reg) {
65 case APIC_EOI:
66 rdmsr(HV_X64_MSR_EOI, reg_val, hi);
67 return reg_val;
68 case APIC_TASKPRI:
69 rdmsr(HV_X64_MSR_TPR, reg_val, hi);
70 return reg_val;
71
72 default:
73 return native_apic_mem_read(reg);
74 }
75 }
76
77 static void hv_apic_write(u32 reg, u32 val)
78 {
79 switch (reg) {
80 case APIC_EOI:
81 wrmsr(HV_X64_MSR_EOI, val, 0);
82 break;
83 case APIC_TASKPRI:
84 wrmsr(HV_X64_MSR_TPR, val, 0);
85 break;
86 default:
87 native_apic_mem_write(reg, val);
88 }
89 }
90
91 static void hv_apic_eoi_write(u32 reg, u32 val)
92 {
93 wrmsr(HV_X64_MSR_EOI, val, 0);
94 }
95
96 /*
97 * IPI implementation on Hyper-V.
98 */
99
100 static int __send_ipi_mask(const struct cpumask *mask, int vector)
101 {
102 int cur_cpu, vcpu;
103 struct ipi_arg_non_ex **arg;
104 struct ipi_arg_non_ex *ipi_arg;
105 int ret = 1;
106 unsigned long flags;
107
108 if (cpumask_empty(mask))
109 return 0;
110
111 if (!hv_hypercall_pg)
112 return ret;
113
114 if ((vector < HV_IPI_LOW_VECTOR) || (vector > HV_IPI_HIGH_VECTOR))
115 return ret;
116
117 local_irq_save(flags);
118 arg = (struct ipi_arg_non_ex **)this_cpu_ptr(hyperv_pcpu_input_arg);
119
120 ipi_arg = *arg;
121 if (unlikely(!ipi_arg))
122 goto ipi_mask_done;
123
124
125 ipi_arg->vector = vector;
126 ipi_arg->reserved = 0;
127 ipi_arg->cpu_mask = 0;
128
129 for_each_cpu(cur_cpu, mask) {
130 vcpu = hv_cpu_number_to_vp_number(cur_cpu);
131 if (vcpu >= 64)
132 goto ipi_mask_done;
133
134 __set_bit(vcpu, (unsigned long *)&ipi_arg->cpu_mask);
135 }
136
137 ret = hv_do_hypercall(HVCALL_SEND_IPI, ipi_arg, NULL);
138
139 ipi_mask_done:
140 local_irq_restore(flags);
141 return ret;
142 }
143
144 static int __send_ipi_one(int cpu, int vector)
145 {
146 struct cpumask mask = CPU_MASK_NONE;
147
148 cpumask_set_cpu(cpu, &mask);
149 return __send_ipi_mask(&mask, vector);
150 }
151
152 static void hv_send_ipi(int cpu, int vector)
153 {
154 if (__send_ipi_one(cpu, vector))
155 orig_apic.send_IPI(cpu, vector);
156 }
157
158 static void hv_send_ipi_mask(const struct cpumask *mask, int vector)
159 {
160 if (__send_ipi_mask(mask, vector))
161 orig_apic.send_IPI_mask(mask, vector);
162 }
163
164 static void hv_send_ipi_mask_allbutself(const struct cpumask *mask, int vector)
165 {
166 unsigned int this_cpu = smp_processor_id();
167 struct cpumask new_mask;
168 const struct cpumask *local_mask;
169
170 cpumask_copy(&new_mask, mask);
171 cpumask_clear_cpu(this_cpu, &new_mask);
172 local_mask = &new_mask;
173 if (__send_ipi_mask(local_mask, vector))
174 orig_apic.send_IPI_mask_allbutself(mask, vector);
175 }
176
177 static void hv_send_ipi_allbutself(int vector)
178 {
179 hv_send_ipi_mask_allbutself(cpu_online_mask, vector);
180 }
181
182 static void hv_send_ipi_all(int vector)
183 {
184 if (__send_ipi_mask(cpu_online_mask, vector))
185 orig_apic.send_IPI_all(vector);
186 }
187
188 static void hv_send_ipi_self(int vector)
189 {
190 if (__send_ipi_one(smp_processor_id(), vector))
> 191 orig_apic.send_IPI_self(vector);
192 }
193
194 void __init hv_apic_init(void)
195 {
196 if (ms_hyperv.hints & HV_X64_CLUSTER_IPI_RECOMMENDED) {
197 if (hyperv_pcpu_input_arg == NULL)
198 goto msr_based_access;
199
200 pr_info("Hyper-V: Using IPI hypercalls\n");
201 /*
202 * Set the IPI entry points.
203 */
> 204 orig_apic = *apic;

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[unhandled content-type:application/gzip]
\
 
 \ /
  Last update: 2018-04-27 13:56    [W:0.123 / U:1.728 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site