Commit 6d7fdb0a authored by Ilya Dryomov's avatar Ilya Dryomov

Revert "libceph: use memalloc flags for net IO"

This reverts commit 89baaa57.

Dirty page throttling should be sufficient for us in the general case
so there is no need to use __GFP_MEMALLOC - it would be needed only in
the swap-over-rbd case, which we currently don't support.  (It would
probably take approximately the commit that is being reverted to add
that support, but we would also need the "swap" option to distinguish
from the general case and make sure swap ceph_client-s aren't shared
with anything else.)  See ceph-devel threads [1] and [2] for the
details of why enabling pfmemalloc reserves for all cases is a bad
thing.

On top of potential system lockups related to drained emergency
reserves, this turned out to cause ceph lockups in case peers are on
the same host and communicating via loopback due to sk_filter()
dropping pfmemalloc skbs on the receiving side because the receiving
loopback socket is not tagged with SOCK_MEMALLOC.

[1] "SOCK_MEMALLOC vs loopback"
    http://www.spinics.net/lists/ceph-devel/msg22998.html
[2] "[PATCH] libceph: don't set memalloc flags in loopback case"
    http://www.spinics.net/lists/ceph-devel/msg23392.html

Conflicts:
	net/ceph/messenger.c [ context: tcp_nodelay option ]

Cc: Mike Christie <michaelc@cs.wisc.edu>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Sage Weil <sage@redhat.com>
Cc: stable@vger.kernel.org # 3.18+, needs backporting
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
Acked-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Acked-by: default avatarMel Gorman <mgorman@suse.de>
parent f22e6e84
...@@ -484,7 +484,7 @@ static int ceph_tcp_connect(struct ceph_connection *con) ...@@ -484,7 +484,7 @@ static int ceph_tcp_connect(struct ceph_connection *con)
IPPROTO_TCP, &sock); IPPROTO_TCP, &sock);
if (ret) if (ret)
return ret; return ret;
sock->sk->sk_allocation = GFP_NOFS | __GFP_MEMALLOC; sock->sk->sk_allocation = GFP_NOFS;
#ifdef CONFIG_LOCKDEP #ifdef CONFIG_LOCKDEP
lockdep_set_class(&sock->sk->sk_lock, &socket_class); lockdep_set_class(&sock->sk->sk_lock, &socket_class);
...@@ -520,8 +520,6 @@ static int ceph_tcp_connect(struct ceph_connection *con) ...@@ -520,8 +520,6 @@ static int ceph_tcp_connect(struct ceph_connection *con)
ret); ret);
} }
sk_set_memalloc(sock->sk);
con->sock = sock; con->sock = sock;
return 0; return 0;
} }
...@@ -2808,11 +2806,8 @@ static void con_work(struct work_struct *work) ...@@ -2808,11 +2806,8 @@ static void con_work(struct work_struct *work)
{ {
struct ceph_connection *con = container_of(work, struct ceph_connection, struct ceph_connection *con = container_of(work, struct ceph_connection,
work.work); work.work);
unsigned long pflags = current->flags;
bool fault; bool fault;
current->flags |= PF_MEMALLOC;
mutex_lock(&con->mutex); mutex_lock(&con->mutex);
while (true) { while (true) {
int ret; int ret;
...@@ -2866,8 +2861,6 @@ static void con_work(struct work_struct *work) ...@@ -2866,8 +2861,6 @@ static void con_work(struct work_struct *work)
con_fault_finish(con); con_fault_finish(con);
con->ops->put(con); con->ops->put(con);
tsk_restore_flags(current, pflags, PF_MEMALLOC);
} }
/* /*
......
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