Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Conflicting commits, all resolutions pretty trivial: drivers/bus/mhi/pci_generic.c5c2c853159("bus: mhi: pci-generic: configurable network interface MRU")56f6f4c4eb("bus: mhi: pci_generic: Apply no-op for wake using sideband wake boolean") drivers/nfc/s3fwrn5/firmware.ca0302ff590("nfc: s3fwrn5: remove unnecessary label")46573e3ab0("nfc: s3fwrn5: fix undefined parameter values in dev_err()")801e541c79("nfc: s3fwrn5: fix undefined parameter values in dev_err()") MAINTAINERS7d901a1e87("net: phy: add Maxlinear GPY115/21x/24x driver")8a7b46fa79("MAINTAINERS: add Yasushi SHOJI as reviewer for the Microchip CAN BUS Analyzer Tool driver") Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -9327,18 +9327,10 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
|
||||
|
||||
switch (attrs->flavour) {
|
||||
case DEVLINK_PORT_FLAVOUR_PHYSICAL:
|
||||
case DEVLINK_PORT_FLAVOUR_VIRTUAL:
|
||||
n = snprintf(name, len, "p%u", attrs->phys.port_number);
|
||||
if (n < len && attrs->split)
|
||||
n += snprintf(name + n, len - n, "s%u",
|
||||
attrs->phys.split_subport_number);
|
||||
if (!attrs->split)
|
||||
n = snprintf(name, len, "p%u", attrs->phys.port_number);
|
||||
else
|
||||
n = snprintf(name, len, "p%us%u",
|
||||
attrs->phys.port_number,
|
||||
attrs->phys.split_subport_number);
|
||||
|
||||
break;
|
||||
case DEVLINK_PORT_FLAVOUR_CPU:
|
||||
case DEVLINK_PORT_FLAVOUR_DSA:
|
||||
@@ -9380,6 +9372,8 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
|
||||
n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
|
||||
attrs->pci_sf.sf);
|
||||
break;
|
||||
case DEVLINK_PORT_FLAVOUR_VIRTUAL:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (n >= len)
|
||||
|
||||
@@ -1508,7 +1508,7 @@ __be32 flow_get_u32_dst(const struct flow_keys *flow)
|
||||
}
|
||||
EXPORT_SYMBOL(flow_get_u32_dst);
|
||||
|
||||
/* Sort the source and destination IP (and the ports if the IP are the same),
|
||||
/* Sort the source and destination IP and the ports,
|
||||
* to have consistent hash within the two directions
|
||||
*/
|
||||
static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||
@@ -1519,11 +1519,11 @@ static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||
case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
|
||||
addr_diff = (__force u32)keys->addrs.v4addrs.dst -
|
||||
(__force u32)keys->addrs.v4addrs.src;
|
||||
if ((addr_diff < 0) ||
|
||||
(addr_diff == 0 &&
|
||||
((__force u16)keys->ports.dst <
|
||||
(__force u16)keys->ports.src))) {
|
||||
if (addr_diff < 0)
|
||||
swap(keys->addrs.v4addrs.src, keys->addrs.v4addrs.dst);
|
||||
|
||||
if ((__force u16)keys->ports.dst <
|
||||
(__force u16)keys->ports.src) {
|
||||
swap(keys->ports.src, keys->ports.dst);
|
||||
}
|
||||
break;
|
||||
@@ -1531,13 +1531,13 @@ static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||
addr_diff = memcmp(&keys->addrs.v6addrs.dst,
|
||||
&keys->addrs.v6addrs.src,
|
||||
sizeof(keys->addrs.v6addrs.dst));
|
||||
if ((addr_diff < 0) ||
|
||||
(addr_diff == 0 &&
|
||||
((__force u16)keys->ports.dst <
|
||||
(__force u16)keys->ports.src))) {
|
||||
if (addr_diff < 0) {
|
||||
for (i = 0; i < 4; i++)
|
||||
swap(keys->addrs.v6addrs.src.s6_addr32[i],
|
||||
keys->addrs.v6addrs.dst.s6_addr32[i]);
|
||||
}
|
||||
if ((__force u16)keys->ports.dst <
|
||||
(__force u16)keys->ports.src) {
|
||||
swap(keys->ports.src, keys->ports.dst);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -584,29 +584,42 @@ static int sk_psock_handle_skb(struct sk_psock *psock, struct sk_buff *skb,
|
||||
return sk_psock_skb_ingress(psock, skb);
|
||||
}
|
||||
|
||||
static void sock_drop(struct sock *sk, struct sk_buff *skb)
|
||||
static void sk_psock_skb_state(struct sk_psock *psock,
|
||||
struct sk_psock_work_state *state,
|
||||
struct sk_buff *skb,
|
||||
int len, int off)
|
||||
{
|
||||
sk_drops_add(sk, skb);
|
||||
kfree_skb(skb);
|
||||
spin_lock_bh(&psock->ingress_lock);
|
||||
if (sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED)) {
|
||||
state->skb = skb;
|
||||
state->len = len;
|
||||
state->off = off;
|
||||
} else {
|
||||
sock_drop(psock->sk, skb);
|
||||
}
|
||||
spin_unlock_bh(&psock->ingress_lock);
|
||||
}
|
||||
|
||||
static void sk_psock_backlog(struct work_struct *work)
|
||||
{
|
||||
struct sk_psock *psock = container_of(work, struct sk_psock, work);
|
||||
struct sk_psock_work_state *state = &psock->work_state;
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb = NULL;
|
||||
bool ingress;
|
||||
u32 len, off;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&psock->work_mutex);
|
||||
if (state->skb) {
|
||||
if (unlikely(state->skb)) {
|
||||
spin_lock_bh(&psock->ingress_lock);
|
||||
skb = state->skb;
|
||||
len = state->len;
|
||||
off = state->off;
|
||||
state->skb = NULL;
|
||||
goto start;
|
||||
spin_unlock_bh(&psock->ingress_lock);
|
||||
}
|
||||
if (skb)
|
||||
goto start;
|
||||
|
||||
while ((skb = skb_dequeue(&psock->ingress_skb))) {
|
||||
len = skb->len;
|
||||
@@ -621,9 +634,8 @@ start:
|
||||
len, ingress);
|
||||
if (ret <= 0) {
|
||||
if (ret == -EAGAIN) {
|
||||
state->skb = skb;
|
||||
state->len = len;
|
||||
state->off = off;
|
||||
sk_psock_skb_state(psock, state, skb,
|
||||
len, off);
|
||||
goto end;
|
||||
}
|
||||
/* Hard errors break pipe and stop xmit. */
|
||||
@@ -722,6 +734,11 @@ static void __sk_psock_zap_ingress(struct sk_psock *psock)
|
||||
skb_bpf_redirect_clear(skb);
|
||||
sock_drop(psock->sk, skb);
|
||||
}
|
||||
kfree_skb(psock->work_state.skb);
|
||||
/* We null the skb here to ensure that calls to sk_psock_backlog
|
||||
* do not pick up the free'd skb.
|
||||
*/
|
||||
psock->work_state.skb = NULL;
|
||||
__sk_psock_purge_ingress_msg(psock);
|
||||
}
|
||||
|
||||
@@ -773,8 +790,6 @@ static void sk_psock_destroy(struct work_struct *work)
|
||||
|
||||
void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
|
||||
{
|
||||
sk_psock_stop(psock, false);
|
||||
|
||||
write_lock_bh(&sk->sk_callback_lock);
|
||||
sk_psock_restore_proto(sk, psock);
|
||||
rcu_assign_sk_user_data(sk, NULL);
|
||||
@@ -784,6 +799,8 @@ void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
|
||||
sk_psock_stop_verdict(sk, psock);
|
||||
write_unlock_bh(&sk->sk_callback_lock);
|
||||
|
||||
sk_psock_stop(psock, false);
|
||||
|
||||
INIT_RCU_WORK(&psock->rwork, sk_psock_destroy);
|
||||
queue_rcu_work(system_wq, &psock->rwork);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user