Commit 7de07a4d authored by Ben Hutchings's avatar Ben Hutchings

sfc: More sensible semantics for efx_filter_insert_filter() replace flag

The 'replace' flag to efx_filter_insert_filter() controls whether the
new filter may replace *any* filter, and is checked even before
priority comparison.  But lower-priority filters should never
block insertion of higher-priority filters.

Change the priority checking so that lower-priority filters are
replaced regardless of the value of the flag, and rename the
flag to 'replace_equal'.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 97d48a10
...@@ -650,14 +650,22 @@ u32 efx_filter_get_rx_id_limit(struct efx_nic *efx) ...@@ -650,14 +650,22 @@ u32 efx_filter_get_rx_id_limit(struct efx_nic *efx)
* efx_filter_insert_filter - add or replace a filter * efx_filter_insert_filter - add or replace a filter
* @efx: NIC in which to insert the filter * @efx: NIC in which to insert the filter
* @spec: Specification for the filter * @spec: Specification for the filter
* @replace: Flag for whether the specified filter may replace a filter * @replace_equal: Flag for whether the specified filter may replace an
* with an identical match expression and equal or lower priority * existing filter with equal priority
* *
* On success, return the filter ID. * On success, return the filter ID.
* On failure, return a negative error code. * On failure, return a negative error code.
*
* If an existing filter has equal match values to the new filter
* spec, then the new filter might replace it, depending on the
* relative priorities. If the existing filter has lower priority, or
* if @replace_equal is set and it has equal priority, then it is
* replaced. Otherwise the function fails, returning -%EPERM if
* the existing filter has higher priority or -%EEXIST if it has
* equal priority.
*/ */
s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec, s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
bool replace) bool replace_equal)
{ {
struct efx_filter_state *state = efx->filter_state; struct efx_filter_state *state = efx->filter_state;
struct efx_filter_table *table = efx_filter_spec_table(state, spec); struct efx_filter_table *table = efx_filter_spec_table(state, spec);
...@@ -687,7 +695,7 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec, ...@@ -687,7 +695,7 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
if (test_bit(filter_idx, table->used_bitmap)) { if (test_bit(filter_idx, table->used_bitmap)) {
/* Should we replace the existing filter? */ /* Should we replace the existing filter? */
if (!replace) { if (spec->priority == saved_spec->priority && !replace_equal) {
rc = -EEXIST; rc = -EEXIST;
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment