Merge branch 'for-3.2' of git://linux-nfs.org/~bfields/linux
* 'for-3.2' of git://linux-nfs.org/~bfields/linux: (103 commits) nfs41: implement DESTROY_CLIENTID operation nfsd4: typo logical vs bitwise negate for want_mask nfsd4: allow NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL | NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED nfsd4: seq->status_flags may be used unitialized nfsd41: use SEQ4_STATUS_BACKCHANNEL_FAULT when cb_sequence is invalid nfsd4: implement new 4.1 open reclaim types nfsd4: remove unneeded CLAIM_DELEGATE_CUR workaround nfsd4: warn on open failure after create nfsd4: preallocate open stateid in process_open1() nfsd4: do idr preallocation with stateid allocation nfsd4: preallocate nfs4_file in process_open1() nfsd4: clean up open owners on OPEN failure nfsd4: simplify process_open1 logic nfsd4: make is_open_owner boolean nfsd4: centralize renew_client() calls nfsd4: typo logical vs bitwise negate nfs: fix bug about IPv6 address scope checking nfsd4: more robust ignoring of WANT bits in OPEN nfsd4: move name-length checks to xdr nfsd4: move access/deny validity checks to xdr code ...
This commit is contained in:
@@ -1084,3 +1084,6 @@ void unregister_rpc_pipefs(void)
|
||||
kmem_cache_destroy(rpc_inode_cachep);
|
||||
unregister_filesystem(&rpc_pipe_fs_type);
|
||||
}
|
||||
|
||||
/* Make 'mount -t rpc_pipefs ...' autoload this module. */
|
||||
MODULE_ALIAS("rpc_pipefs");
|
||||
|
@@ -295,6 +295,18 @@ svc_pool_map_put(void)
|
||||
}
|
||||
|
||||
|
||||
static int svc_pool_map_get_node(unsigned int pidx)
|
||||
{
|
||||
const struct svc_pool_map *m = &svc_pool_map;
|
||||
|
||||
if (m->count) {
|
||||
if (m->mode == SVC_POOL_PERCPU)
|
||||
return cpu_to_node(m->pool_to[pidx]);
|
||||
if (m->mode == SVC_POOL_PERNODE)
|
||||
return m->pool_to[pidx];
|
||||
}
|
||||
return NUMA_NO_NODE;
|
||||
}
|
||||
/*
|
||||
* Set the given thread's cpus_allowed mask so that it
|
||||
* will only run on cpus in the given pool.
|
||||
@@ -499,7 +511,7 @@ EXPORT_SYMBOL_GPL(svc_destroy);
|
||||
* We allocate pages and place them in rq_argpages.
|
||||
*/
|
||||
static int
|
||||
svc_init_buffer(struct svc_rqst *rqstp, unsigned int size)
|
||||
svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node)
|
||||
{
|
||||
unsigned int pages, arghi;
|
||||
|
||||
@@ -513,7 +525,7 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size)
|
||||
arghi = 0;
|
||||
BUG_ON(pages > RPCSVC_MAXPAGES);
|
||||
while (pages) {
|
||||
struct page *p = alloc_page(GFP_KERNEL);
|
||||
struct page *p = alloc_pages_node(node, GFP_KERNEL, 0);
|
||||
if (!p)
|
||||
break;
|
||||
rqstp->rq_pages[arghi++] = p;
|
||||
@@ -536,11 +548,11 @@ svc_release_buffer(struct svc_rqst *rqstp)
|
||||
}
|
||||
|
||||
struct svc_rqst *
|
||||
svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool)
|
||||
svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
|
||||
{
|
||||
struct svc_rqst *rqstp;
|
||||
|
||||
rqstp = kzalloc(sizeof(*rqstp), GFP_KERNEL);
|
||||
rqstp = kzalloc_node(sizeof(*rqstp), GFP_KERNEL, node);
|
||||
if (!rqstp)
|
||||
goto out_enomem;
|
||||
|
||||
@@ -554,15 +566,15 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool)
|
||||
rqstp->rq_server = serv;
|
||||
rqstp->rq_pool = pool;
|
||||
|
||||
rqstp->rq_argp = kmalloc(serv->sv_xdrsize, GFP_KERNEL);
|
||||
rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
|
||||
if (!rqstp->rq_argp)
|
||||
goto out_thread;
|
||||
|
||||
rqstp->rq_resp = kmalloc(serv->sv_xdrsize, GFP_KERNEL);
|
||||
rqstp->rq_resp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
|
||||
if (!rqstp->rq_resp)
|
||||
goto out_thread;
|
||||
|
||||
if (!svc_init_buffer(rqstp, serv->sv_max_mesg))
|
||||
if (!svc_init_buffer(rqstp, serv->sv_max_mesg, node))
|
||||
goto out_thread;
|
||||
|
||||
return rqstp;
|
||||
@@ -647,6 +659,7 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
|
||||
struct svc_pool *chosen_pool;
|
||||
int error = 0;
|
||||
unsigned int state = serv->sv_nrthreads-1;
|
||||
int node;
|
||||
|
||||
if (pool == NULL) {
|
||||
/* The -1 assumes caller has done a svc_get() */
|
||||
@@ -662,14 +675,16 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
|
||||
nrservs--;
|
||||
chosen_pool = choose_pool(serv, pool, &state);
|
||||
|
||||
rqstp = svc_prepare_thread(serv, chosen_pool);
|
||||
node = svc_pool_map_get_node(chosen_pool->sp_id);
|
||||
rqstp = svc_prepare_thread(serv, chosen_pool, node);
|
||||
if (IS_ERR(rqstp)) {
|
||||
error = PTR_ERR(rqstp);
|
||||
break;
|
||||
}
|
||||
|
||||
__module_get(serv->sv_module);
|
||||
task = kthread_create(serv->sv_function, rqstp, serv->sv_name);
|
||||
task = kthread_create_on_node(serv->sv_function, rqstp,
|
||||
node, serv->sv_name);
|
||||
if (IS_ERR(task)) {
|
||||
error = PTR_ERR(task);
|
||||
module_put(serv->sv_module);
|
||||
|
@@ -254,8 +254,6 @@ EXPORT_SYMBOL_GPL(svc_create_xprt);
|
||||
*/
|
||||
void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt)
|
||||
{
|
||||
struct sockaddr *sin;
|
||||
|
||||
memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen);
|
||||
rqstp->rq_addrlen = xprt->xpt_remotelen;
|
||||
|
||||
@@ -263,15 +261,8 @@ void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt)
|
||||
* Destination address in request is needed for binding the
|
||||
* source address in RPC replies/callbacks later.
|
||||
*/
|
||||
sin = (struct sockaddr *)&xprt->xpt_local;
|
||||
switch (sin->sa_family) {
|
||||
case AF_INET:
|
||||
rqstp->rq_daddr.addr = ((struct sockaddr_in *)sin)->sin_addr;
|
||||
break;
|
||||
case AF_INET6:
|
||||
rqstp->rq_daddr.addr6 = ((struct sockaddr_in6 *)sin)->sin6_addr;
|
||||
break;
|
||||
}
|
||||
memcpy(&rqstp->rq_daddr, &xprt->xpt_local, xprt->xpt_locallen);
|
||||
rqstp->rq_daddrlen = xprt->xpt_locallen;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs);
|
||||
|
||||
|
@@ -143,19 +143,20 @@ static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh)
|
||||
cmh->cmsg_level = SOL_IP;
|
||||
cmh->cmsg_type = IP_PKTINFO;
|
||||
pki->ipi_ifindex = 0;
|
||||
pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr;
|
||||
pki->ipi_spec_dst.s_addr =
|
||||
svc_daddr_in(rqstp)->sin_addr.s_addr;
|
||||
cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
|
||||
}
|
||||
break;
|
||||
|
||||
case AF_INET6: {
|
||||
struct in6_pktinfo *pki = CMSG_DATA(cmh);
|
||||
struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp);
|
||||
|
||||
cmh->cmsg_level = SOL_IPV6;
|
||||
cmh->cmsg_type = IPV6_PKTINFO;
|
||||
pki->ipi6_ifindex = 0;
|
||||
ipv6_addr_copy(&pki->ipi6_addr,
|
||||
&rqstp->rq_daddr.addr6);
|
||||
pki->ipi6_ifindex = daddr->sin6_scope_id;
|
||||
ipv6_addr_copy(&pki->ipi6_addr, &daddr->sin6_addr);
|
||||
cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
|
||||
}
|
||||
break;
|
||||
@@ -498,9 +499,13 @@ static int svc_udp_get_dest_address4(struct svc_rqst *rqstp,
|
||||
struct cmsghdr *cmh)
|
||||
{
|
||||
struct in_pktinfo *pki = CMSG_DATA(cmh);
|
||||
struct sockaddr_in *daddr = svc_daddr_in(rqstp);
|
||||
|
||||
if (cmh->cmsg_type != IP_PKTINFO)
|
||||
return 0;
|
||||
rqstp->rq_daddr.addr.s_addr = pki->ipi_spec_dst.s_addr;
|
||||
|
||||
daddr->sin_family = AF_INET;
|
||||
daddr->sin_addr.s_addr = pki->ipi_spec_dst.s_addr;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -511,9 +516,14 @@ static int svc_udp_get_dest_address6(struct svc_rqst *rqstp,
|
||||
struct cmsghdr *cmh)
|
||||
{
|
||||
struct in6_pktinfo *pki = CMSG_DATA(cmh);
|
||||
struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp);
|
||||
|
||||
if (cmh->cmsg_type != IPV6_PKTINFO)
|
||||
return 0;
|
||||
ipv6_addr_copy(&rqstp->rq_daddr.addr6, &pki->ipi6_addr);
|
||||
|
||||
daddr->sin6_family = AF_INET6;
|
||||
ipv6_addr_copy(&daddr->sin6_addr, &pki->ipi6_addr);
|
||||
daddr->sin6_scope_id = pki->ipi6_ifindex;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -614,6 +624,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
return 0;
|
||||
}
|
||||
rqstp->rq_daddrlen = svc_addr_len(svc_daddr(rqstp));
|
||||
|
||||
if (skb_is_nonlinear(skb)) {
|
||||
/* we have to copy */
|
||||
|
Reference in New Issue
Block a user