Skip to content

Commit 0bda597

Browse files
Heng QiNipaLocal
authored andcommitted
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 <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent e0e76cd commit 0bda597

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

include/linux/dim.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,54 @@ int net_dim_init_irq_moder(struct net_device *dev, u8 profile_flags,
256256
*/
257257
void net_dim_free_irq_moder(struct net_device *dev);
258258

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+
259307
/**
260308
* dim_on_top - check if current state is a good place to stop (top location)
261309
* @dim: DIM context

lib/dim/net_dim.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,74 @@ void net_dim_free_irq_moder(struct net_device *dev)
165165
}
166166
EXPORT_SYMBOL(net_dim_free_irq_moder);
167167

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+
168236
static int net_dim_step(struct dim *dim)
169237
{
170238
if (dim->tired == (NET_DIM_PARAMS_NUM_PROFILES * 2))

0 commit comments

Comments
 (0)