Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) The forcedeth conversion from pci_*() DMA interfaces to dma_*() ones
missed one spot. From Zhu Yanjun.
2) Missing CRYPTO_SHA256 Kconfig dep in cfg80211, from Johannes Berg.
3) Fix checksum offloading in thunderx driver, from Sunil Goutham.
4) Add SPDX to vm_sockets_diag.h, from Stephen Hemminger.
5) Fix use after free of packet headers in TIPC, from Jon Maloy.
6) "sizeof(ptr)" vs "sizeof(*ptr)" bug in i40e, from Gustavo A R Silva.
7) Tunneling fixes in mlxsw driver, from Petr Machata.
8) Fix crash in fanout_demux_rollover() of AF_PACKET, from Mike
Maloney.
9) Fix race in AF_PACKET bind() vs. NETDEV_UP notifier, from Eric
Dumazet.
10) Fix regression in sch_sfq.c due to one of the timer_setup()
conversions. From Paolo Abeni.
11) SCTP does list_for_each_entry() using wrong struct member, fix from
Xin Long.
12) Don't use big endian netlink attribute read for
IFLA_BOND_AD_ACTOR_SYSTEM, it is in cpu endianness. Also from Xin
Long.
13) Fix mis-initialization of q->link.clock in CBQ scheduler, preventing
adding filters there. From Jiri Pirko.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (67 commits)
ethernet: dwmac-stm32: Fix copyright
net: via: via-rhine: use %p to format void * address instead of %x
net: ethernet: xilinx: Mark XILINX_LL_TEMAC broken on 64-bit
myri10ge: Update MAINTAINERS
net: sched: cbq: create block for q->link.block
atm: suni: remove extraneous space to fix indentation
atm: lanai: use %p to format kernel addresses instead of %x
VSOCK: Don't set sk_state to TCP_CLOSE before testing it
atm: fore200e: use %pK to format kernel addresses instead of %x
ambassador: fix incorrect indentation of assignment statement
vxlan: use __be32 type for the param vni in __vxlan_fdb_delete
bonding: use nla_get_u64 to extract the value for IFLA_BOND_AD_ACTOR_SYSTEM
sctp: use right member as the param of list_for_each_entry
sch_sfq: fix null pointer dereference at timer expiration
cls_bpf: don't decrement net's refcount when offload fails
net/packet: fix a race in packet_bind() and packet_notifier()
packet: fix crash in fanout_demux_rollover()
sctp: remove extern from stream sched
sctp: force the params with right types for sctp csum apis
sctp: force SCTP_ERROR_INV_STRM with __u32 when calling sctp_chunk_fail
...
This commit is contained in:
@@ -51,10 +51,14 @@ static void rxrpc_call_timer_expired(struct timer_list *t)
|
||||
|
||||
_enter("%d", call->debug_id);
|
||||
|
||||
if (call->state < RXRPC_CALL_COMPLETE)
|
||||
rxrpc_set_timer(call, rxrpc_timer_expired, ktime_get_real());
|
||||
if (call->state < RXRPC_CALL_COMPLETE) {
|
||||
trace_rxrpc_timer(call, rxrpc_timer_expired, jiffies);
|
||||
rxrpc_queue_call(call);
|
||||
}
|
||||
}
|
||||
|
||||
static struct lock_class_key rxrpc_call_user_mutex_lock_class_key;
|
||||
|
||||
/*
|
||||
* find an extant server call
|
||||
* - called in process context with IRQs enabled
|
||||
@@ -95,7 +99,7 @@ found_extant_call:
|
||||
/*
|
||||
* allocate a new call
|
||||
*/
|
||||
struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
|
||||
struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp)
|
||||
{
|
||||
struct rxrpc_call *call;
|
||||
|
||||
@@ -114,6 +118,14 @@ struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
|
||||
goto nomem_2;
|
||||
|
||||
mutex_init(&call->user_mutex);
|
||||
|
||||
/* Prevent lockdep reporting a deadlock false positive between the afs
|
||||
* filesystem and sys_sendmsg() via the mmap sem.
|
||||
*/
|
||||
if (rx->sk.sk_kern_sock)
|
||||
lockdep_set_class(&call->user_mutex,
|
||||
&rxrpc_call_user_mutex_lock_class_key);
|
||||
|
||||
timer_setup(&call->timer, rxrpc_call_timer_expired, 0);
|
||||
INIT_WORK(&call->processor, &rxrpc_process_call);
|
||||
INIT_LIST_HEAD(&call->link);
|
||||
@@ -128,6 +140,8 @@ struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
|
||||
atomic_set(&call->usage, 1);
|
||||
call->debug_id = atomic_inc_return(&rxrpc_debug_id);
|
||||
call->tx_total_len = -1;
|
||||
call->next_rx_timo = 20 * HZ;
|
||||
call->next_req_timo = 1 * HZ;
|
||||
|
||||
memset(&call->sock_node, 0xed, sizeof(call->sock_node));
|
||||
|
||||
@@ -150,7 +164,8 @@ nomem:
|
||||
/*
|
||||
* Allocate a new client call.
|
||||
*/
|
||||
static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
|
||||
static struct rxrpc_call *rxrpc_alloc_client_call(struct rxrpc_sock *rx,
|
||||
struct sockaddr_rxrpc *srx,
|
||||
gfp_t gfp)
|
||||
{
|
||||
struct rxrpc_call *call;
|
||||
@@ -158,7 +173,7 @@ static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
|
||||
|
||||
_enter("");
|
||||
|
||||
call = rxrpc_alloc_call(gfp);
|
||||
call = rxrpc_alloc_call(rx, gfp);
|
||||
if (!call)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
call->state = RXRPC_CALL_CLIENT_AWAIT_CONN;
|
||||
@@ -177,15 +192,17 @@ static struct rxrpc_call *rxrpc_alloc_client_call(struct sockaddr_rxrpc *srx,
|
||||
*/
|
||||
static void rxrpc_start_call_timer(struct rxrpc_call *call)
|
||||
{
|
||||
ktime_t now = ktime_get_real(), expire_at;
|
||||
unsigned long now = jiffies;
|
||||
unsigned long j = now + MAX_JIFFY_OFFSET;
|
||||
|
||||
expire_at = ktime_add_ms(now, rxrpc_max_call_lifetime);
|
||||
call->expire_at = expire_at;
|
||||
call->ack_at = expire_at;
|
||||
call->ping_at = expire_at;
|
||||
call->resend_at = expire_at;
|
||||
call->timer.expires = jiffies + LONG_MAX / 2;
|
||||
rxrpc_set_timer(call, rxrpc_timer_begin, now);
|
||||
call->ack_at = j;
|
||||
call->ack_lost_at = j;
|
||||
call->resend_at = j;
|
||||
call->ping_at = j;
|
||||
call->expect_rx_by = j;
|
||||
call->expect_req_by = j;
|
||||
call->expect_term_by = j;
|
||||
call->timer.expires = now;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -196,8 +213,7 @@ static void rxrpc_start_call_timer(struct rxrpc_call *call)
|
||||
struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
struct rxrpc_conn_parameters *cp,
|
||||
struct sockaddr_rxrpc *srx,
|
||||
unsigned long user_call_ID,
|
||||
s64 tx_total_len,
|
||||
struct rxrpc_call_params *p,
|
||||
gfp_t gfp)
|
||||
__releases(&rx->sk.sk_lock.slock)
|
||||
{
|
||||
@@ -207,18 +223,18 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
const void *here = __builtin_return_address(0);
|
||||
int ret;
|
||||
|
||||
_enter("%p,%lx", rx, user_call_ID);
|
||||
_enter("%p,%lx", rx, p->user_call_ID);
|
||||
|
||||
call = rxrpc_alloc_client_call(srx, gfp);
|
||||
call = rxrpc_alloc_client_call(rx, srx, gfp);
|
||||
if (IS_ERR(call)) {
|
||||
release_sock(&rx->sk);
|
||||
_leave(" = %ld", PTR_ERR(call));
|
||||
return call;
|
||||
}
|
||||
|
||||
call->tx_total_len = tx_total_len;
|
||||
call->tx_total_len = p->tx_total_len;
|
||||
trace_rxrpc_call(call, rxrpc_call_new_client, atomic_read(&call->usage),
|
||||
here, (const void *)user_call_ID);
|
||||
here, (const void *)p->user_call_ID);
|
||||
|
||||
/* We need to protect a partially set up call against the user as we
|
||||
* will be acting outside the socket lock.
|
||||
@@ -234,16 +250,16 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
parent = *pp;
|
||||
xcall = rb_entry(parent, struct rxrpc_call, sock_node);
|
||||
|
||||
if (user_call_ID < xcall->user_call_ID)
|
||||
if (p->user_call_ID < xcall->user_call_ID)
|
||||
pp = &(*pp)->rb_left;
|
||||
else if (user_call_ID > xcall->user_call_ID)
|
||||
else if (p->user_call_ID > xcall->user_call_ID)
|
||||
pp = &(*pp)->rb_right;
|
||||
else
|
||||
goto error_dup_user_ID;
|
||||
}
|
||||
|
||||
rcu_assign_pointer(call->socket, rx);
|
||||
call->user_call_ID = user_call_ID;
|
||||
call->user_call_ID = p->user_call_ID;
|
||||
__set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
|
||||
rxrpc_get_call(call, rxrpc_call_got_userid);
|
||||
rb_link_node(&call->sock_node, parent, pp);
|
||||
|
||||
Reference in New Issue
Block a user