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

dim: add new interfaces for initialization and getting results

DIM-related mode and work have been collected in one same place,
so new interfaces are added to provide convenience.

Signed-off-by: Heng Qi <hengqi@linux.alibaba.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20240621101353.107425-5-hengqi@linux.alibaba.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Heng Qi and committed by
Jakub Kicinski
13ba28c5 f750dfe8

+116
+48
include/linux/dim.h
··· 257 257 void net_dim_free_irq_moder(struct net_device *dev); 258 258 259 259 /** 260 + * net_dim_setting - initialize DIM's cq mode and schedule worker 261 + * @dev: target network device 262 + * @dim: DIM context 263 + * @is_tx: true indicates the tx direction, false indicates the rx direction 264 + */ 265 + void net_dim_setting(struct net_device *dev, struct dim *dim, bool is_tx); 266 + 267 + /** 268 + * net_dim_work_cancel - synchronously cancel dim's worker 269 + * @dim: DIM context 270 + */ 271 + void net_dim_work_cancel(struct dim *dim); 272 + 273 + /** 274 + * net_dim_get_rx_irq_moder - get DIM rx results based on profile_ix 275 + * @dev: target network device 276 + * @dim: DIM context 277 + * 278 + * Return: DIM irq moderation 279 + */ 280 + struct dim_cq_moder 281 + net_dim_get_rx_irq_moder(struct net_device *dev, struct dim *dim); 282 + 283 + /** 284 + * net_dim_get_tx_irq_moder - get DIM tx results based on profile_ix 285 + * @dev: target network device 286 + * @dim: DIM context 287 + * 288 + * Return: DIM irq moderation 289 + */ 290 + struct dim_cq_moder 291 + net_dim_get_tx_irq_moder(struct net_device *dev, struct dim *dim); 292 + 293 + /** 294 + * net_dim_set_rx_mode - set DIM rx cq mode 295 + * @dev: target network device 296 + * @rx_mode: target rx cq mode 297 + */ 298 + void net_dim_set_rx_mode(struct net_device *dev, u8 rx_mode); 299 + 300 + /** 301 + * net_dim_set_tx_mode - set DIM tx cq mode 302 + * @dev: target network device 303 + * @tx_mode: target tx cq mode 304 + */ 305 + void net_dim_set_tx_mode(struct net_device *dev, u8 tx_mode); 306 + 307 + /** 260 308 * dim_on_top - check if current state is a good place to stop (top location) 261 309 * @dim: DIM context 262 310 *
+68
lib/dim/net_dim.c
··· 165 165 } 166 166 EXPORT_SYMBOL(net_dim_free_irq_moder); 167 167 168 + void net_dim_setting(struct net_device *dev, struct dim *dim, bool is_tx) 169 + { 170 + struct dim_irq_moder *irq_moder = dev->irq_moder; 171 + 172 + if (!irq_moder) 173 + return; 174 + 175 + if (is_tx) { 176 + INIT_WORK(&dim->work, irq_moder->tx_dim_work); 177 + dim->mode = READ_ONCE(irq_moder->dim_tx_mode); 178 + return; 179 + } 180 + 181 + INIT_WORK(&dim->work, irq_moder->rx_dim_work); 182 + dim->mode = READ_ONCE(irq_moder->dim_rx_mode); 183 + } 184 + EXPORT_SYMBOL(net_dim_setting); 185 + 186 + void net_dim_work_cancel(struct dim *dim) 187 + { 188 + cancel_work_sync(&dim->work); 189 + } 190 + EXPORT_SYMBOL(net_dim_work_cancel); 191 + 192 + struct dim_cq_moder net_dim_get_rx_irq_moder(struct net_device *dev, 193 + struct dim *dim) 194 + { 195 + struct dim_cq_moder res, *profile; 196 + 197 + rcu_read_lock(); 198 + profile = rcu_dereference(dev->irq_moder->rx_profile); 199 + res = profile[dim->profile_ix]; 200 + rcu_read_unlock(); 201 + 202 + res.cq_period_mode = dim->mode; 203 + 204 + return res; 205 + } 206 + EXPORT_SYMBOL(net_dim_get_rx_irq_moder); 207 + 208 + struct dim_cq_moder net_dim_get_tx_irq_moder(struct net_device *dev, 209 + struct dim *dim) 210 + { 211 + struct dim_cq_moder res, *profile; 212 + 213 + rcu_read_lock(); 214 + profile = rcu_dereference(dev->irq_moder->tx_profile); 215 + res = profile[dim->profile_ix]; 216 + rcu_read_unlock(); 217 + 218 + res.cq_period_mode = dim->mode; 219 + 220 + return res; 221 + } 222 + EXPORT_SYMBOL(net_dim_get_tx_irq_moder); 223 + 224 + void net_dim_set_rx_mode(struct net_device *dev, u8 rx_mode) 225 + { 226 + WRITE_ONCE(dev->irq_moder->dim_rx_mode, rx_mode); 227 + } 228 + EXPORT_SYMBOL(net_dim_set_rx_mode); 229 + 230 + void net_dim_set_tx_mode(struct net_device *dev, u8 tx_mode) 231 + { 232 + WRITE_ONCE(dev->irq_moder->dim_tx_mode, tx_mode); 233 + } 234 + EXPORT_SYMBOL(net_dim_set_tx_mode); 235 + 168 236 static int net_dim_step(struct dim *dim) 169 237 { 170 238 if (dim->tired == (NET_DIM_PARAMS_NUM_PROFILES * 2))