You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/a2mp.h>
|
||||
#include <net/bluetooth/smp.h>
|
||||
|
||||
static void hci_le_connect(struct hci_conn *conn)
|
||||
{
|
||||
@@ -619,6 +620,9 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
|
||||
{
|
||||
BT_DBG("hcon %p", conn);
|
||||
|
||||
if (conn->type == LE_LINK)
|
||||
return smp_conn_security(conn, sec_level);
|
||||
|
||||
/* For sdp we don't need the link key. */
|
||||
if (sec_level == BT_SECURITY_SDP)
|
||||
return 1;
|
||||
|
||||
@@ -1365,6 +1365,9 @@ static bool hci_resolve_next_name(struct hci_dev *hdev)
|
||||
return false;
|
||||
|
||||
e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
|
||||
if (!e)
|
||||
return false;
|
||||
|
||||
if (hci_resolve_name(hdev, e) == 0) {
|
||||
e->name_state = NAME_PENDING;
|
||||
return true;
|
||||
@@ -1393,12 +1396,20 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
|
||||
return;
|
||||
|
||||
e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
|
||||
if (e) {
|
||||
/* If the device was not found in a list of found devices names of which
|
||||
* are pending. there is no need to continue resolving a next name as it
|
||||
* will be done upon receiving another Remote Name Request Complete
|
||||
* Event */
|
||||
if (!e)
|
||||
return;
|
||||
|
||||
list_del(&e->list);
|
||||
if (name) {
|
||||
e->name_state = NAME_KNOWN;
|
||||
list_del(&e->list);
|
||||
if (name)
|
||||
mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
|
||||
e->data.rssi, name, name_len);
|
||||
mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
|
||||
e->data.rssi, name, name_len);
|
||||
} else {
|
||||
e->name_state = NAME_NOT_KNOWN;
|
||||
}
|
||||
|
||||
if (hci_resolve_next_name(hdev))
|
||||
@@ -1749,7 +1760,12 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
if (conn->type == ACL_LINK) {
|
||||
conn->state = BT_CONFIG;
|
||||
hci_conn_hold(conn);
|
||||
conn->disc_timeout = HCI_DISCONN_TIMEOUT;
|
||||
|
||||
if (!conn->out && !hci_conn_ssp_enabled(conn) &&
|
||||
!hci_find_link_key(hdev, &ev->bdaddr))
|
||||
conn->disc_timeout = HCI_PAIRING_TIMEOUT;
|
||||
else
|
||||
conn->disc_timeout = HCI_DISCONN_TIMEOUT;
|
||||
} else
|
||||
conn->state = BT_CONNECTED;
|
||||
|
||||
|
||||
@@ -1198,6 +1198,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)
|
||||
sk = chan->sk;
|
||||
|
||||
hci_conn_hold(conn->hcon);
|
||||
conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
|
||||
|
||||
bacpy(&bt_sk(sk)->src, conn->src);
|
||||
bacpy(&bt_sk(sk)->dst, conn->dst);
|
||||
@@ -1215,14 +1216,15 @@ clean:
|
||||
static void l2cap_conn_ready(struct l2cap_conn *conn)
|
||||
{
|
||||
struct l2cap_chan *chan;
|
||||
struct hci_conn *hcon = conn->hcon;
|
||||
|
||||
BT_DBG("conn %p", conn);
|
||||
|
||||
if (!conn->hcon->out && conn->hcon->type == LE_LINK)
|
||||
if (!hcon->out && hcon->type == LE_LINK)
|
||||
l2cap_le_conn_ready(conn);
|
||||
|
||||
if (conn->hcon->out && conn->hcon->type == LE_LINK)
|
||||
smp_conn_security(conn, conn->hcon->pending_sec_level);
|
||||
if (hcon->out && hcon->type == LE_LINK)
|
||||
smp_conn_security(hcon, hcon->pending_sec_level);
|
||||
|
||||
mutex_lock(&conn->chan_lock);
|
||||
|
||||
@@ -1235,8 +1237,8 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (conn->hcon->type == LE_LINK) {
|
||||
if (smp_conn_security(conn, chan->sec_level))
|
||||
if (hcon->type == LE_LINK) {
|
||||
if (smp_conn_security(hcon, chan->sec_level))
|
||||
l2cap_chan_ready(chan);
|
||||
|
||||
} else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
|
||||
|
||||
@@ -619,7 +619,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
|
||||
break;
|
||||
}
|
||||
|
||||
if (smp_conn_security(conn, sec.level))
|
||||
if (smp_conn_security(conn->hcon, sec.level))
|
||||
break;
|
||||
sk->sk_state = BT_CONFIG;
|
||||
chan->state = BT_CONFIG;
|
||||
@@ -1180,7 +1180,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p
|
||||
|
||||
chan = l2cap_chan_create();
|
||||
if (!chan) {
|
||||
l2cap_sock_kill(sk);
|
||||
sk_free(sk);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
+9
-10
@@ -131,6 +131,15 @@ static int sco_conn_del(struct hci_conn *hcon, int err)
|
||||
sco_sock_clear_timer(sk);
|
||||
sco_chan_del(sk, err);
|
||||
bh_unlock_sock(sk);
|
||||
|
||||
sco_conn_lock(conn);
|
||||
conn->sk = NULL;
|
||||
sco_pi(sk)->conn = NULL;
|
||||
sco_conn_unlock(conn);
|
||||
|
||||
if (conn->hcon)
|
||||
hci_conn_put(conn->hcon);
|
||||
|
||||
sco_sock_kill(sk);
|
||||
}
|
||||
|
||||
@@ -821,16 +830,6 @@ static void sco_chan_del(struct sock *sk, int err)
|
||||
|
||||
BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
|
||||
|
||||
if (conn) {
|
||||
sco_conn_lock(conn);
|
||||
conn->sk = NULL;
|
||||
sco_pi(sk)->conn = NULL;
|
||||
sco_conn_unlock(conn);
|
||||
|
||||
if (conn->hcon)
|
||||
hci_conn_put(conn->hcon);
|
||||
}
|
||||
|
||||
sk->sk_state = BT_CLOSED;
|
||||
sk->sk_err = err;
|
||||
sk->sk_state_change(sk);
|
||||
|
||||
+9
-6
@@ -267,10 +267,10 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send)
|
||||
mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type,
|
||||
hcon->dst_type, reason);
|
||||
|
||||
if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
|
||||
cancel_delayed_work_sync(&conn->security_timer);
|
||||
cancel_delayed_work_sync(&conn->security_timer);
|
||||
|
||||
if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))
|
||||
smp_chan_destroy(conn);
|
||||
}
|
||||
}
|
||||
|
||||
#define JUST_WORKS 0x00
|
||||
@@ -579,8 +579,11 @@ static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
|
||||
|
||||
if (!test_and_set_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))
|
||||
smp = smp_chan_create(conn);
|
||||
else
|
||||
smp = conn->smp_chan;
|
||||
|
||||
smp = conn->smp_chan;
|
||||
if (!smp)
|
||||
return SMP_UNSPECIFIED;
|
||||
|
||||
smp->preq[0] = SMP_CMD_PAIRING_REQ;
|
||||
memcpy(&smp->preq[1], req, sizeof(*req));
|
||||
@@ -757,9 +760,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
|
||||
int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
|
||||
{
|
||||
struct hci_conn *hcon = conn->hcon;
|
||||
struct l2cap_conn *conn = hcon->l2cap_data;
|
||||
struct smp_chan *smp = conn->smp_chan;
|
||||
__u8 authreq;
|
||||
|
||||
|
||||
@@ -141,7 +141,7 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
err = sk_filter(sk, skb);
|
||||
if (err)
|
||||
return err;
|
||||
if (!sk_rmem_schedule(sk, skb->truesize) && rx_flow_is_on(cf_sk)) {
|
||||
if (!sk_rmem_schedule(sk, skb, skb->truesize) && rx_flow_is_on(cf_sk)) {
|
||||
set_rx_flow_off(cf_sk);
|
||||
net_dbg_ratelimited("sending flow OFF due to rmem_schedule\n");
|
||||
caif_flow_ctrl(sk, CAIF_MODEMCMD_FLOW_OFF_REQ);
|
||||
|
||||
+10
-15
@@ -17,6 +17,7 @@
|
||||
#include <linux/string.h>
|
||||
|
||||
|
||||
#include <linux/ceph/ceph_features.h>
|
||||
#include <linux/ceph/libceph.h>
|
||||
#include <linux/ceph/debugfs.h>
|
||||
#include <linux/ceph/decode.h>
|
||||
@@ -460,27 +461,23 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private,
|
||||
client->auth_err = 0;
|
||||
|
||||
client->extra_mon_dispatch = NULL;
|
||||
client->supported_features = CEPH_FEATURE_SUPPORTED_DEFAULT |
|
||||
client->supported_features = CEPH_FEATURES_SUPPORTED_DEFAULT |
|
||||
supported_features;
|
||||
client->required_features = CEPH_FEATURE_REQUIRED_DEFAULT |
|
||||
client->required_features = CEPH_FEATURES_REQUIRED_DEFAULT |
|
||||
required_features;
|
||||
|
||||
/* msgr */
|
||||
if (ceph_test_opt(client, MYIP))
|
||||
myaddr = &client->options->my_addr;
|
||||
client->msgr = ceph_messenger_create(myaddr,
|
||||
client->supported_features,
|
||||
client->required_features);
|
||||
if (IS_ERR(client->msgr)) {
|
||||
err = PTR_ERR(client->msgr);
|
||||
goto fail;
|
||||
}
|
||||
client->msgr->nocrc = ceph_test_opt(client, NOCRC);
|
||||
ceph_messenger_init(&client->msgr, myaddr,
|
||||
client->supported_features,
|
||||
client->required_features,
|
||||
ceph_test_opt(client, NOCRC));
|
||||
|
||||
/* subsystems */
|
||||
err = ceph_monc_init(&client->monc, client);
|
||||
if (err < 0)
|
||||
goto fail_msgr;
|
||||
goto fail;
|
||||
err = ceph_osdc_init(&client->osdc, client);
|
||||
if (err < 0)
|
||||
goto fail_monc;
|
||||
@@ -489,8 +486,6 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private,
|
||||
|
||||
fail_monc:
|
||||
ceph_monc_stop(&client->monc);
|
||||
fail_msgr:
|
||||
ceph_messenger_destroy(client->msgr);
|
||||
fail:
|
||||
kfree(client);
|
||||
return ERR_PTR(err);
|
||||
@@ -501,6 +496,8 @@ void ceph_destroy_client(struct ceph_client *client)
|
||||
{
|
||||
dout("destroy_client %p\n", client);
|
||||
|
||||
atomic_set(&client->msgr.stopping, 1);
|
||||
|
||||
/* unmount */
|
||||
ceph_osdc_stop(&client->osdc);
|
||||
|
||||
@@ -508,8 +505,6 @@ void ceph_destroy_client(struct ceph_client *client)
|
||||
|
||||
ceph_debugfs_client_cleanup(client);
|
||||
|
||||
ceph_messenger_destroy(client->msgr);
|
||||
|
||||
ceph_destroy_options(client->options);
|
||||
|
||||
kfree(client);
|
||||
|
||||
@@ -306,7 +306,6 @@ static int crush_choose(const struct crush_map *map,
|
||||
int item = 0;
|
||||
int itemtype;
|
||||
int collide, reject;
|
||||
const unsigned int orig_tries = 5; /* attempts before we fall back to search */
|
||||
|
||||
dprintk("CHOOSE%s bucket %d x %d outpos %d numrep %d\n", recurse_to_leaf ? "_LEAF" : "",
|
||||
bucket->id, x, outpos, numrep);
|
||||
@@ -351,8 +350,9 @@ static int crush_choose(const struct crush_map *map,
|
||||
reject = 1;
|
||||
goto reject;
|
||||
}
|
||||
if (flocal >= (in->size>>1) &&
|
||||
flocal > orig_tries)
|
||||
if (map->choose_local_fallback_tries > 0 &&
|
||||
flocal >= (in->size>>1) &&
|
||||
flocal > map->choose_local_fallback_tries)
|
||||
item = bucket_perm_choose(in, x, r);
|
||||
else
|
||||
item = crush_bucket_choose(in, x, r);
|
||||
@@ -422,13 +422,14 @@ reject:
|
||||
ftotal++;
|
||||
flocal++;
|
||||
|
||||
if (collide && flocal < 3)
|
||||
if (collide && flocal <= map->choose_local_tries)
|
||||
/* retry locally a few times */
|
||||
retry_bucket = 1;
|
||||
else if (flocal <= in->size + orig_tries)
|
||||
else if (map->choose_local_fallback_tries > 0 &&
|
||||
flocal <= in->size + map->choose_local_fallback_tries)
|
||||
/* exhaustive bucket search */
|
||||
retry_bucket = 1;
|
||||
else if (ftotal < 20)
|
||||
else if (ftotal <= map->choose_total_tries)
|
||||
/* then retry descent */
|
||||
retry_descent = 1;
|
||||
else
|
||||
|
||||
+577
-358
File diff suppressed because it is too large
Load Diff
+43
-33
@@ -106,9 +106,9 @@ static void __send_prepared_auth_request(struct ceph_mon_client *monc, int len)
|
||||
monc->pending_auth = 1;
|
||||
monc->m_auth->front.iov_len = len;
|
||||
monc->m_auth->hdr.front_len = cpu_to_le32(len);
|
||||
ceph_con_revoke(monc->con, monc->m_auth);
|
||||
ceph_msg_revoke(monc->m_auth);
|
||||
ceph_msg_get(monc->m_auth); /* keep our ref */
|
||||
ceph_con_send(monc->con, monc->m_auth);
|
||||
ceph_con_send(&monc->con, monc->m_auth);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -117,8 +117,11 @@ static void __send_prepared_auth_request(struct ceph_mon_client *monc, int len)
|
||||
static void __close_session(struct ceph_mon_client *monc)
|
||||
{
|
||||
dout("__close_session closing mon%d\n", monc->cur_mon);
|
||||
ceph_con_revoke(monc->con, monc->m_auth);
|
||||
ceph_con_close(monc->con);
|
||||
ceph_msg_revoke(monc->m_auth);
|
||||
ceph_msg_revoke_incoming(monc->m_auth_reply);
|
||||
ceph_msg_revoke(monc->m_subscribe);
|
||||
ceph_msg_revoke_incoming(monc->m_subscribe_ack);
|
||||
ceph_con_close(&monc->con);
|
||||
monc->cur_mon = -1;
|
||||
monc->pending_auth = 0;
|
||||
ceph_auth_reset(monc->auth);
|
||||
@@ -142,9 +145,8 @@ static int __open_session(struct ceph_mon_client *monc)
|
||||
monc->want_next_osdmap = !!monc->want_next_osdmap;
|
||||
|
||||
dout("open_session mon%d opening\n", monc->cur_mon);
|
||||
monc->con->peer_name.type = CEPH_ENTITY_TYPE_MON;
|
||||
monc->con->peer_name.num = cpu_to_le64(monc->cur_mon);
|
||||
ceph_con_open(monc->con,
|
||||
ceph_con_open(&monc->con,
|
||||
CEPH_ENTITY_TYPE_MON, monc->cur_mon,
|
||||
&monc->monmap->mon_inst[monc->cur_mon].addr);
|
||||
|
||||
/* initiatiate authentication handshake */
|
||||
@@ -226,8 +228,8 @@ static void __send_subscribe(struct ceph_mon_client *monc)
|
||||
|
||||
msg->front.iov_len = p - msg->front.iov_base;
|
||||
msg->hdr.front_len = cpu_to_le32(msg->front.iov_len);
|
||||
ceph_con_revoke(monc->con, msg);
|
||||
ceph_con_send(monc->con, ceph_msg_get(msg));
|
||||
ceph_msg_revoke(msg);
|
||||
ceph_con_send(&monc->con, ceph_msg_get(msg));
|
||||
|
||||
monc->sub_sent = jiffies | 1; /* never 0 */
|
||||
}
|
||||
@@ -247,7 +249,7 @@ static void handle_subscribe_ack(struct ceph_mon_client *monc,
|
||||
if (monc->hunting) {
|
||||
pr_info("mon%d %s session established\n",
|
||||
monc->cur_mon,
|
||||
ceph_pr_addr(&monc->con->peer_addr.in_addr));
|
||||
ceph_pr_addr(&monc->con.peer_addr.in_addr));
|
||||
monc->hunting = false;
|
||||
}
|
||||
dout("handle_subscribe_ack after %d seconds\n", seconds);
|
||||
@@ -439,6 +441,7 @@ static struct ceph_msg *get_generic_reply(struct ceph_connection *con,
|
||||
m = NULL;
|
||||
} else {
|
||||
dout("get_generic_reply %lld got %p\n", tid, req->reply);
|
||||
*skip = 0;
|
||||
m = ceph_msg_get(req->reply);
|
||||
/*
|
||||
* we don't need to track the connection reading into
|
||||
@@ -461,7 +464,7 @@ static int do_generic_request(struct ceph_mon_client *monc,
|
||||
req->request->hdr.tid = cpu_to_le64(req->tid);
|
||||
__insert_generic_request(monc, req);
|
||||
monc->num_generic_requests++;
|
||||
ceph_con_send(monc->con, ceph_msg_get(req->request));
|
||||
ceph_con_send(&monc->con, ceph_msg_get(req->request));
|
||||
mutex_unlock(&monc->mutex);
|
||||
|
||||
err = wait_for_completion_interruptible(&req->completion);
|
||||
@@ -684,8 +687,9 @@ static void __resend_generic_request(struct ceph_mon_client *monc)
|
||||
|
||||
for (p = rb_first(&monc->generic_request_tree); p; p = rb_next(p)) {
|
||||
req = rb_entry(p, struct ceph_mon_generic_request, node);
|
||||
ceph_con_revoke(monc->con, req->request);
|
||||
ceph_con_send(monc->con, ceph_msg_get(req->request));
|
||||
ceph_msg_revoke(req->request);
|
||||
ceph_msg_revoke_incoming(req->reply);
|
||||
ceph_con_send(&monc->con, ceph_msg_get(req->request));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -705,7 +709,7 @@ static void delayed_work(struct work_struct *work)
|
||||
__close_session(monc);
|
||||
__open_session(monc); /* continue hunting */
|
||||
} else {
|
||||
ceph_con_keepalive(monc->con);
|
||||
ceph_con_keepalive(&monc->con);
|
||||
|
||||
__validate_auth(monc);
|
||||
|
||||
@@ -760,19 +764,12 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
|
||||
goto out;
|
||||
|
||||
/* connection */
|
||||
monc->con = kmalloc(sizeof(*monc->con), GFP_KERNEL);
|
||||
if (!monc->con)
|
||||
goto out_monmap;
|
||||
ceph_con_init(monc->client->msgr, monc->con);
|
||||
monc->con->private = monc;
|
||||
monc->con->ops = &mon_con_ops;
|
||||
|
||||
/* authentication */
|
||||
monc->auth = ceph_auth_init(cl->options->name,
|
||||
cl->options->key);
|
||||
if (IS_ERR(monc->auth)) {
|
||||
err = PTR_ERR(monc->auth);
|
||||
goto out_con;
|
||||
goto out_monmap;
|
||||
}
|
||||
monc->auth->want_keys =
|
||||
CEPH_ENTITY_TYPE_AUTH | CEPH_ENTITY_TYPE_MON |
|
||||
@@ -801,6 +798,9 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
|
||||
if (!monc->m_auth)
|
||||
goto out_auth_reply;
|
||||
|
||||
ceph_con_init(&monc->con, monc, &mon_con_ops,
|
||||
&monc->client->msgr);
|
||||
|
||||
monc->cur_mon = -1;
|
||||
monc->hunting = true;
|
||||
monc->sub_renew_after = jiffies;
|
||||
@@ -824,8 +824,6 @@ out_subscribe_ack:
|
||||
ceph_msg_put(monc->m_subscribe_ack);
|
||||
out_auth:
|
||||
ceph_auth_destroy(monc->auth);
|
||||
out_con:
|
||||
monc->con->ops->put(monc->con);
|
||||
out_monmap:
|
||||
kfree(monc->monmap);
|
||||
out:
|
||||
@@ -841,10 +839,6 @@ void ceph_monc_stop(struct ceph_mon_client *monc)
|
||||
mutex_lock(&monc->mutex);
|
||||
__close_session(monc);
|
||||
|
||||
monc->con->private = NULL;
|
||||
monc->con->ops->put(monc->con);
|
||||
monc->con = NULL;
|
||||
|
||||
mutex_unlock(&monc->mutex);
|
||||
|
||||
/*
|
||||
@@ -888,8 +882,8 @@ static void handle_auth_reply(struct ceph_mon_client *monc,
|
||||
} else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) {
|
||||
dout("authenticated, starting session\n");
|
||||
|
||||
monc->client->msgr->inst.name.type = CEPH_ENTITY_TYPE_CLIENT;
|
||||
monc->client->msgr->inst.name.num =
|
||||
monc->client->msgr.inst.name.type = CEPH_ENTITY_TYPE_CLIENT;
|
||||
monc->client->msgr.inst.name.num =
|
||||
cpu_to_le64(monc->auth->global_id);
|
||||
|
||||
__send_subscribe(monc);
|
||||
@@ -1000,6 +994,8 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
|
||||
case CEPH_MSG_MDS_MAP:
|
||||
case CEPH_MSG_OSD_MAP:
|
||||
m = ceph_msg_new(type, front_len, GFP_NOFS, false);
|
||||
if (!m)
|
||||
return NULL; /* ENOMEM--return skip == 0 */
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1029,7 +1025,7 @@ static void mon_fault(struct ceph_connection *con)
|
||||
if (!monc->hunting)
|
||||
pr_info("mon%d %s session lost, "
|
||||
"hunting for new mon\n", monc->cur_mon,
|
||||
ceph_pr_addr(&monc->con->peer_addr.in_addr));
|
||||
ceph_pr_addr(&monc->con.peer_addr.in_addr));
|
||||
|
||||
__close_session(monc);
|
||||
if (!monc->hunting) {
|
||||
@@ -1044,9 +1040,23 @@ out:
|
||||
mutex_unlock(&monc->mutex);
|
||||
}
|
||||
|
||||
/*
|
||||
* We can ignore refcounting on the connection struct, as all references
|
||||
* will come from the messenger workqueue, which is drained prior to
|
||||
* mon_client destruction.
|
||||
*/
|
||||
static struct ceph_connection *con_get(struct ceph_connection *con)
|
||||
{
|
||||
return con;
|
||||
}
|
||||
|
||||
static void con_put(struct ceph_connection *con)
|
||||
{
|
||||
}
|
||||
|
||||
static const struct ceph_connection_operations mon_con_ops = {
|
||||
.get = ceph_con_get,
|
||||
.put = ceph_con_put,
|
||||
.get = con_get,
|
||||
.put = con_put,
|
||||
.dispatch = dispatch,
|
||||
.fault = mon_fault,
|
||||
.alloc_msg = mon_alloc_msg,
|
||||
|
||||
+4
-3
@@ -12,7 +12,7 @@ static void *msgpool_alloc(gfp_t gfp_mask, void *arg)
|
||||
struct ceph_msgpool *pool = arg;
|
||||
struct ceph_msg *msg;
|
||||
|
||||
msg = ceph_msg_new(0, pool->front_len, gfp_mask, true);
|
||||
msg = ceph_msg_new(pool->type, pool->front_len, gfp_mask, true);
|
||||
if (!msg) {
|
||||
dout("msgpool_alloc %s failed\n", pool->name);
|
||||
} else {
|
||||
@@ -32,10 +32,11 @@ static void msgpool_free(void *element, void *arg)
|
||||
ceph_msg_put(msg);
|
||||
}
|
||||
|
||||
int ceph_msgpool_init(struct ceph_msgpool *pool,
|
||||
int ceph_msgpool_init(struct ceph_msgpool *pool, int type,
|
||||
int front_len, int size, bool blocking, const char *name)
|
||||
{
|
||||
dout("msgpool %s init\n", name);
|
||||
pool->type = type;
|
||||
pool->front_len = front_len;
|
||||
pool->pool = mempool_create(size, msgpool_alloc, msgpool_free, pool);
|
||||
if (!pool->pool)
|
||||
@@ -61,7 +62,7 @@ struct ceph_msg *ceph_msgpool_get(struct ceph_msgpool *pool,
|
||||
WARN_ON(1);
|
||||
|
||||
/* try to alloc a fresh message */
|
||||
return ceph_msg_new(0, front_len, GFP_NOFS, false);
|
||||
return ceph_msg_new(pool->type, front_len, GFP_NOFS, false);
|
||||
}
|
||||
|
||||
msg = mempool_alloc(pool->pool, GFP_NOFS);
|
||||
|
||||
+48
-29
@@ -140,10 +140,9 @@ void ceph_osdc_release_request(struct kref *kref)
|
||||
if (req->r_request)
|
||||
ceph_msg_put(req->r_request);
|
||||
if (req->r_con_filling_msg) {
|
||||
dout("release_request revoking pages %p from con %p\n",
|
||||
dout("%s revoking pages %p from con %p\n", __func__,
|
||||
req->r_pages, req->r_con_filling_msg);
|
||||
ceph_con_revoke_message(req->r_con_filling_msg,
|
||||
req->r_reply);
|
||||
ceph_msg_revoke_incoming(req->r_reply);
|
||||
req->r_con_filling_msg->ops->put(req->r_con_filling_msg);
|
||||
}
|
||||
if (req->r_reply)
|
||||
@@ -214,10 +213,13 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
|
||||
kref_init(&req->r_kref);
|
||||
init_completion(&req->r_completion);
|
||||
init_completion(&req->r_safe_completion);
|
||||
rb_init_node(&req->r_node);
|
||||
INIT_LIST_HEAD(&req->r_unsafe_item);
|
||||
INIT_LIST_HEAD(&req->r_linger_item);
|
||||
INIT_LIST_HEAD(&req->r_linger_osd);
|
||||
INIT_LIST_HEAD(&req->r_req_lru_item);
|
||||
INIT_LIST_HEAD(&req->r_osd_item);
|
||||
|
||||
req->r_flags = flags;
|
||||
|
||||
WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0);
|
||||
@@ -243,6 +245,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
|
||||
}
|
||||
ceph_pagelist_init(req->r_trail);
|
||||
}
|
||||
|
||||
/* create request message; allow space for oid */
|
||||
msg_size += MAX_OBJ_NAME_SIZE;
|
||||
if (snapc)
|
||||
@@ -256,7 +259,6 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
msg->hdr.type = cpu_to_le16(CEPH_MSG_OSD_OP);
|
||||
memset(msg->front.iov_base, 0, msg->front.iov_len);
|
||||
|
||||
req->r_request = msg;
|
||||
@@ -624,7 +626,7 @@ static void osd_reset(struct ceph_connection *con)
|
||||
/*
|
||||
* Track open sessions with osds.
|
||||
*/
|
||||
static struct ceph_osd *create_osd(struct ceph_osd_client *osdc)
|
||||
static struct ceph_osd *create_osd(struct ceph_osd_client *osdc, int onum)
|
||||
{
|
||||
struct ceph_osd *osd;
|
||||
|
||||
@@ -634,15 +636,13 @@ static struct ceph_osd *create_osd(struct ceph_osd_client *osdc)
|
||||
|
||||
atomic_set(&osd->o_ref, 1);
|
||||
osd->o_osdc = osdc;
|
||||
osd->o_osd = onum;
|
||||
INIT_LIST_HEAD(&osd->o_requests);
|
||||
INIT_LIST_HEAD(&osd->o_linger_requests);
|
||||
INIT_LIST_HEAD(&osd->o_osd_lru);
|
||||
osd->o_incarnation = 1;
|
||||
|
||||
ceph_con_init(osdc->client->msgr, &osd->o_con);
|
||||
osd->o_con.private = osd;
|
||||
osd->o_con.ops = &osd_con_ops;
|
||||
osd->o_con.peer_name.type = CEPH_ENTITY_TYPE_OSD;
|
||||
ceph_con_init(&osd->o_con, osd, &osd_con_ops, &osdc->client->msgr);
|
||||
|
||||
INIT_LIST_HEAD(&osd->o_keepalive_item);
|
||||
return osd;
|
||||
@@ -688,7 +688,7 @@ static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
||||
|
||||
static void remove_all_osds(struct ceph_osd_client *osdc)
|
||||
{
|
||||
dout("__remove_old_osds %p\n", osdc);
|
||||
dout("%s %p\n", __func__, osdc);
|
||||
mutex_lock(&osdc->request_mutex);
|
||||
while (!RB_EMPTY_ROOT(&osdc->osds)) {
|
||||
struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds),
|
||||
@@ -752,7 +752,8 @@ static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
||||
ret = -EAGAIN;
|
||||
} else {
|
||||
ceph_con_close(&osd->o_con);
|
||||
ceph_con_open(&osd->o_con, &osdc->osdmap->osd_addr[osd->o_osd]);
|
||||
ceph_con_open(&osd->o_con, CEPH_ENTITY_TYPE_OSD, osd->o_osd,
|
||||
&osdc->osdmap->osd_addr[osd->o_osd]);
|
||||
osd->o_incarnation++;
|
||||
}
|
||||
return ret;
|
||||
@@ -853,7 +854,7 @@ static void __unregister_request(struct ceph_osd_client *osdc,
|
||||
|
||||
if (req->r_osd) {
|
||||
/* make sure the original request isn't in flight. */
|
||||
ceph_con_revoke(&req->r_osd->o_con, req->r_request);
|
||||
ceph_msg_revoke(req->r_request);
|
||||
|
||||
list_del_init(&req->r_osd_item);
|
||||
if (list_empty(&req->r_osd->o_requests) &&
|
||||
@@ -880,7 +881,7 @@ static void __unregister_request(struct ceph_osd_client *osdc,
|
||||
static void __cancel_request(struct ceph_osd_request *req)
|
||||
{
|
||||
if (req->r_sent && req->r_osd) {
|
||||
ceph_con_revoke(&req->r_osd->o_con, req->r_request);
|
||||
ceph_msg_revoke(req->r_request);
|
||||
req->r_sent = 0;
|
||||
}
|
||||
}
|
||||
@@ -890,7 +891,9 @@ static void __register_linger_request(struct ceph_osd_client *osdc,
|
||||
{
|
||||
dout("__register_linger_request %p\n", req);
|
||||
list_add_tail(&req->r_linger_item, &osdc->req_linger);
|
||||
list_add_tail(&req->r_linger_osd, &req->r_osd->o_linger_requests);
|
||||
if (req->r_osd)
|
||||
list_add_tail(&req->r_linger_osd,
|
||||
&req->r_osd->o_linger_requests);
|
||||
}
|
||||
|
||||
static void __unregister_linger_request(struct ceph_osd_client *osdc,
|
||||
@@ -998,18 +1001,18 @@ static int __map_request(struct ceph_osd_client *osdc,
|
||||
req->r_osd = __lookup_osd(osdc, o);
|
||||
if (!req->r_osd && o >= 0) {
|
||||
err = -ENOMEM;
|
||||
req->r_osd = create_osd(osdc);
|
||||
req->r_osd = create_osd(osdc, o);
|
||||
if (!req->r_osd) {
|
||||
list_move(&req->r_req_lru_item, &osdc->req_notarget);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dout("map_request osd %p is osd%d\n", req->r_osd, o);
|
||||
req->r_osd->o_osd = o;
|
||||
req->r_osd->o_con.peer_name.num = cpu_to_le64(o);
|
||||
__insert_osd(osdc, req->r_osd);
|
||||
|
||||
ceph_con_open(&req->r_osd->o_con, &osdc->osdmap->osd_addr[o]);
|
||||
ceph_con_open(&req->r_osd->o_con,
|
||||
CEPH_ENTITY_TYPE_OSD, o,
|
||||
&osdc->osdmap->osd_addr[o]);
|
||||
}
|
||||
|
||||
if (req->r_osd) {
|
||||
@@ -1304,8 +1307,9 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
||||
|
||||
dout("kick_requests %s\n", force_resend ? " (force resend)" : "");
|
||||
mutex_lock(&osdc->request_mutex);
|
||||
for (p = rb_first(&osdc->requests); p; p = rb_next(p)) {
|
||||
for (p = rb_first(&osdc->requests); p; ) {
|
||||
req = rb_entry(p, struct ceph_osd_request, r_node);
|
||||
p = rb_next(p);
|
||||
err = __map_request(osdc, req, force_resend);
|
||||
if (err < 0)
|
||||
continue; /* error */
|
||||
@@ -1313,10 +1317,23 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
||||
dout("%p tid %llu maps to no osd\n", req, req->r_tid);
|
||||
needmap++; /* request a newer map */
|
||||
} else if (err > 0) {
|
||||
dout("%p tid %llu requeued on osd%d\n", req, req->r_tid,
|
||||
req->r_osd ? req->r_osd->o_osd : -1);
|
||||
if (!req->r_linger)
|
||||
if (!req->r_linger) {
|
||||
dout("%p tid %llu requeued on osd%d\n", req,
|
||||
req->r_tid,
|
||||
req->r_osd ? req->r_osd->o_osd : -1);
|
||||
req->r_flags |= CEPH_OSD_FLAG_RETRY;
|
||||
}
|
||||
}
|
||||
if (req->r_linger && list_empty(&req->r_linger_item)) {
|
||||
/*
|
||||
* register as a linger so that we will
|
||||
* re-submit below and get a new tid
|
||||
*/
|
||||
dout("%p tid %llu restart on osd%d\n",
|
||||
req, req->r_tid,
|
||||
req->r_osd ? req->r_osd->o_osd : -1);
|
||||
__register_linger_request(osdc, req);
|
||||
__unregister_request(osdc, req);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1391,7 +1408,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
epoch, maplen);
|
||||
newmap = osdmap_apply_incremental(&p, next,
|
||||
osdc->osdmap,
|
||||
osdc->client->msgr);
|
||||
&osdc->client->msgr);
|
||||
if (IS_ERR(newmap)) {
|
||||
err = PTR_ERR(newmap);
|
||||
goto bad;
|
||||
@@ -1839,11 +1856,12 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
|
||||
if (!osdc->req_mempool)
|
||||
goto out;
|
||||
|
||||
err = ceph_msgpool_init(&osdc->msgpool_op, OSD_OP_FRONT_LEN, 10, true,
|
||||
err = ceph_msgpool_init(&osdc->msgpool_op, CEPH_MSG_OSD_OP,
|
||||
OSD_OP_FRONT_LEN, 10, true,
|
||||
"osd_op");
|
||||
if (err < 0)
|
||||
goto out_mempool;
|
||||
err = ceph_msgpool_init(&osdc->msgpool_op_reply,
|
||||
err = ceph_msgpool_init(&osdc->msgpool_op_reply, CEPH_MSG_OSD_OPREPLY,
|
||||
OSD_OPREPLY_FRONT_LEN, 10, true,
|
||||
"osd_op_reply");
|
||||
if (err < 0)
|
||||
@@ -2019,15 +2037,15 @@ static struct ceph_msg *get_reply(struct ceph_connection *con,
|
||||
if (!req) {
|
||||
*skip = 1;
|
||||
m = NULL;
|
||||
pr_info("get_reply unknown tid %llu from osd%d\n", tid,
|
||||
osd->o_osd);
|
||||
dout("get_reply unknown tid %llu from osd%d\n", tid,
|
||||
osd->o_osd);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (req->r_con_filling_msg) {
|
||||
dout("get_reply revoking msg %p from old con %p\n",
|
||||
dout("%s revoking msg %p from old con %p\n", __func__,
|
||||
req->r_reply, req->r_con_filling_msg);
|
||||
ceph_con_revoke_message(req->r_con_filling_msg, req->r_reply);
|
||||
ceph_msg_revoke_incoming(req->r_reply);
|
||||
req->r_con_filling_msg->ops->put(req->r_con_filling_msg);
|
||||
req->r_con_filling_msg = NULL;
|
||||
}
|
||||
@@ -2080,6 +2098,7 @@ static struct ceph_msg *alloc_msg(struct ceph_connection *con,
|
||||
int type = le16_to_cpu(hdr->type);
|
||||
int front = le32_to_cpu(hdr->front_len);
|
||||
|
||||
*skip = 0;
|
||||
switch (type) {
|
||||
case CEPH_MSG_OSD_MAP:
|
||||
case CEPH_MSG_WATCH_NOTIFY:
|
||||
|
||||
+53
-6
@@ -135,6 +135,21 @@ bad:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int skip_name_map(void **p, void *end)
|
||||
{
|
||||
int len;
|
||||
ceph_decode_32_safe(p, end, len ,bad);
|
||||
while (len--) {
|
||||
int strlen;
|
||||
*p += sizeof(u32);
|
||||
ceph_decode_32_safe(p, end, strlen, bad);
|
||||
*p += strlen;
|
||||
}
|
||||
return 0;
|
||||
bad:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct crush_map *crush_decode(void *pbyval, void *end)
|
||||
{
|
||||
struct crush_map *c;
|
||||
@@ -143,6 +158,7 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
||||
void **p = &pbyval;
|
||||
void *start = pbyval;
|
||||
u32 magic;
|
||||
u32 num_name_maps;
|
||||
|
||||
dout("crush_decode %p to %p len %d\n", *p, end, (int)(end - *p));
|
||||
|
||||
@@ -150,6 +166,11 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
||||
if (c == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
/* set tunables to default values */
|
||||
c->choose_local_tries = 2;
|
||||
c->choose_local_fallback_tries = 5;
|
||||
c->choose_total_tries = 19;
|
||||
|
||||
ceph_decode_need(p, end, 4*sizeof(u32), bad);
|
||||
magic = ceph_decode_32(p);
|
||||
if (magic != CRUSH_MAGIC) {
|
||||
@@ -297,7 +318,25 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
||||
}
|
||||
|
||||
/* ignore trailing name maps. */
|
||||
for (num_name_maps = 0; num_name_maps < 3; num_name_maps++) {
|
||||
err = skip_name_map(p, end);
|
||||
if (err < 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* tunables */
|
||||
ceph_decode_need(p, end, 3*sizeof(u32), done);
|
||||
c->choose_local_tries = ceph_decode_32(p);
|
||||
c->choose_local_fallback_tries = ceph_decode_32(p);
|
||||
c->choose_total_tries = ceph_decode_32(p);
|
||||
dout("crush decode tunable choose_local_tries = %d",
|
||||
c->choose_local_tries);
|
||||
dout("crush decode tunable choose_local_fallback_tries = %d",
|
||||
c->choose_local_fallback_tries);
|
||||
dout("crush decode tunable choose_total_tries = %d",
|
||||
c->choose_total_tries);
|
||||
|
||||
done:
|
||||
dout("crush_decode success\n");
|
||||
return c;
|
||||
|
||||
@@ -488,15 +527,16 @@ static int __decode_pool_names(void **p, void *end, struct ceph_osdmap *map)
|
||||
ceph_decode_32_safe(p, end, pool, bad);
|
||||
ceph_decode_32_safe(p, end, len, bad);
|
||||
dout(" pool %d len %d\n", pool, len);
|
||||
ceph_decode_need(p, end, len, bad);
|
||||
pi = __lookup_pg_pool(&map->pg_pools, pool);
|
||||
if (pi) {
|
||||
char *name = kstrndup(*p, len, GFP_NOFS);
|
||||
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
kfree(pi->name);
|
||||
pi->name = kmalloc(len + 1, GFP_NOFS);
|
||||
if (pi->name) {
|
||||
memcpy(pi->name, *p, len);
|
||||
pi->name[len] = '\0';
|
||||
dout(" name is %s\n", pi->name);
|
||||
}
|
||||
pi->name = name;
|
||||
dout(" name is %s\n", pi->name);
|
||||
}
|
||||
*p += len;
|
||||
}
|
||||
@@ -666,6 +706,9 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
|
||||
ceph_decode_need(p, end, sizeof(u32) + sizeof(u64), bad);
|
||||
ceph_decode_copy(p, &pgid, sizeof(pgid));
|
||||
n = ceph_decode_32(p);
|
||||
err = -EINVAL;
|
||||
if (n > (UINT_MAX - sizeof(*pg)) / sizeof(u32))
|
||||
goto bad;
|
||||
ceph_decode_need(p, end, n * sizeof(u32), bad);
|
||||
err = -ENOMEM;
|
||||
pg = kmalloc(sizeof(*pg) + n*sizeof(u32), GFP_NOFS);
|
||||
@@ -889,6 +932,10 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
|
||||
(void) __remove_pg_mapping(&map->pg_temp, pgid);
|
||||
|
||||
/* insert */
|
||||
if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) {
|
||||
err = -EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
pg = kmalloc(sizeof(*pg) + sizeof(u32)*pglen, GFP_NOFS);
|
||||
if (!pg) {
|
||||
err = -ENOMEM;
|
||||
|
||||
+54
-6
@@ -1172,6 +1172,7 @@ static int __dev_open(struct net_device *dev)
|
||||
net_dmaengine_get();
|
||||
dev_set_rx_mode(dev);
|
||||
dev_activate(dev);
|
||||
add_device_randomness(dev->dev_addr, dev->addr_len);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -2133,6 +2134,9 @@ netdev_features_t netif_skb_features(struct sk_buff *skb)
|
||||
__be16 protocol = skb->protocol;
|
||||
netdev_features_t features = skb->dev->features;
|
||||
|
||||
if (skb_shinfo(skb)->gso_segs > skb->dev->gso_max_segs)
|
||||
features &= ~NETIF_F_GSO_MASK;
|
||||
|
||||
if (protocol == htons(ETH_P_8021Q)) {
|
||||
struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
|
||||
protocol = veh->h_vlan_encapsulated_proto;
|
||||
@@ -3155,6 +3159,23 @@ void netdev_rx_handler_unregister(struct net_device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister);
|
||||
|
||||
/*
|
||||
* Limit the use of PFMEMALLOC reserves to those protocols that implement
|
||||
* the special handling of PFMEMALLOC skbs.
|
||||
*/
|
||||
static bool skb_pfmemalloc_protocol(struct sk_buff *skb)
|
||||
{
|
||||
switch (skb->protocol) {
|
||||
case __constant_htons(ETH_P_ARP):
|
||||
case __constant_htons(ETH_P_IP):
|
||||
case __constant_htons(ETH_P_IPV6):
|
||||
case __constant_htons(ETH_P_8021Q):
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int __netif_receive_skb(struct sk_buff *skb)
|
||||
{
|
||||
struct packet_type *ptype, *pt_prev;
|
||||
@@ -3164,14 +3185,27 @@ static int __netif_receive_skb(struct sk_buff *skb)
|
||||
bool deliver_exact = false;
|
||||
int ret = NET_RX_DROP;
|
||||
__be16 type;
|
||||
unsigned long pflags = current->flags;
|
||||
|
||||
net_timestamp_check(!netdev_tstamp_prequeue, skb);
|
||||
|
||||
trace_netif_receive_skb(skb);
|
||||
|
||||
/*
|
||||
* PFMEMALLOC skbs are special, they should
|
||||
* - be delivered to SOCK_MEMALLOC sockets only
|
||||
* - stay away from userspace
|
||||
* - have bounded memory usage
|
||||
*
|
||||
* Use PF_MEMALLOC as this saves us from propagating the allocation
|
||||
* context down to all allocation sites.
|
||||
*/
|
||||
if (sk_memalloc_socks() && skb_pfmemalloc(skb))
|
||||
current->flags |= PF_MEMALLOC;
|
||||
|
||||
/* if we've gotten here through NAPI, check netpoll */
|
||||
if (netpoll_receive_skb(skb))
|
||||
return NET_RX_DROP;
|
||||
goto out;
|
||||
|
||||
orig_dev = skb->dev;
|
||||
|
||||
@@ -3191,7 +3225,7 @@ another_round:
|
||||
if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) {
|
||||
skb = vlan_untag(skb);
|
||||
if (unlikely(!skb))
|
||||
goto out;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
@@ -3201,6 +3235,9 @@ another_round:
|
||||
}
|
||||
#endif
|
||||
|
||||
if (sk_memalloc_socks() && skb_pfmemalloc(skb))
|
||||
goto skip_taps;
|
||||
|
||||
list_for_each_entry_rcu(ptype, &ptype_all, list) {
|
||||
if (!ptype->dev || ptype->dev == skb->dev) {
|
||||
if (pt_prev)
|
||||
@@ -3209,13 +3246,18 @@ another_round:
|
||||
}
|
||||
}
|
||||
|
||||
skip_taps:
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
skb = handle_ing(skb, &pt_prev, &ret, orig_dev);
|
||||
if (!skb)
|
||||
goto out;
|
||||
goto unlock;
|
||||
ncls:
|
||||
#endif
|
||||
|
||||
if (sk_memalloc_socks() && skb_pfmemalloc(skb)
|
||||
&& !skb_pfmemalloc_protocol(skb))
|
||||
goto drop;
|
||||
|
||||
rx_handler = rcu_dereference(skb->dev->rx_handler);
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
if (pt_prev) {
|
||||
@@ -3225,7 +3267,7 @@ ncls:
|
||||
if (vlan_do_receive(&skb, !rx_handler))
|
||||
goto another_round;
|
||||
else if (unlikely(!skb))
|
||||
goto out;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (rx_handler) {
|
||||
@@ -3235,7 +3277,7 @@ ncls:
|
||||
}
|
||||
switch (rx_handler(&skb)) {
|
||||
case RX_HANDLER_CONSUMED:
|
||||
goto out;
|
||||
goto unlock;
|
||||
case RX_HANDLER_ANOTHER:
|
||||
goto another_round;
|
||||
case RX_HANDLER_EXACT:
|
||||
@@ -3268,6 +3310,7 @@ ncls:
|
||||
else
|
||||
ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
|
||||
} else {
|
||||
drop:
|
||||
atomic_long_inc(&skb->dev->rx_dropped);
|
||||
kfree_skb(skb);
|
||||
/* Jamal, now you will not able to escape explaining
|
||||
@@ -3276,8 +3319,10 @@ ncls:
|
||||
ret = NET_RX_DROP;
|
||||
}
|
||||
|
||||
out:
|
||||
unlock:
|
||||
rcu_read_unlock();
|
||||
out:
|
||||
tsk_restore_flags(current, pflags, PF_MEMALLOC);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4801,6 +4846,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa)
|
||||
err = ops->ndo_set_mac_address(dev, sa);
|
||||
if (!err)
|
||||
call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
|
||||
add_device_randomness(dev->dev_addr, dev->addr_len);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(dev_set_mac_address);
|
||||
@@ -5579,6 +5625,7 @@ int register_netdevice(struct net_device *dev)
|
||||
dev_init_scheduler(dev);
|
||||
dev_hold(dev);
|
||||
list_netdevice(dev);
|
||||
add_device_randomness(dev->dev_addr, dev->addr_len);
|
||||
|
||||
/* Notify protocols, that a new device appeared. */
|
||||
ret = call_netdevice_notifiers(NETDEV_REGISTER, dev);
|
||||
@@ -5942,6 +5989,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
|
||||
dev_net_set(dev, &init_net);
|
||||
|
||||
dev->gso_max_size = GSO_MAX_SIZE;
|
||||
dev->gso_max_segs = GSO_MAX_SEGS;
|
||||
|
||||
INIT_LIST_HEAD(&dev->napi_list);
|
||||
INIT_LIST_HEAD(&dev->unreg_list);
|
||||
|
||||
@@ -83,6 +83,14 @@ int sk_filter(struct sock *sk, struct sk_buff *skb)
|
||||
int err;
|
||||
struct sk_filter *filter;
|
||||
|
||||
/*
|
||||
* If the skb was allocated from pfmemalloc reserves, only
|
||||
* allow SOCK_MEMALLOC sockets to use it as this socket is
|
||||
* helping free memory
|
||||
*/
|
||||
if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
|
||||
return -ENOMEM;
|
||||
|
||||
err = security_sock_rcv_skb(sk, skb);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -1381,6 +1381,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm,
|
||||
goto errout;
|
||||
send_addr_notify = 1;
|
||||
modified = 1;
|
||||
add_device_randomness(dev->dev_addr, dev->addr_len);
|
||||
}
|
||||
|
||||
if (tb[IFLA_MTU]) {
|
||||
|
||||
+99
-25
@@ -145,6 +145,43 @@ static void skb_under_panic(struct sk_buff *skb, int sz, void *here)
|
||||
BUG();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* kmalloc_reserve is a wrapper around kmalloc_node_track_caller that tells
|
||||
* the caller if emergency pfmemalloc reserves are being used. If it is and
|
||||
* the socket is later found to be SOCK_MEMALLOC then PFMEMALLOC reserves
|
||||
* may be used. Otherwise, the packet data may be discarded until enough
|
||||
* memory is free
|
||||
*/
|
||||
#define kmalloc_reserve(size, gfp, node, pfmemalloc) \
|
||||
__kmalloc_reserve(size, gfp, node, _RET_IP_, pfmemalloc)
|
||||
void *__kmalloc_reserve(size_t size, gfp_t flags, int node, unsigned long ip,
|
||||
bool *pfmemalloc)
|
||||
{
|
||||
void *obj;
|
||||
bool ret_pfmemalloc = false;
|
||||
|
||||
/*
|
||||
* Try a regular allocation, when that fails and we're not entitled
|
||||
* to the reserves, fail.
|
||||
*/
|
||||
obj = kmalloc_node_track_caller(size,
|
||||
flags | __GFP_NOMEMALLOC | __GFP_NOWARN,
|
||||
node);
|
||||
if (obj || !(gfp_pfmemalloc_allowed(flags)))
|
||||
goto out;
|
||||
|
||||
/* Try again but now we are using pfmemalloc reserves */
|
||||
ret_pfmemalloc = true;
|
||||
obj = kmalloc_node_track_caller(size, flags, node);
|
||||
|
||||
out:
|
||||
if (pfmemalloc)
|
||||
*pfmemalloc = ret_pfmemalloc;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
/* Allocate a new skbuff. We do this ourselves so we can fill in a few
|
||||
* 'private' fields and also do memory statistics to find all the
|
||||
* [BEEP] leaks.
|
||||
@@ -155,8 +192,10 @@ static void skb_under_panic(struct sk_buff *skb, int sz, void *here)
|
||||
* __alloc_skb - allocate a network buffer
|
||||
* @size: size to allocate
|
||||
* @gfp_mask: allocation mask
|
||||
* @fclone: allocate from fclone cache instead of head cache
|
||||
* and allocate a cloned (child) skb
|
||||
* @flags: If SKB_ALLOC_FCLONE is set, allocate from fclone cache
|
||||
* instead of head cache and allocate a cloned (child) skb.
|
||||
* If SKB_ALLOC_RX is set, __GFP_MEMALLOC will be used for
|
||||
* allocations in case the data is required for writeback
|
||||
* @node: numa node to allocate memory on
|
||||
*
|
||||
* Allocate a new &sk_buff. The returned buffer has no headroom and a
|
||||
@@ -167,14 +206,19 @@ static void skb_under_panic(struct sk_buff *skb, int sz, void *here)
|
||||
* %GFP_ATOMIC.
|
||||
*/
|
||||
struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||
int fclone, int node)
|
||||
int flags, int node)
|
||||
{
|
||||
struct kmem_cache *cache;
|
||||
struct skb_shared_info *shinfo;
|
||||
struct sk_buff *skb;
|
||||
u8 *data;
|
||||
bool pfmemalloc;
|
||||
|
||||
cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
|
||||
cache = (flags & SKB_ALLOC_FCLONE)
|
||||
? skbuff_fclone_cache : skbuff_head_cache;
|
||||
|
||||
if (sk_memalloc_socks() && (flags & SKB_ALLOC_RX))
|
||||
gfp_mask |= __GFP_MEMALLOC;
|
||||
|
||||
/* Get the HEAD */
|
||||
skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node);
|
||||
@@ -189,7 +233,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||
*/
|
||||
size = SKB_DATA_ALIGN(size);
|
||||
size += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
||||
data = kmalloc_node_track_caller(size, gfp_mask, node);
|
||||
data = kmalloc_reserve(size, gfp_mask, node, &pfmemalloc);
|
||||
if (!data)
|
||||
goto nodata;
|
||||
/* kmalloc(size) might give us more room than requested.
|
||||
@@ -207,6 +251,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||
memset(skb, 0, offsetof(struct sk_buff, tail));
|
||||
/* Account for allocated memory : skb + skb->head */
|
||||
skb->truesize = SKB_TRUESIZE(size);
|
||||
skb->pfmemalloc = pfmemalloc;
|
||||
atomic_set(&skb->users, 1);
|
||||
skb->head = data;
|
||||
skb->data = data;
|
||||
@@ -222,7 +267,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||
atomic_set(&shinfo->dataref, 1);
|
||||
kmemcheck_annotate_variable(shinfo->destructor_arg);
|
||||
|
||||
if (fclone) {
|
||||
if (flags & SKB_ALLOC_FCLONE) {
|
||||
struct sk_buff *child = skb + 1;
|
||||
atomic_t *fclone_ref = (atomic_t *) (child + 1);
|
||||
|
||||
@@ -232,6 +277,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
||||
atomic_set(fclone_ref, 1);
|
||||
|
||||
child->fclone = SKB_FCLONE_UNAVAILABLE;
|
||||
child->pfmemalloc = pfmemalloc;
|
||||
}
|
||||
out:
|
||||
return skb;
|
||||
@@ -302,14 +348,7 @@ static DEFINE_PER_CPU(struct netdev_alloc_cache, netdev_alloc_cache);
|
||||
|
||||
#define NETDEV_PAGECNT_BIAS (PAGE_SIZE / SMP_CACHE_BYTES)
|
||||
|
||||
/**
|
||||
* netdev_alloc_frag - allocate a page fragment
|
||||
* @fragsz: fragment size
|
||||
*
|
||||
* Allocates a frag from a page for receive buffer.
|
||||
* Uses GFP_ATOMIC allocations.
|
||||
*/
|
||||
void *netdev_alloc_frag(unsigned int fragsz)
|
||||
static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask)
|
||||
{
|
||||
struct netdev_alloc_cache *nc;
|
||||
void *data = NULL;
|
||||
@@ -319,7 +358,7 @@ void *netdev_alloc_frag(unsigned int fragsz)
|
||||
nc = &__get_cpu_var(netdev_alloc_cache);
|
||||
if (unlikely(!nc->page)) {
|
||||
refill:
|
||||
nc->page = alloc_page(GFP_ATOMIC | __GFP_COLD);
|
||||
nc->page = alloc_page(gfp_mask);
|
||||
if (unlikely(!nc->page))
|
||||
goto end;
|
||||
recycle:
|
||||
@@ -343,6 +382,18 @@ end:
|
||||
local_irq_restore(flags);
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* netdev_alloc_frag - allocate a page fragment
|
||||
* @fragsz: fragment size
|
||||
*
|
||||
* Allocates a frag from a page for receive buffer.
|
||||
* Uses GFP_ATOMIC allocations.
|
||||
*/
|
||||
void *netdev_alloc_frag(unsigned int fragsz)
|
||||
{
|
||||
return __netdev_alloc_frag(fragsz, GFP_ATOMIC | __GFP_COLD);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_alloc_frag);
|
||||
|
||||
/**
|
||||
@@ -366,7 +417,12 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
|
||||
|
||||
if (fragsz <= PAGE_SIZE && !(gfp_mask & (__GFP_WAIT | GFP_DMA))) {
|
||||
void *data = netdev_alloc_frag(fragsz);
|
||||
void *data;
|
||||
|
||||
if (sk_memalloc_socks())
|
||||
gfp_mask |= __GFP_MEMALLOC;
|
||||
|
||||
data = __netdev_alloc_frag(fragsz, gfp_mask);
|
||||
|
||||
if (likely(data)) {
|
||||
skb = build_skb(data, fragsz);
|
||||
@@ -374,7 +430,8 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
|
||||
put_page(virt_to_head_page(data));
|
||||
}
|
||||
} else {
|
||||
skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, NUMA_NO_NODE);
|
||||
skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask,
|
||||
SKB_ALLOC_RX, NUMA_NO_NODE);
|
||||
}
|
||||
if (likely(skb)) {
|
||||
skb_reserve(skb, NET_SKB_PAD);
|
||||
@@ -656,6 +713,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
|
||||
#if IS_ENABLED(CONFIG_IP_VS)
|
||||
new->ipvs_property = old->ipvs_property;
|
||||
#endif
|
||||
new->pfmemalloc = old->pfmemalloc;
|
||||
new->protocol = old->protocol;
|
||||
new->mark = old->mark;
|
||||
new->skb_iif = old->skb_iif;
|
||||
@@ -814,6 +872,9 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
|
||||
n->fclone = SKB_FCLONE_CLONE;
|
||||
atomic_inc(fclone_ref);
|
||||
} else {
|
||||
if (skb_pfmemalloc(skb))
|
||||
gfp_mask |= __GFP_MEMALLOC;
|
||||
|
||||
n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
|
||||
if (!n)
|
||||
return NULL;
|
||||
@@ -850,6 +911,13 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
|
||||
skb_shinfo(new)->gso_type = skb_shinfo(old)->gso_type;
|
||||
}
|
||||
|
||||
static inline int skb_alloc_rx_flag(const struct sk_buff *skb)
|
||||
{
|
||||
if (skb_pfmemalloc(skb))
|
||||
return SKB_ALLOC_RX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_copy - create private copy of an sk_buff
|
||||
* @skb: buffer to copy
|
||||
@@ -871,7 +939,8 @@ struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
|
||||
{
|
||||
int headerlen = skb_headroom(skb);
|
||||
unsigned int size = skb_end_offset(skb) + skb->data_len;
|
||||
struct sk_buff *n = alloc_skb(size, gfp_mask);
|
||||
struct sk_buff *n = __alloc_skb(size, gfp_mask,
|
||||
skb_alloc_rx_flag(skb), NUMA_NO_NODE);
|
||||
|
||||
if (!n)
|
||||
return NULL;
|
||||
@@ -906,7 +975,8 @@ EXPORT_SYMBOL(skb_copy);
|
||||
struct sk_buff *__pskb_copy(struct sk_buff *skb, int headroom, gfp_t gfp_mask)
|
||||
{
|
||||
unsigned int size = skb_headlen(skb) + headroom;
|
||||
struct sk_buff *n = alloc_skb(size, gfp_mask);
|
||||
struct sk_buff *n = __alloc_skb(size, gfp_mask,
|
||||
skb_alloc_rx_flag(skb), NUMA_NO_NODE);
|
||||
|
||||
if (!n)
|
||||
goto out;
|
||||
@@ -979,8 +1049,10 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
|
||||
|
||||
size = SKB_DATA_ALIGN(size);
|
||||
|
||||
data = kmalloc(size + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
|
||||
gfp_mask);
|
||||
if (skb_pfmemalloc(skb))
|
||||
gfp_mask |= __GFP_MEMALLOC;
|
||||
data = kmalloc_reserve(size + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
|
||||
gfp_mask, NUMA_NO_NODE, NULL);
|
||||
if (!data)
|
||||
goto nodata;
|
||||
size = SKB_WITH_OVERHEAD(ksize(data));
|
||||
@@ -1092,8 +1164,9 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
|
||||
/*
|
||||
* Allocate the copy buffer
|
||||
*/
|
||||
struct sk_buff *n = alloc_skb(newheadroom + skb->len + newtailroom,
|
||||
gfp_mask);
|
||||
struct sk_buff *n = __alloc_skb(newheadroom + skb->len + newtailroom,
|
||||
gfp_mask, skb_alloc_rx_flag(skb),
|
||||
NUMA_NO_NODE);
|
||||
int oldheadroom = skb_headroom(skb);
|
||||
int head_copy_len, head_copy_off;
|
||||
int off;
|
||||
@@ -2775,8 +2848,9 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
|
||||
skb_release_head_state(nskb);
|
||||
__skb_push(nskb, doffset);
|
||||
} else {
|
||||
nskb = alloc_skb(hsize + doffset + headroom,
|
||||
GFP_ATOMIC);
|
||||
nskb = __alloc_skb(hsize + doffset + headroom,
|
||||
GFP_ATOMIC, skb_alloc_rx_flag(skb),
|
||||
NUMA_NO_NODE);
|
||||
|
||||
if (unlikely(!nskb))
|
||||
goto err;
|
||||
|
||||
+58
-2
@@ -142,7 +142,7 @@
|
||||
static DEFINE_MUTEX(proto_list_mutex);
|
||||
static LIST_HEAD(proto_list);
|
||||
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
|
||||
#ifdef CONFIG_MEMCG_KMEM
|
||||
int mem_cgroup_sockets_init(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
|
||||
{
|
||||
struct proto *proto;
|
||||
@@ -271,6 +271,61 @@ __u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX;
|
||||
int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512);
|
||||
EXPORT_SYMBOL(sysctl_optmem_max);
|
||||
|
||||
struct static_key memalloc_socks = STATIC_KEY_INIT_FALSE;
|
||||
EXPORT_SYMBOL_GPL(memalloc_socks);
|
||||
|
||||
/**
|
||||
* sk_set_memalloc - sets %SOCK_MEMALLOC
|
||||
* @sk: socket to set it on
|
||||
*
|
||||
* Set %SOCK_MEMALLOC on a socket for access to emergency reserves.
|
||||
* It's the responsibility of the admin to adjust min_free_kbytes
|
||||
* to meet the requirements
|
||||
*/
|
||||
void sk_set_memalloc(struct sock *sk)
|
||||
{
|
||||
sock_set_flag(sk, SOCK_MEMALLOC);
|
||||
sk->sk_allocation |= __GFP_MEMALLOC;
|
||||
static_key_slow_inc(&memalloc_socks);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sk_set_memalloc);
|
||||
|
||||
void sk_clear_memalloc(struct sock *sk)
|
||||
{
|
||||
sock_reset_flag(sk, SOCK_MEMALLOC);
|
||||
sk->sk_allocation &= ~__GFP_MEMALLOC;
|
||||
static_key_slow_dec(&memalloc_socks);
|
||||
|
||||
/*
|
||||
* SOCK_MEMALLOC is allowed to ignore rmem limits to ensure forward
|
||||
* progress of swapping. However, if SOCK_MEMALLOC is cleared while
|
||||
* it has rmem allocations there is a risk that the user of the
|
||||
* socket cannot make forward progress due to exceeding the rmem
|
||||
* limits. By rights, sk_clear_memalloc() should only be called
|
||||
* on sockets being torn down but warn and reset the accounting if
|
||||
* that assumption breaks.
|
||||
*/
|
||||
if (WARN_ON(sk->sk_forward_alloc))
|
||||
sk_mem_reclaim(sk);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sk_clear_memalloc);
|
||||
|
||||
int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
int ret;
|
||||
unsigned long pflags = current->flags;
|
||||
|
||||
/* these should have been dropped before queueing */
|
||||
BUG_ON(!sock_flag(sk, SOCK_MEMALLOC));
|
||||
|
||||
current->flags |= PF_MEMALLOC;
|
||||
ret = sk->sk_backlog_rcv(sk, skb);
|
||||
tsk_restore_flags(current, pflags, PF_MEMALLOC);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(__sk_backlog_rcv);
|
||||
|
||||
#if defined(CONFIG_CGROUPS)
|
||||
#if !defined(CONFIG_NET_CLS_CGROUP)
|
||||
int net_cls_subsys_id = -1;
|
||||
@@ -353,7 +408,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!sk_rmem_schedule(sk, skb->truesize)) {
|
||||
if (!sk_rmem_schedule(sk, skb, skb->truesize)) {
|
||||
atomic_inc(&sk->sk_drops);
|
||||
return -ENOBUFS;
|
||||
}
|
||||
@@ -1403,6 +1458,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
|
||||
} else {
|
||||
sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
||||
sk->sk_gso_max_size = dst->dev->gso_max_size;
|
||||
sk->sk_gso_max_segs = dst->dev->gso_max_segs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ obj-$(CONFIG_TCP_CONG_SCALABLE) += tcp_scalable.o
|
||||
obj-$(CONFIG_TCP_CONG_LP) += tcp_lp.o
|
||||
obj-$(CONFIG_TCP_CONG_YEAH) += tcp_yeah.o
|
||||
obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o
|
||||
obj-$(CONFIG_CGROUP_MEM_RES_CTLR_KMEM) += tcp_memcontrol.o
|
||||
obj-$(CONFIG_MEMCG_KMEM) += tcp_memcontrol.o
|
||||
obj-$(CONFIG_NETLABEL) += cipso_ipv4.o
|
||||
|
||||
obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user