Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
+10
-6
@@ -612,8 +612,8 @@ static int dsa_switch_parse_ports_of(struct dsa_switch *ds,
|
||||
{
|
||||
struct device_node *ports, *port;
|
||||
struct dsa_port *dp;
|
||||
int err = 0;
|
||||
u32 reg;
|
||||
int err;
|
||||
|
||||
ports = of_get_child_by_name(dn, "ports");
|
||||
if (!ports) {
|
||||
@@ -624,19 +624,23 @@ static int dsa_switch_parse_ports_of(struct dsa_switch *ds,
|
||||
for_each_available_child_of_node(ports, port) {
|
||||
err = of_property_read_u32(port, "reg", ®);
|
||||
if (err)
|
||||
return err;
|
||||
goto out_put_node;
|
||||
|
||||
if (reg >= ds->num_ports)
|
||||
return -EINVAL;
|
||||
if (reg >= ds->num_ports) {
|
||||
err = -EINVAL;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
dp = &ds->ports[reg];
|
||||
|
||||
err = dsa_port_parse_of(dp, port);
|
||||
if (err)
|
||||
return err;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
return 0;
|
||||
out_put_node:
|
||||
of_node_put(ports);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int dsa_switch_parse_member_of(struct dsa_switch *ds,
|
||||
|
||||
@@ -337,6 +337,7 @@ static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp)
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
of_node_put(phy_dn);
|
||||
return phydev;
|
||||
}
|
||||
|
||||
|
||||
+17
-3
@@ -667,7 +667,8 @@ static int cipso_v4_map_lvl_valid(const struct cipso_v4_doi *doi_def, u8 level)
|
||||
case CIPSO_V4_MAP_PASS:
|
||||
return 0;
|
||||
case CIPSO_V4_MAP_TRANS:
|
||||
if (doi_def->map.std->lvl.cipso[level] < CIPSO_V4_INV_LVL)
|
||||
if ((level < doi_def->map.std->lvl.cipso_size) &&
|
||||
(doi_def->map.std->lvl.cipso[level] < CIPSO_V4_INV_LVL))
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
@@ -1735,13 +1736,26 @@ validate_return:
|
||||
*/
|
||||
void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway)
|
||||
{
|
||||
unsigned char optbuf[sizeof(struct ip_options) + 40];
|
||||
struct ip_options *opt = (struct ip_options *)optbuf;
|
||||
|
||||
if (ip_hdr(skb)->protocol == IPPROTO_ICMP || error != -EACCES)
|
||||
return;
|
||||
|
||||
/*
|
||||
* We might be called above the IP layer,
|
||||
* so we can not use icmp_send and IPCB here.
|
||||
*/
|
||||
|
||||
memset(opt, 0, sizeof(struct ip_options));
|
||||
opt->optlen = ip_hdr(skb)->ihl*4 - sizeof(struct iphdr);
|
||||
if (__ip_options_compile(dev_net(skb->dev), opt, skb, NULL))
|
||||
return;
|
||||
|
||||
if (gateway)
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_ANO, 0);
|
||||
__icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_ANO, 0, opt);
|
||||
else
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_ANO, 0);
|
||||
__icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_ANO, 0, opt);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -710,6 +710,10 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
|
||||
case RTA_GATEWAY:
|
||||
cfg->fc_gw = nla_get_be32(attr);
|
||||
break;
|
||||
case RTA_VIA:
|
||||
NL_SET_ERR_MSG(extack, "IPv4 does not support RTA_VIA attribute");
|
||||
err = -EINVAL;
|
||||
goto errout;
|
||||
case RTA_PRIORITY:
|
||||
cfg->fc_priority = nla_get_u32(attr);
|
||||
break;
|
||||
|
||||
+4
-3
@@ -570,7 +570,8 @@ relookup_failed:
|
||||
* MUST reply to only the first fragment.
|
||||
*/
|
||||
|
||||
void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
||||
void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
|
||||
const struct ip_options *opt)
|
||||
{
|
||||
struct iphdr *iph;
|
||||
int room;
|
||||
@@ -691,7 +692,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
||||
iph->tos;
|
||||
mark = IP4_REPLY_MARK(net, skb_in->mark);
|
||||
|
||||
if (ip_options_echo(net, &icmp_param.replyopts.opt.opt, skb_in))
|
||||
if (__ip_options_echo(net, &icmp_param.replyopts.opt.opt, skb_in, opt))
|
||||
goto out_unlock;
|
||||
|
||||
|
||||
@@ -742,7 +743,7 @@ out_bh_enable:
|
||||
local_bh_enable();
|
||||
out:;
|
||||
}
|
||||
EXPORT_SYMBOL(icmp_send);
|
||||
EXPORT_SYMBOL(__icmp_send);
|
||||
|
||||
|
||||
static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
|
||||
|
||||
+5
-4
@@ -307,11 +307,10 @@ drop:
|
||||
}
|
||||
|
||||
static int ip_rcv_finish_core(struct net *net, struct sock *sk,
|
||||
struct sk_buff *skb)
|
||||
struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
int (*edemux)(struct sk_buff *skb);
|
||||
struct net_device *dev = skb->dev;
|
||||
struct rtable *rt;
|
||||
int err;
|
||||
|
||||
@@ -400,6 +399,7 @@ drop_error:
|
||||
|
||||
static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct net_device *dev = skb->dev;
|
||||
int ret;
|
||||
|
||||
/* if ingress device is enslaved to an L3 master device pass the
|
||||
@@ -409,7 +409,7 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
if (!skb)
|
||||
return NET_RX_SUCCESS;
|
||||
|
||||
ret = ip_rcv_finish_core(net, sk, skb);
|
||||
ret = ip_rcv_finish_core(net, sk, skb, dev);
|
||||
if (ret != NET_RX_DROP)
|
||||
ret = dst_input(skb);
|
||||
return ret;
|
||||
@@ -545,6 +545,7 @@ static void ip_list_rcv_finish(struct net *net, struct sock *sk,
|
||||
|
||||
INIT_LIST_HEAD(&sublist);
|
||||
list_for_each_entry_safe(skb, next, head, list) {
|
||||
struct net_device *dev = skb->dev;
|
||||
struct dst_entry *dst;
|
||||
|
||||
skb_list_del_init(skb);
|
||||
@@ -554,7 +555,7 @@ static void ip_list_rcv_finish(struct net *net, struct sock *sk,
|
||||
skb = l3mdev_ip_rcv(skb);
|
||||
if (!skb)
|
||||
continue;
|
||||
if (ip_rcv_finish_core(net, sk, skb) == NET_RX_DROP)
|
||||
if (ip_rcv_finish_core(net, sk, skb, dev) == NET_RX_DROP)
|
||||
continue;
|
||||
|
||||
dst = skb_dst(skb);
|
||||
|
||||
+17
-5
@@ -251,8 +251,9 @@ static void spec_dst_fill(__be32 *spec_dst, struct sk_buff *skb)
|
||||
* If opt == NULL, then skb->data should point to IP header.
|
||||
*/
|
||||
|
||||
int ip_options_compile(struct net *net,
|
||||
struct ip_options *opt, struct sk_buff *skb)
|
||||
int __ip_options_compile(struct net *net,
|
||||
struct ip_options *opt, struct sk_buff *skb,
|
||||
__be32 *info)
|
||||
{
|
||||
__be32 spec_dst = htonl(INADDR_ANY);
|
||||
unsigned char *pp_ptr = NULL;
|
||||
@@ -468,11 +469,22 @@ eol:
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (skb) {
|
||||
icmp_send(skb, ICMP_PARAMETERPROB, 0, htonl((pp_ptr-iph)<<24));
|
||||
}
|
||||
if (info)
|
||||
*info = htonl((pp_ptr-iph)<<24);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int ip_options_compile(struct net *net,
|
||||
struct ip_options *opt, struct sk_buff *skb)
|
||||
{
|
||||
int ret;
|
||||
__be32 info;
|
||||
|
||||
ret = __ip_options_compile(net, opt, skb, &info);
|
||||
if (ret != 0 && skb)
|
||||
icmp_send(skb, ICMP_PARAMETERPROB, 0, info);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(ip_options_compile);
|
||||
|
||||
/*
|
||||
|
||||
+14
-5
@@ -3,9 +3,10 @@
|
||||
#include <linux/types.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/netlink.h>
|
||||
#include <linux/in6.h>
|
||||
#include <net/ip.h>
|
||||
|
||||
int rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto,
|
||||
int rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto, u8 family,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
*ip_proto = nla_get_u8(attr);
|
||||
@@ -13,11 +14,19 @@ int rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto,
|
||||
switch (*ip_proto) {
|
||||
case IPPROTO_TCP:
|
||||
case IPPROTO_UDP:
|
||||
case IPPROTO_ICMP:
|
||||
return 0;
|
||||
default:
|
||||
NL_SET_ERR_MSG(extack, "Unsupported ip proto");
|
||||
return -EOPNOTSUPP;
|
||||
case IPPROTO_ICMP:
|
||||
if (family != AF_INET)
|
||||
break;
|
||||
return 0;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
case IPPROTO_ICMPV6:
|
||||
if (family != AF_INET6)
|
||||
break;
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
NL_SET_ERR_MSG(extack, "Unsupported ip proto");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtm_getroute_parse_ip_proto);
|
||||
|
||||
+1
-1
@@ -2876,7 +2876,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
|
||||
if (tb[RTA_IP_PROTO]) {
|
||||
err = rtm_getroute_parse_ip_proto(tb[RTA_IP_PROTO],
|
||||
&ip_proto, extack);
|
||||
&ip_proto, AF_INET, extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
+6
-1
@@ -4176,6 +4176,10 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]);
|
||||
cfg->fc_flags |= RTF_GATEWAY;
|
||||
}
|
||||
if (tb[RTA_VIA]) {
|
||||
NL_SET_ERR_MSG(extack, "IPv6 does not support RTA_VIA attribute");
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (tb[RTA_DST]) {
|
||||
int plen = (rtm->rtm_dst_len + 7) >> 3;
|
||||
@@ -4949,7 +4953,8 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
|
||||
if (tb[RTA_IP_PROTO]) {
|
||||
err = rtm_getroute_parse_ip_proto(tb[RTA_IP_PROTO],
|
||||
&fl6.flowi6_proto, extack);
|
||||
&fl6.flowi6_proto, AF_INET6,
|
||||
extack);
|
||||
if (err)
|
||||
goto errout;
|
||||
}
|
||||
|
||||
@@ -1873,6 +1873,7 @@ static int __net_init sit_init_net(struct net *net)
|
||||
|
||||
err_reg_dev:
|
||||
ipip6_dev_free(sitn->fb_tunnel_dev);
|
||||
free_netdev(sitn->fb_tunnel_dev);
|
||||
err_alloc_dev:
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1874,6 +1874,9 @@ static int rtm_to_route_config(struct sk_buff *skb,
|
||||
goto errout;
|
||||
break;
|
||||
}
|
||||
case RTA_GATEWAY:
|
||||
NL_SET_ERR_MSG(extack, "MPLS does not support RTA_GATEWAY attribute");
|
||||
goto errout;
|
||||
case RTA_VIA:
|
||||
{
|
||||
if (nla_get_via(nla, &cfg->rc_via_alen,
|
||||
|
||||
@@ -903,7 +903,8 @@ int netlbl_bitmap_walk(const unsigned char *bitmap, u32 bitmap_len,
|
||||
(state == 0 && (byte & bitmask) == 0))
|
||||
return bit_spot;
|
||||
|
||||
bit_spot++;
|
||||
if (++bit_spot >= bitmap_len)
|
||||
return -1;
|
||||
bitmask >>= 1;
|
||||
if (bitmask == 0) {
|
||||
byte = bitmap[++byte_offset];
|
||||
|
||||
@@ -419,6 +419,10 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
|
||||
sock->service_name,
|
||||
sock->service_name_len,
|
||||
&service_name_tlv_length);
|
||||
if (!service_name_tlv) {
|
||||
err = -ENOMEM;
|
||||
goto error_tlv;
|
||||
}
|
||||
size += service_name_tlv_length;
|
||||
}
|
||||
|
||||
@@ -429,9 +433,17 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
|
||||
|
||||
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
|
||||
&miux_tlv_length);
|
||||
if (!miux_tlv) {
|
||||
err = -ENOMEM;
|
||||
goto error_tlv;
|
||||
}
|
||||
size += miux_tlv_length;
|
||||
|
||||
rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
|
||||
if (!rw_tlv) {
|
||||
err = -ENOMEM;
|
||||
goto error_tlv;
|
||||
}
|
||||
size += rw_tlv_length;
|
||||
|
||||
pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
|
||||
@@ -484,9 +496,17 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
|
||||
|
||||
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
|
||||
&miux_tlv_length);
|
||||
if (!miux_tlv) {
|
||||
err = -ENOMEM;
|
||||
goto error_tlv;
|
||||
}
|
||||
size += miux_tlv_length;
|
||||
|
||||
rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
|
||||
if (!rw_tlv) {
|
||||
err = -ENOMEM;
|
||||
goto error_tlv;
|
||||
}
|
||||
size += rw_tlv_length;
|
||||
|
||||
skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
|
||||
|
||||
+20
-4
@@ -532,10 +532,10 @@ static u8 nfc_llcp_reserve_sdp_ssap(struct nfc_llcp_local *local)
|
||||
|
||||
static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
|
||||
{
|
||||
u8 *gb_cur, *version_tlv, version, version_length;
|
||||
u8 *lto_tlv, lto_length;
|
||||
u8 *wks_tlv, wks_length;
|
||||
u8 *miux_tlv, miux_length;
|
||||
u8 *gb_cur, version, version_length;
|
||||
u8 lto_length, wks_length, miux_length;
|
||||
u8 *version_tlv = NULL, *lto_tlv = NULL,
|
||||
*wks_tlv = NULL, *miux_tlv = NULL;
|
||||
__be16 wks = cpu_to_be16(local->local_wks);
|
||||
u8 gb_len = 0;
|
||||
int ret = 0;
|
||||
@@ -543,17 +543,33 @@ static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
|
||||
version = LLCP_VERSION_11;
|
||||
version_tlv = nfc_llcp_build_tlv(LLCP_TLV_VERSION, &version,
|
||||
1, &version_length);
|
||||
if (!version_tlv) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
gb_len += version_length;
|
||||
|
||||
lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &local->lto, 1, <o_length);
|
||||
if (!lto_tlv) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
gb_len += lto_length;
|
||||
|
||||
pr_debug("Local wks 0x%lx\n", local->local_wks);
|
||||
wks_tlv = nfc_llcp_build_tlv(LLCP_TLV_WKS, (u8 *)&wks, 2, &wks_length);
|
||||
if (!wks_tlv) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
gb_len += wks_length;
|
||||
|
||||
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0,
|
||||
&miux_length);
|
||||
if (!miux_tlv) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
gb_len += miux_length;
|
||||
|
||||
gb_len += ARRAY_SIZE(llcp_magic);
|
||||
|
||||
+1
-2
@@ -199,8 +199,7 @@ err3:
|
||||
err2:
|
||||
kfree(tname);
|
||||
err1:
|
||||
if (ret == ACT_P_CREATED)
|
||||
tcf_idr_release(*a, bind);
|
||||
tcf_idr_release(*a, bind);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -189,8 +189,7 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,
|
||||
|
||||
params_new = kzalloc(sizeof(*params_new), GFP_KERNEL);
|
||||
if (unlikely(!params_new)) {
|
||||
if (ret == ACT_P_CREATED)
|
||||
tcf_idr_release(*a, bind);
|
||||
tcf_idr_release(*a, bind);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
@@ -394,7 +394,8 @@ release_dst_cache:
|
||||
dst_cache_destroy(&metadata->u.tun_info.dst_cache);
|
||||
#endif
|
||||
release_tun_meta:
|
||||
dst_release(&metadata->dst);
|
||||
if (metadata)
|
||||
dst_release(&metadata->dst);
|
||||
|
||||
err_out:
|
||||
if (exists)
|
||||
|
||||
@@ -447,6 +447,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
int nb = 0;
|
||||
int count = 1;
|
||||
int rc = NET_XMIT_SUCCESS;
|
||||
int rc_drop = NET_XMIT_DROP;
|
||||
|
||||
/* Do not fool qdisc_drop_all() */
|
||||
skb->prev = NULL;
|
||||
@@ -486,6 +487,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
q->duplicate = 0;
|
||||
rootq->enqueue(skb2, rootq, to_free);
|
||||
q->duplicate = dupsave;
|
||||
rc_drop = NET_XMIT_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -498,7 +500,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
if (skb_is_gso(skb)) {
|
||||
segs = netem_segment(skb, sch, to_free);
|
||||
if (!segs)
|
||||
return NET_XMIT_DROP;
|
||||
return rc_drop;
|
||||
} else {
|
||||
segs = skb;
|
||||
}
|
||||
@@ -521,8 +523,10 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
1<<(prandom_u32() % 8);
|
||||
}
|
||||
|
||||
if (unlikely(sch->q.qlen >= sch->limit))
|
||||
return qdisc_drop_all(skb, sch, to_free);
|
||||
if (unlikely(sch->q.qlen >= sch->limit)) {
|
||||
qdisc_drop_all(skb, sch, to_free);
|
||||
return rc_drop;
|
||||
}
|
||||
|
||||
qdisc_qstats_backlog_inc(sch, skb);
|
||||
|
||||
|
||||
+1
-1
@@ -192,7 +192,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
|
||||
if (unlikely(!max_data)) {
|
||||
max_data = sctp_min_frag_point(sctp_sk(asoc->base.sk),
|
||||
sctp_datachk_len(&asoc->stream));
|
||||
pr_warn_ratelimited("%s: asoc:%p frag_point is zero, forcing max_data to default minimum (%Zu)",
|
||||
pr_warn_ratelimited("%s: asoc:%p frag_point is zero, forcing max_data to default minimum (%zu)",
|
||||
__func__, asoc, max_data);
|
||||
}
|
||||
|
||||
|
||||
@@ -577,6 +577,7 @@ static void __sock_release(struct socket *sock, struct inode *inode)
|
||||
if (inode)
|
||||
inode_lock(inode);
|
||||
sock->ops->release(sock);
|
||||
sock->sk = NULL;
|
||||
if (inode)
|
||||
inode_unlock(inode);
|
||||
sock->ops = NULL;
|
||||
|
||||
+5
-1
@@ -379,11 +379,13 @@ static int tipc_sk_sock_err(struct socket *sock, long *timeout)
|
||||
|
||||
#define tipc_wait_for_cond(sock_, timeo_, condition_) \
|
||||
({ \
|
||||
DEFINE_WAIT_FUNC(wait_, woken_wake_function); \
|
||||
struct sock *sk_; \
|
||||
int rc_; \
|
||||
\
|
||||
while ((rc_ = !(condition_))) { \
|
||||
DEFINE_WAIT_FUNC(wait_, woken_wake_function); \
|
||||
/* coupled with smp_wmb() in tipc_sk_proto_rcv() */ \
|
||||
smp_rmb(); \
|
||||
sk_ = (sock_)->sk; \
|
||||
rc_ = tipc_sk_sock_err((sock_), timeo_); \
|
||||
if (rc_) \
|
||||
@@ -1983,6 +1985,8 @@ static void tipc_sk_proto_rcv(struct sock *sk,
|
||||
return;
|
||||
case SOCK_WAKEUP:
|
||||
tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0);
|
||||
/* coupled with smp_rmb() in tipc_wait_for_cond() */
|
||||
smp_wmb();
|
||||
tsk->cong_link_cnt--;
|
||||
wakeup = true;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user