kernel test robot
2023-Aug-10 20:38 UTC
[PATCH] A new virtio pci driver is added for listening to vcpus inside guest. Each vcpu creates a corresponding thread to periodically send data to qemu's back-end watchdog device.
Hi zhanghao1, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on v6.5-rc5 next-20230809] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/zhanghao1/A-new-virtio-pci-driver-is-added-for-listening-to-vcpus-inside-guest-Each-vcpu-creates-a-corresponding-thread-to-periodi/20230731-092546 base: linus/master patch link: https://lore.kernel.org/r/20230731012405.234611-1-zhanghao1%40kylinos.cn patch subject: [PATCH] A new virtio pci driver is added for listening to vcpus inside guest. Each vcpu creates a corresponding thread to periodically send data to qemu's back-end watchdog device. config: sparc64-randconfig-r071-20230811 (https://download.01.org/0day-ci/archive/20230811/202308110442.0tXLNEKs-lkp at intel.com/config) compiler: sparc64-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230811/202308110442.0tXLNEKs-lkp at intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp at intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202308110442.0tXLNEKs-lkp at intel.com/ sparse warnings: (new ones prefixed by >>)>> drivers/virtio/virtio_vcpu_stall_detector.c:76:17: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vcpu_stall_priv * @@drivers/virtio/virtio_vcpu_stall_detector.c:76:17: sparse: expected void const [noderef] __percpu *__vpp_verify drivers/virtio/virtio_vcpu_stall_detector.c:76:17: sparse: got struct vcpu_stall_priv *>> drivers/virtio/virtio_vcpu_stall_detector.c:89:37: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] ticks @@ got restricted __virtio32 @@drivers/virtio/virtio_vcpu_stall_detector.c:89:37: sparse: expected unsigned int [usertype] ticks drivers/virtio/virtio_vcpu_stall_detector.c:89:37: sparse: got restricted __virtio32 drivers/virtio/virtio_vcpu_stall_detector.c:117:17: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vcpu_stall_priv * @@ drivers/virtio/virtio_vcpu_stall_detector.c:117:17: sparse: expected void const [noderef] __percpu *__vpp_verify drivers/virtio/virtio_vcpu_stall_detector.c:117:17: sparse: got struct vcpu_stall_priv * drivers/virtio/virtio_vcpu_stall_detector.c:129:37: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] ticks @@ got restricted __virtio32 @@ drivers/virtio/virtio_vcpu_stall_detector.c:129:37: sparse: expected unsigned int [usertype] ticks drivers/virtio/virtio_vcpu_stall_detector.c:129:37: sparse: got restricted __virtio32>> drivers/virtio/virtio_vcpu_stall_detector.c:193:26: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct vcpu_stall_priv *priv @@ got struct vcpu_stall_priv [noderef] __percpu * @@drivers/virtio/virtio_vcpu_stall_detector.c:193:26: sparse: expected struct vcpu_stall_priv *priv drivers/virtio/virtio_vcpu_stall_detector.c:193:26: sparse: got struct vcpu_stall_priv [noderef] __percpu * drivers/virtio/virtio_vcpu_stall_detector.c:203:24: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vcpu_stall_priv * @@ drivers/virtio/virtio_vcpu_stall_detector.c:203:24: sparse: expected void const [noderef] __percpu *__vpp_verify drivers/virtio/virtio_vcpu_stall_detector.c:203:24: sparse: got struct vcpu_stall_priv *>> drivers/virtio/virtio_vcpu_stall_detector.c:207:15: sparse: sparse: no generic selection for 'unsigned int virtio_cread_v' >> drivers/virtio/virtio_vcpu_stall_detector.c:207:15: sparse: sparse: incompatible types in comparison expression (different base types): >> drivers/virtio/virtio_vcpu_stall_detector.c:207:15: sparse: bad type * >> drivers/virtio/virtio_vcpu_stall_detector.c:207:15: sparse: unsigned int * >> drivers/virtio/virtio_vcpu_stall_detector.c:207:15: sparse: sparse: no generic selection for 'unsigned int [addressable] virtio_cread_v'drivers/virtio/virtio_vcpu_stall_detector.c:217:15: sparse: sparse: no generic selection for 'unsigned int virtio_cread_v' drivers/virtio/virtio_vcpu_stall_detector.c:217:15: sparse: sparse: incompatible types in comparison expression (different base types): drivers/virtio/virtio_vcpu_stall_detector.c:217:15: sparse: bad type * drivers/virtio/virtio_vcpu_stall_detector.c:217:15: sparse: unsigned int * drivers/virtio/virtio_vcpu_stall_detector.c:217:15: sparse: sparse: no generic selection for 'unsigned int [addressable] virtio_cread_v' vim +76 drivers/virtio/virtio_vcpu_stall_detector.c 67 68 static enum hrtimer_restart 69 vcpu_stall_detect_timer_fn(struct hrtimer *hrtimer) 70 { 71 u32 ticks, ping_timeout_ms; 72 struct scatterlist sg; 73 int unused, err = 0; 74 75 struct vcpu_stall_priv *vcpu_stall_detector > 76 this_cpu_ptr(vcpu_stall->priv); 77 78 /* Reload the stall detector counter register every 79 * `ping_timeout_ms` to prevent the virtual device 80 * from decrementing it to 0. The virtual device decrements this 81 * register at 'clock_freq_hz' frequency. 82 */ 83 ticks = vcpu_stall_config.clock_freq_hz * 84 vcpu_stall_config.stall_timeout_sec; 85 86 spin_lock(&vcpu_stall->lock); 87 while (virtqueue_get_buf(vcpu_stall->vq, &unused)) 88 ; > 89 vcpu_stall->pet_event.ticks = cpu_to_virtio32(vcpu_stall_detector->vdev, ticks); 90 vcpu_stall->pet_event.is_initialized = true; 91 vcpu_stall->pet_event.cpu_id = vcpu_stall_detector->cpu_id; 92 93 sg_init_one(&sg, &vcpu_stall->pet_event, sizeof(vcpu_stall->pet_event)); 94 err = virtqueue_add_outbuf(vcpu_stall->vq, &sg, 1, vcpu_stall, GFP_ATOMIC); 95 if (!err) 96 virtqueue_kick(vcpu_stall->vq); 97 else 98 pr_err("cpu:%d failed to add outbuf, err:%d\n", vcpu_stall_detector->cpu_id, err); 99 100 spin_unlock(&vcpu_stall->lock); 101 102 ping_timeout_ms = vcpu_stall_config.stall_timeout_sec * 103 MSEC_PER_SEC / 2; 104 hrtimer_forward_now(hrtimer, 105 ms_to_ktime(ping_timeout_ms)); 106 return HRTIMER_RESTART; 107 } 108 109 static int start_stall_detector_cpu(unsigned int cpu) 110 { 111 u32 ticks, ping_timeout_ms; 112 struct scatterlist sg; 113 struct hrtimer *vcpu_hrtimer; 114 int err = 0; 115 116 struct vcpu_stall_priv *vcpu_stall_detector 117 this_cpu_ptr(vcpu_stall->priv); 118 119 vcpu_stall_detector->cpu_id = cpu; 120 121 vcpu_hrtimer = &vcpu_stall_detector->vcpu_hrtimer; 122 123 /* Compute the number of ticks required for the stall detector 124 * counter register based on the internal clock frequency and the 125 * timeout value given from the device tree. 126 */ 127 ticks = vcpu_stall_config.clock_freq_hz * 128 vcpu_stall_config.stall_timeout_sec; 129 vcpu_stall->pet_event.ticks = cpu_to_virtio32(vcpu_stall_detector->vdev, ticks); 130 131 /* Pet the stall detector at half of its expiration timeout 132 * to prevent spurious resets. 133 */ 134 ping_timeout_ms = vcpu_stall_config.stall_timeout_sec * 135 MSEC_PER_SEC / 2; 136 137 hrtimer_init(vcpu_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 138 vcpu_hrtimer->function = vcpu_stall_detect_timer_fn; 139 140 vcpu_stall->pet_event.is_initialized = true; 141 142 spin_lock(&vcpu_stall->lock); 143 vcpu_stall->pet_event.cpu_id = cpu; 144 sg_init_one(&sg, &vcpu_stall->pet_event, sizeof(vcpu_stall->pet_event)); 145 err = virtqueue_add_outbuf(vcpu_stall->vq, &sg, 1, vcpu_stall, GFP_ATOMIC); 146 if (!err) 147 virtqueue_kick(vcpu_stall->vq); 148 149 spin_unlock(&vcpu_stall->lock); 150 151 hrtimer_start(vcpu_hrtimer, ms_to_ktime(ping_timeout_ms), 152 HRTIMER_MODE_REL_PINNED); 153 return err; 154 } 155 156 static int stop_stall_detector_cpu(unsigned int cpu) 157 { 158 int err = 0; 159 struct scatterlist sg; 160 161 struct vcpu_stall_priv *vcpu_stall_detector 162 per_cpu_ptr(vcpu_stall_detectors, cpu); 163 164 /* Disable the stall detector for the current CPU */ 165 hrtimer_cancel(&vcpu_stall_detector->vcpu_hrtimer); 166 vcpu_stall->pet_event.is_initialized = false; 167 vcpu_stall->pet_event.cpu_id = cpu; 168 169 spin_lock(&vcpu_stall->lock); 170 sg_init_one(&sg, &vcpu_stall->pet_event, sizeof(vcpu_stall->pet_event)); 171 err = virtqueue_add_outbuf(vcpu_stall->vq, &sg, 1, vcpu_stall, GFP_ATOMIC); 172 if (!err) 173 virtqueue_kick(vcpu_stall->vq); 174 175 spin_unlock(&vcpu_stall->lock); 176 177 return err; 178 } 179 180 static int vcpu_stall_detect_probe(struct virtio_device *vdev) 181 { 182 int ret, cpu; 183 u32 clock_freq_hz = VCPU_STALL_DEFAULT_CLOCK_HZ; 184 u32 stall_timeout_sec = VCPU_STALL_DEFAULT_TIMEOUT_SEC; 185 186 vcpu_stall = kzalloc(sizeof(struct vcpu_stall), GFP_KERNEL); 187 if (!vcpu_stall) { 188 ret = -ENOMEM; 189 goto err; 190 } 191 vdev->priv = vcpu_stall; 192 > 193 vcpu_stall->priv = devm_alloc_percpu(&vdev->dev, 194 typeof(struct vcpu_stall_priv)); 195 if (!vcpu_stall->priv) { 196 ret = -ENOMEM; 197 goto failed_priv; 198 } 199 200 for_each_possible_cpu(cpu) { 201 struct vcpu_stall_priv *priv; 202 203 priv = per_cpu_ptr(vcpu_stall->priv, cpu); 204 priv->vdev = vdev; 205 } 206 > 207 ret = virtio_cread_feature(vdev, VCPU_STALL_REG_CLOCK_FREQ_HZ, 208 struct vcpu_stall_detect_config, clock_freq_hz, 209 &clock_freq_hz); 210 if (ret || !clock_freq_hz) { 211 if (!(clock_freq_hz > 0 && 212 clock_freq_hz < VCPU_STALL_MAX_CLOCK_HZ)) { 213 dev_warn(&vdev->dev, "clk out of range\n"); 214 clock_freq_hz = VCPU_STALL_DEFAULT_CLOCK_HZ; 215 } 216 } 217 ret = virtio_cread_feature(vdev, VCPU_STALL_REG_TIMEOUT_SEC, 218 struct vcpu_stall_detect_config, stall_timeout_sec, 219 &stall_timeout_sec); 220 if (ret || !stall_timeout_sec) { 221 if (!(stall_timeout_sec > 0 && 222 stall_timeout_sec < VCPU_STALL_MAX_TIMEOUT_SEC)) { 223 dev_warn(&vdev->dev, "stall timeout out of range\n"); 224 stall_timeout_sec = VCPU_STALL_DEFAULT_TIMEOUT_SEC; 225 } 226 } 227 228 vcpu_stall_config = (struct vcpu_stall_detect_config) { 229 .clock_freq_hz = clock_freq_hz, 230 .stall_timeout_sec = stall_timeout_sec 231 }; 232 233 /* find virtqueue for guest to send pet event to host */ 234 vcpu_stall->vq = virtio_find_single_vq(vdev, NULL, "pet-event"); 235 if (IS_ERR(vcpu_stall->vq)) { 236 dev_err(&vdev->dev, "failed to find vq\n"); 237 goto failed_priv; 238 } 239 240 spin_lock_init(&vcpu_stall->lock); 241 242 ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, 243 "virt/vcpu_stall_detector:online", 244 start_stall_detector_cpu, 245 stop_stall_detector_cpu); 246 if (ret < 0) { 247 dev_err(&vdev->dev, "failed to install cpu hotplug\n"); 248 goto failed_priv; 249 } 250 251 vcpu_stall_config.hp_online = ret; 252 return 0; 253 254 255 failed_priv: 256 kfree(vcpu_stall); 257 err: 258 return ret; 259 } 260 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki