* [PATCH] tcp: fix MSG_SENDPAGE_NOTLAST logic
From: Eric Dumazet @ 2013-01-07 4:21 UTC (permalink / raw)
To: Willy Tarreau, David Miller; +Cc: netdev, linux-kernel
In-Reply-To: <20130106195359.GN16031@1wt.eu>
From: Eric Dumazet <edumazet@google.com>
commit 35f9c09fe9c72e (tcp: tcp_sendpages() should call tcp_push() once)
added an internal flag : MSG_SENDPAGE_NOTLAST meant to be set on all
frags but the last one for a splice() call.
The condition used to set the flag in pipe_to_sendpage() relied on
splice() user passing the exact number of bytes present in the pipe,
or a smaller one.
But some programs pass an arbitrary high value, and the test fails.
The effect of this bug is a lack of tcp_push() at the end of a
splice(pipe -> socket) call, and possibly very slow or erratic TCP
sessions.
We should both test sd->total_len and fact that another fragment
is in the pipe (pipe->nrbufs > 1)
Many thanks to Willy for providing very clear bug report, bisection
and test programs.
Reported-by: Willy Tarreau <w@1wt.eu>
Bisected-by: Willy Tarreau <w@1wt.eu>
Tested-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
fs/splice.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/splice.c b/fs/splice.c
index 8890604..6909d89 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -696,8 +696,10 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe,
return -EINVAL;
more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;
- if (sd->len < sd->total_len)
+
+ if (sd->len < sd->total_len && pipe->nrbufs > 1)
more |= MSG_SENDPAGE_NOTLAST;
+
return file->f_op->sendpage(file, buf->page, buf->offset,
sd->len, &pos, more);
}
^ permalink raw reply related
* Re: [PATCH V3 2/2] vhost: handle polling errors
From: Jason Wang @ 2013-01-07 4:38 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: kvm, eric.dumazet, netdev, linux-kernel, virtualization, davem
In-Reply-To: <20130106132201.GC18612@redhat.com>
On 01/06/2013 09:22 PM, Michael S. Tsirkin wrote:
> On Sun, Jan 06, 2013 at 03:18:38PM +0800, Jason Wang wrote:
>> Polling errors were ignored by vhost/vhost_net, this may lead to crash when
>> trying to remove vhost from waitqueue when after the polling is failed. Solve
>> this problem by:
>>
>> - checking the poll->wqh before trying to remove from waitqueue
>> - report an error when poll() returns a POLLERR in vhost_start_poll()
>> - report an error when vhost_start_poll() fails in
>> vhost_vring_ioctl()/vhost_net_set_backend() which is used to notify the
>> failure to userspace.
>> - report an error in the data path in vhost_net when meet polling errors.
>>
>> After those changes, we can safely drop the tx polling state in vhost_net since
>> it was replaced by the checking of poll->wqh.
>>
>> Signed-off-by: Jason Wang <jasowang@redhat.com>
>> ---
>> drivers/vhost/net.c | 74 ++++++++++++++++--------------------------------
>> drivers/vhost/vhost.c | 31 +++++++++++++++-----
>> drivers/vhost/vhost.h | 2 +-
>> 3 files changed, 49 insertions(+), 58 deletions(-)
>>
>> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
>> index d10ad6f..125c1e5 100644
>> --- a/drivers/vhost/net.c
>> +++ b/drivers/vhost/net.c
>> @@ -64,20 +64,10 @@ enum {
>> VHOST_NET_VQ_MAX = 2,
>> };
>>
>> -enum vhost_net_poll_state {
>> - VHOST_NET_POLL_DISABLED = 0,
>> - VHOST_NET_POLL_STARTED = 1,
>> - VHOST_NET_POLL_STOPPED = 2,
>> -};
>> -
>> struct vhost_net {
>> struct vhost_dev dev;
>> struct vhost_virtqueue vqs[VHOST_NET_VQ_MAX];
>> struct vhost_poll poll[VHOST_NET_VQ_MAX];
>> - /* Tells us whether we are polling a socket for TX.
>> - * We only do this when socket buffer fills up.
>> - * Protected by tx vq lock. */
>> - enum vhost_net_poll_state tx_poll_state;
>> /* Number of TX recently submitted.
>> * Protected by tx vq lock. */
>> unsigned tx_packets;
>> @@ -155,24 +145,6 @@ static void copy_iovec_hdr(const struct iovec *from, struct iovec *to,
>> }
>> }
>>
>> -/* Caller must have TX VQ lock */
>> -static void tx_poll_stop(struct vhost_net *net)
>> -{
>> - if (likely(net->tx_poll_state != VHOST_NET_POLL_STARTED))
>> - return;
>> - vhost_poll_stop(net->poll + VHOST_NET_VQ_TX);
>> - net->tx_poll_state = VHOST_NET_POLL_STOPPED;
>> -}
>> -
>> -/* Caller must have TX VQ lock */
>> -static void tx_poll_start(struct vhost_net *net, struct socket *sock)
>> -{
>> - if (unlikely(net->tx_poll_state != VHOST_NET_POLL_STOPPED))
>> - return;
>> - vhost_poll_start(net->poll + VHOST_NET_VQ_TX, sock->file);
>> - net->tx_poll_state = VHOST_NET_POLL_STARTED;
>> -}
>> -
>> /* In case of DMA done not in order in lower device driver for some reason.
>> * upend_idx is used to track end of used idx, done_idx is used to track head
>> * of used idx. Once lower device DMA done contiguously, we will signal KVM
>> @@ -227,6 +199,7 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>> static void handle_tx(struct vhost_net *net)
>> {
>> struct vhost_virtqueue *vq = &net->dev.vqs[VHOST_NET_VQ_TX];
>> + struct vhost_poll *poll = net->poll + VHOST_NET_VQ_TX;
>> unsigned out, in, s;
>> int head;
>> struct msghdr msg = {
>> @@ -252,7 +225,8 @@ static void handle_tx(struct vhost_net *net)
>> wmem = atomic_read(&sock->sk->sk_wmem_alloc);
>> if (wmem >= sock->sk->sk_sndbuf) {
>> mutex_lock(&vq->mutex);
>> - tx_poll_start(net, sock);
>> + if (vhost_poll_start(poll, sock->file))
>> + vq_err(vq, "Fail to start TX polling\n");
> s/Fail/Failed/
>
> A question though: how can this happen? Could you clarify please?
> Maybe we can find a way to prevent this error?
Two conditions I think this can happen:
1) a buggy userspace disable a queue through TUNSETQUEUE
2) the net device were gone
For 1, looks like we can delay the disabling until the refcnt goes to
zero. For 2 may needs more changes. Not sure it's worth to do this work,
maybe a warning is enough just like other failure.
>
>> mutex_unlock(&vq->mutex);
>> return;
>> }
>> @@ -261,7 +235,7 @@ static void handle_tx(struct vhost_net *net)
>> vhost_disable_notify(&net->dev, vq);
>>
>> if (wmem < sock->sk->sk_sndbuf / 2)
>> - tx_poll_stop(net);
>> + vhost_poll_stop(poll);
>> hdr_size = vq->vhost_hlen;
>> zcopy = vq->ubufs;
>>
>> @@ -283,8 +257,10 @@ static void handle_tx(struct vhost_net *net)
>>
>> wmem = atomic_read(&sock->sk->sk_wmem_alloc);
>> if (wmem >= sock->sk->sk_sndbuf * 3 / 4) {
>> - tx_poll_start(net, sock);
>> - set_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
>> + if (vhost_poll_start(poll, sock->file))
>> + vq_err(vq, "Fail to start TX polling\n");
>> + else
>> + set_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
>> break;
>> }
>> /* If more outstanding DMAs, queue the work.
>> @@ -294,8 +270,10 @@ static void handle_tx(struct vhost_net *net)
>> (vq->upend_idx - vq->done_idx) :
>> (vq->upend_idx + UIO_MAXIOV - vq->done_idx);
>> if (unlikely(num_pends > VHOST_MAX_PEND)) {
>> - tx_poll_start(net, sock);
>> - set_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
>> + if (vhost_poll_start(poll, sock->file))
>> + vq_err(vq, "Fail to start TX polling\n");
>> + else
>> + set_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
>> break;
>> }
>> if (unlikely(vhost_enable_notify(&net->dev, vq))) {
>> @@ -360,7 +338,8 @@ static void handle_tx(struct vhost_net *net)
>> }
>> vhost_discard_vq_desc(vq, 1);
>> if (err == -EAGAIN || err == -ENOBUFS)
>> - tx_poll_start(net, sock);
>> + if (vhost_poll_start(poll, sock->file))
>> + vq_err(vq, "Fail to start TX polling\n");
>> break;
>> }
>> if (err != len)
>> @@ -623,7 +602,6 @@ static int vhost_net_open(struct inode *inode, struct file *f)
>>
>> vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, POLLOUT, dev);
>> vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, POLLIN, dev);
>> - n->tx_poll_state = VHOST_NET_POLL_DISABLED;
>>
>> f->private_data = n;
>>
>> @@ -633,29 +611,25 @@ static int vhost_net_open(struct inode *inode, struct file *f)
>> static void vhost_net_disable_vq(struct vhost_net *n,
>> struct vhost_virtqueue *vq)
>> {
>> + struct vhost_poll *poll = n->poll + (vq - n->vqs);
>> +
>> if (!vq->private_data)
>> return;
>> - if (vq == n->vqs + VHOST_NET_VQ_TX) {
>> - tx_poll_stop(n);
>> - n->tx_poll_state = VHOST_NET_POLL_DISABLED;
>> - } else
>> - vhost_poll_stop(n->poll + VHOST_NET_VQ_RX);
>> + vhost_poll_stop(poll);
>> }
>>
>> -static void vhost_net_enable_vq(struct vhost_net *n,
>> +static int vhost_net_enable_vq(struct vhost_net *n,
>> struct vhost_virtqueue *vq)
>> {
>> struct socket *sock;
>> + struct vhost_poll *poll = n->poll + (vq - n->vqs);
>>
>> sock = rcu_dereference_protected(vq->private_data,
>> lockdep_is_held(&vq->mutex));
>> if (!sock)
>> - return;
>> - if (vq == n->vqs + VHOST_NET_VQ_TX) {
>> - n->tx_poll_state = VHOST_NET_POLL_STOPPED;
>> - tx_poll_start(n, sock);
>> - } else
>> - vhost_poll_start(n->poll + VHOST_NET_VQ_RX, sock->file);
>> + return 0;
>> +
>> + return vhost_poll_start(poll, sock->file);
>> }
>>
>> static struct socket *vhost_net_stop_vq(struct vhost_net *n,
>> @@ -833,7 +807,9 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>> r = vhost_init_used(vq);
>> if (r)
>> goto err_used;
>> - vhost_net_enable_vq(n, vq);
>> + r = vhost_net_enable_vq(n, vq);
>> + if (r)
>> + goto err_used;
>>
>> oldubufs = vq->ubufs;
>> vq->ubufs = ubufs;
>> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
>> index 34389f7..5c7a466 100644
>> --- a/drivers/vhost/vhost.c
>> +++ b/drivers/vhost/vhost.c
>> @@ -77,26 +77,41 @@ void vhost_poll_init(struct vhost_poll *poll, vhost_work_fn_t fn,
>> init_poll_funcptr(&poll->table, vhost_poll_func);
>> poll->mask = mask;
>> poll->dev = dev;
>> + poll->wqh = NULL;
>>
>> vhost_work_init(&poll->work, fn);
>> }
>>
>> +/* Stop polling a file. After this function returns, it becomes safe to drop the
>> + * file reference. You must also flush afterwards. */
>> +void vhost_poll_stop(struct vhost_poll *poll)
>> +{
>> + if (poll->wqh) {
>> + remove_wait_queue(poll->wqh, &poll->wait);
>> + poll->wqh = NULL;
>> + }
>> +}
>> +
>> /* Start polling a file. We add ourselves to file's wait queue. The caller must
>> * keep a reference to a file until after vhost_poll_stop is called. */
>> -void vhost_poll_start(struct vhost_poll *poll, struct file *file)
>> +int vhost_poll_start(struct vhost_poll *poll, struct file *file)
>> {
>> unsigned long mask;
>> + int ret = 0;
>> +
>> + if (poll->wqh)
>> + return -EBUSY;
>>
> I think this should return success: we are already polling.
> Otherwise this would trigger a bug below I think.
Ok.
>
>> mask = file->f_op->poll(file, &poll->table);
>> if (mask)
>> vhost_poll_wakeup(&poll->wait, 0, 0, (void *)mask);
>> -}
>>
>> -/* Stop polling a file. After this function returns, it becomes safe to drop the
>> - * file reference. You must also flush afterwards. */
>> -void vhost_poll_stop(struct vhost_poll *poll)
>> -{
>> - remove_wait_queue(poll->wqh, &poll->wait);
>> + if (mask & POLLERR) {
>> + ret = -EINVAL;
>> + vhost_poll_stop(poll);
>> + }
>> +
>> + return ret;
>> }
>>
>> static bool vhost_work_seq_done(struct vhost_dev *dev, struct vhost_work *work,
>> @@ -792,7 +807,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp)
>> fput(filep);
>>
>> if (pollstart && vq->handle_kick)
>> - vhost_poll_start(&vq->poll, vq->kick);
>> + r = vhost_poll_start(&vq->poll, vq->kick);
>>
>> mutex_unlock(&vq->mutex);
>>
>> diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
>> index 2639c58..17261e2 100644
>> --- a/drivers/vhost/vhost.h
>> +++ b/drivers/vhost/vhost.h
>> @@ -42,7 +42,7 @@ void vhost_work_queue(struct vhost_dev *dev, struct vhost_work *work);
>>
>> void vhost_poll_init(struct vhost_poll *poll, vhost_work_fn_t fn,
>> unsigned long mask, struct vhost_dev *dev);
>> -void vhost_poll_start(struct vhost_poll *poll, struct file *file);
>> +int vhost_poll_start(struct vhost_poll *poll, struct file *file);
>> void vhost_poll_stop(struct vhost_poll *poll);
>> void vhost_poll_flush(struct vhost_poll *poll);
>> void vhost_poll_queue(struct vhost_poll *poll);
>> --
>> 1.7.1
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH] drivers/net/wireless/iwlegacy: use strlcpy instead of strncpy
From: Chen Gang @ 2013-01-07 4:42 UTC (permalink / raw)
To: sgruszka, linville; +Cc: linux-wireless, netdev
The fields must be null-terminated, or simple_strtoul will cause issue.
Signed-off-by: Chen Gang <gang.chen@asianux.com>
---
drivers/net/wireless/iwlegacy/3945-mac.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c
index d604b40..3726cd6 100644
--- a/drivers/net/wireless/iwlegacy/3945-mac.c
+++ b/drivers/net/wireless/iwlegacy/3945-mac.c
@@ -3273,7 +3273,7 @@ il3945_store_measurement(struct device *d, struct device_attribute *attr,
if (count) {
char *p = buffer;
- strncpy(buffer, buf, min(sizeof(buffer), count));
+ strlcpy(buffer, buf, sizeof(buffer));
channel = simple_strtoul(p, NULL, 0);
if (channel)
params.channel = channel;
--
1.7.10.4
^ permalink raw reply related
* [RFC PATCH] vsprintf: Add %p*D extension for 80211 SSIDs
From: Joe Perches @ 2013-01-07 4:49 UTC (permalink / raw)
To: John W. Linville; +Cc: Chen Gang, stas.yakovlev, linux-wireless, netdev
In-Reply-To: <1357528746.4940.31.camel@joe-AO722>
On Sun, 2013-01-06 at 19:19 -0800, Joe Perches wrote:
> Maybe these days this should be another vsprintf %p extension
> like %pM when the DECLARE_MAC_BUF/print_mac uses were converted.
>
> (or maybe extend %ph for ssids with %*phs, length, array)
Maybe like this:
lib/vsprintf.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index fab33a9..98916a0 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -26,6 +26,7 @@
#include <linux/math64.h>
#include <linux/uaccess.h>
#include <linux/ioport.h>
+#include <linux/ieee80211.h>
#include <net/addrconf.h>
#include <asm/page.h> /* for PAGE_SIZE */
@@ -660,10 +661,59 @@ char *resource_string(char *buf, char *end, struct resource *res,
}
static noinline_for_stack
+char *ssid_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
+ const char *fmt)
+{
+ int i, len = 1; /* if we pass %*p, field width remains
+ negative value, fallback to the default */
+
+ if (spec.field_width == 0)
+ /* nothing to print */
+ return buf;
+
+ if (ZERO_OR_NULL_PTR(addr))
+ /* NULL pointer */
+ return string(buf, end, NULL, spec);
+
+ if (spec.field_width > 0)
+ len = min_t(int, spec.field_width, IEEE80211_MAX_SSID_LEN);
+
+ for (i = 0; i < len && buf < end; i++) {
+ if (isprint(addr[i])) {
+ *buf++ = addr[i];
+ continue;
+ }
+ *buf++ = '\\';
+ if (buf >= end)
+ continue;
+ if (addr[i] == '\0')
+ *buf++ = '0';
+ else if (addr[i] == '\n')
+ *buf++ = 'n';
+ else if (addr[i] == '\r')
+ *buf++ = 'r';
+ else if (addr[i] == '\t')
+ *buf++ = 't';
+ else if (addr[i] == '\\')
+ *buf++ = '\\';
+ else {
+ if (buf < end)
+ *buf++ = ((addr[i] >> 6) & 7) + '0';
+ if (buf < end)
+ *buf++ = ((addr[i] >> 3) & 7) + '0';
+ if (buf < end)
+ *buf++ = ((addr[i] >> 0) & 7) + '0';
+ }
+ }
+
+ return buf;
+}
+
+static noinline_for_stack
char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
const char *fmt)
{
- int i, len = 1; /* if we pass '%ph[CDN]', field witdh remains
+ int i, len = 1; /* if we pass '%ph[CDN]', field width remains
negative value, fallback to the default */
char separator;
@@ -695,7 +745,6 @@ char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
for (i = 0; i < len && buf < end - 1; i++) {
buf = hex_byte_pack(buf, addr[i]);
-
if (buf < end && separator && i != len - 1)
*buf++ = separator;
}
@@ -1016,6 +1065,8 @@ int kptr_restrict __read_mostly;
* [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]
* little endian output byte order is:
* [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15]
+ * - 'D' For a 80211 SSID, it prints the SSID escaping any non-printable
+ characters with a leading \ and octal or [0nrt\]
* - 'V' For a struct va_format which contains a format string * and va_list *,
* call vsnprintf(->format, *->va_list).
* Implements a "recursive vsnprintf".
@@ -1088,6 +1139,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
break;
case 'U':
return uuid_string(buf, end, ptr, spec, fmt);
+ case 'D':
+ return ssid_string(buf, end, ptr, spec, fmt);
case 'V':
{
va_list va;
^ permalink raw reply related
* Re: Bug#697357: bridging broken over bond interfaces
From: Ben Hutchings @ 2013-01-07 4:58 UTC (permalink / raw)
To: netdev
Cc: Bastian Blank, 697357, Peter Palfrader, Stephen Hemminger,
Jay Vosburgh, Andy Gospodarek
In-Reply-To: <20130104124012.GH14827@anguilla.noreply.org>
[-- Attachment #1: Type: text/plain, Size: 2384 bytes --]
Forwarding this to netdev since the bug is still present in Linux 3.7.1.
For those joining us, this thread is archive at
<http://bugs.debian.org/697357>.
On Fri, 2013-01-04 at 13:40 +0100, Peter Palfrader wrote:
> On Fri, 04 Jan 2013, Bastian Blank wrote:
>
> > On Fri, Jan 04, 2013 at 12:17:12PM +0100, Peter Palfrader wrote:
> > > I tried to set up a new KVM host in the usual way:
> > > - have a bond0 interface over all physcial eth* interfaces
> > > - create a br0 over that bond0 and any vnet* interfaces for the
> > > guests.
>
> Also, arp works through the bridge, forgot to mention that.
>
> > > * Manually switching the eth* to promiscious mode makes stuff work.
> >
> > Okay, so a workaround is available.
> >
> > When did it last work? Does it work with the kernel from experimental?
>
> It works nicely on stable, e.g. pasquini.debian.org:
>
> | weasel@pasquini:~$ sudo brctl show
> | bridge name bridge id STP enabled interfaces
> | br0 8000.e83935a9ec10 no bond0
> | tap0
> | tap1
> | tap2
> | br1 8000.e83935a9ec10 no bond0.221
> | br2 8000.da1343affe92 no bond0.3301
> | tap3
>
> And there the bond interface is promisc automatically:
> weasel@pasquini:~$ ip a | grep -i bond
> | 2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
> | 3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
> | 4: bond0: <BROADCAST,MULTICAST,PROMISC,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
> | 7: bond0.221@bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
> | 9: bond0.3301@bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
>
> Likewise it works as expected when one does br directly on eth0, without any
> bonding.
>
> It's also broken with linux-image-3.7-trunk-amd64_3.7.1-1~experimental.1_amd64.deb.
--
Ben Hutchings
If you seem to know what you are doing, you'll be given more to do.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]
^ permalink raw reply
* Re: [PATCH] tcp: fix MSG_SENDPAGE_NOTLAST logic
From: David Miller @ 2013-01-07 4:59 UTC (permalink / raw)
To: eric.dumazet; +Cc: w, netdev, linux-kernel
In-Reply-To: <1357532509.6919.1715.camel@edumazet-glaptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sun, 06 Jan 2013 20:21:49 -0800
> From: Eric Dumazet <edumazet@google.com>
>
> commit 35f9c09fe9c72e (tcp: tcp_sendpages() should call tcp_push() once)
> added an internal flag : MSG_SENDPAGE_NOTLAST meant to be set on all
> frags but the last one for a splice() call.
>
> The condition used to set the flag in pipe_to_sendpage() relied on
> splice() user passing the exact number of bytes present in the pipe,
> or a smaller one.
>
> But some programs pass an arbitrary high value, and the test fails.
>
> The effect of this bug is a lack of tcp_push() at the end of a
> splice(pipe -> socket) call, and possibly very slow or erratic TCP
> sessions.
>
> We should both test sd->total_len and fact that another fragment
> is in the pipe (pipe->nrbufs > 1)
>
> Many thanks to Willy for providing very clear bug report, bisection
> and test programs.
>
> Reported-by: Willy Tarreau <w@1wt.eu>
> Bisected-by: Willy Tarreau <w@1wt.eu>
> Tested-by: Willy Tarreau <w@1wt.eu>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied and queued up for -stable, thanks everyone.
^ permalink raw reply
* Re: [PATCH 1/4 net-next] tg3: Add support for new 5762 ASIC
From: David Miller @ 2013-01-07 5:02 UTC (permalink / raw)
To: mchan; +Cc: netdev, nsujir
In-Reply-To: <1357512670-17636-1-git-send-email-mchan@broadcom.com>
From: "Michael Chan" <mchan@broadcom.com>
Date: Sun, 6 Jan 2013 14:51:07 -0800
> Add basic support for 5762 which is a 57765_PLUS class device.
>
> Signed-off-by: Michael Chan <mchan@broadcom.com>
Applied.
^ permalink raw reply
* Re: [PATCH 2/4 net-next] tg3: Add NVRAM support for 5762
From: David Miller @ 2013-01-07 5:02 UTC (permalink / raw)
To: mchan; +Cc: netdev, nsujir
In-Reply-To: <1357512670-17636-2-git-send-email-mchan@broadcom.com>
From: "Michael Chan" <mchan@broadcom.com>
Date: Sun, 6 Jan 2013 14:51:08 -0800
> Detect NVRAM types for 5762 and read OTP firmware version.
>
> Signed-off-by: Michael Chan <mchan@broadcom.com>
Applied.
^ permalink raw reply
* Re: [PATCH 3/4 net-next] tg3: Improve PCI function number detection.
From: David Miller @ 2013-01-07 5:02 UTC (permalink / raw)
To: mchan; +Cc: netdev, nsujir
In-Reply-To: <1357512670-17636-3-git-send-email-mchan@broadcom.com>
From: "Michael Chan" <mchan@broadcom.com>
Date: Sun, 6 Jan 2013 14:51:09 -0800
> Simplify the code to detect PCI function number on 5717, 5719, and 5720.
> If shared memory does not have proper signature, read the function number
> from register directly.
>
> Signed-off-by: Michael Chan <mchan@broadcom.com>
Applied.
^ permalink raw reply
* Re: [PATCH 4/4 net-next] tg3: Remove IS_ENABLED(CONFIG_HWMON) check
From: David Miller @ 2013-01-07 5:03 UTC (permalink / raw)
To: mchan; +Cc: netdev, nsujir
In-Reply-To: <1357512670-17636-4-git-send-email-mchan@broadcom.com>
From: "Michael Chan" <mchan@broadcom.com>
Date: Sun, 6 Jan 2013 14:51:10 -0800
> From: Nithin Nayak Sujir <nsujir@broadcom.com>
>
> Commit de0a41484c47d783dd4d442914815076aa2caac2 added Kconfig logic to
> select HWMON and removed all the IS_ENABLED(CONFIG_HWMON) checks in the
> tg3.c file. It missed this one check in the header.
>
> Update version to 3.129 and update copyright year.
>
> Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
> Signed-off-by: Michael Chan <mchan@broadcom.com>
Applied.
^ permalink raw reply
* Re: [patch net] ethoc: fix mac address set
From: David Miller @ 2013-01-07 5:04 UTC (permalink / raw)
To: jiri; +Cc: netdev
In-Reply-To: <1357478745-19923-1-git-send-email-jiri@resnulli.us>
From: Jiri Pirko <jiri@resnulli.us>
Date: Sun, 6 Jan 2013 14:25:45 +0100
> Function ethoc_set_mac_address() was incorrectly using passed pointer as
> pointer to address, that is not correct.
> Struct sockaddr have to be be used here.
>
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
This only applies to the net-next tree, so that's where I've
added it.
^ permalink raw reply
* Re: [patch net-next] ethtool: set addr_assign_type to NET_ADDR_SET when addr is passed on create
From: David Miller @ 2013-01-07 5:05 UTC (permalink / raw)
To: jiri; +Cc: netdev, bhutchings, shemminger, sassmann
In-Reply-To: <1357512117-5581-1-git-send-email-jiri@resnulli.us>
From: Jiri Pirko <jiri@resnulli.us>
Date: Sun, 6 Jan 2013 23:41:57 +0100
> In case user passed address via netlink during create, NET_ADDR_PERM was set.
> That is not correct so fix this by setting NET_ADDR_SET.
>
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Applied.
^ permalink raw reply
* Re: [patch net-next] net: use ETHTOOL_FWVERS_LEN instead of ETHTOOL_BUSINFO_LEN for fw_ver strings
From: David Miller @ 2013-01-07 5:06 UTC (permalink / raw)
To: jiri; +Cc: netdev, linville, linux-wireless
In-Reply-To: <1357474371-30887-1-git-send-email-jiri@resnulli.us>
From: Jiri Pirko <jiri@resnulli.us>
Date: Sun, 6 Jan 2013 13:12:51 +0100
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Applied.
^ permalink raw reply
* Re: [patch net-next V2] ethtool: fix drvinfo strings set in drivers
From: David Miller @ 2013-01-07 5:06 UTC (permalink / raw)
To: jiri
Cc: netdev, edumazet, bhutchings, shemminger, fbl, sathya.perla,
subbu.seetharaman, ajit.khaparde, roland, sean.hefty,
hal.rosenstock, ursula.braun, blaschka, linux390
In-Reply-To: <1357469066-10620-1-git-send-email-jiri@resnulli.us>
From: Jiri Pirko <jiri@resnulli.us>
Date: Sun, 6 Jan 2013 11:44:26 +0100
> Use strlcpy where possible to ensure the string is \0 terminated.
> Use always sizeof(string) instead of 32, ETHTOOL_BUSINFO_LEN
> and custom defines.
> Use snprintf instead of sprint.
> Remove unnecessary inits of ->fw_version
> Remove unnecessary inits of drvinfo struct.
>
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] net: splice: avoid high order page splitting
From: David Miller @ 2013-01-07 5:07 UTC (permalink / raw)
To: eric.dumazet; +Cc: w, netdev
In-Reply-To: <1357457478.1678.5928.camel@edumazet-glaptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sat, 05 Jan 2013 23:31:18 -0800
> From: Eric Dumazet <edumazet@google.com>
>
> splice() can handle pages of any order, but network code tries hard to
> split them in PAGE_SIZE units. Not quite successfully anyway, as
> __splice_segment() assumed poff < PAGE_SIZE. This is true for
> the skb->data part, not necessarily for the fragments.
>
> This patch removes this logic to give the pages as they are in the skb.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] ndisc: Use struct rd_msg for redirect message.
From: David Miller @ 2013-01-07 5:08 UTC (permalink / raw)
To: yoshfuji; +Cc: netdev
In-Reply-To: <50E8E2CB.9080809@linux-ipv6.org>
From: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Date: Sun, 06 Jan 2013 11:34:51 +0900
> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Applied, thanks.
^ permalink raw reply
* Re: [PATCH] tcp: make sysctl_tcp_ecn namespace aware
From: David Miller @ 2013-01-07 5:10 UTC (permalink / raw)
To: eric.dumazet; +Cc: hannes, shemminger, netdev
In-Reply-To: <1357438762.1678.5215.camel@edumazet-glaptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sat, 05 Jan 2013 18:19:22 -0800
> On Sun, 2013-01-06 at 03:10 +0100, Hannes Frederic Sowa wrote:
>> As per suggestion from Eric Dumazet this patch makes tcp_ecn sysctl
>> namespace aware. The reason behind this patch is to ease the testing
>> of ecn problems on the internet and allows applications to tune their
>> own use of ecn.
>>
>> Cc: Eric Dumazet <eric.dumazet@gmail.com>
>> Cc: David Miller <davem@davemloft.net>
>> Cc: Stephen Hemminger <shemminger@vyatta.com>
>> Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
>> ---
>
> Seems good to me, thanks !
>
> Acked-by: Eric Dumazet <edumazet@google.com>
Applied, thanks.
^ permalink raw reply
* Re: [PATCH] ipv4: fix NULL checking in devinet_ioctl()
From: David Miller @ 2013-01-07 5:11 UTC (permalink / raw)
To: eric.dumazet; +Cc: xi.wang, netdev
In-Reply-To: <1357427402.1678.4738.camel@edumazet-glaptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sat, 05 Jan 2013 15:10:02 -0800
> On Sat, 2013-01-05 at 16:19 -0500, Xi Wang wrote:
>> The NULL pointer check `!ifa' should come before its first use.
>>
>> Signed-off-by: Xi Wang <xi.wang@gmail.com>
>> ---
>> net/ipv4/devinet.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
>> index cc06a47..a8e4f26 100644
>> --- a/net/ipv4/devinet.c
>> +++ b/net/ipv4/devinet.c
>> @@ -823,9 +823,9 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
>> if (!ifa) {
>> ret = -ENOBUFS;
>> ifa = inet_alloc_ifa();
>> - INIT_HLIST_NODE(&ifa->hash);
>> if (!ifa)
>> break;
>> + INIT_HLIST_NODE(&ifa->hash);
>> if (colon)
>> memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
>> else
>
> Acked-by: Eric Dumazet <edumazet@google.com>
>
> Bug origin : commit fd23c3b31107e2fc483301ee923d8a1db14e53f4
> (ipv4: Add hash table of interface addresses)
>
> in linux-2.6.39
Applied and queued up for -stable, thanks.
^ permalink raw reply
* Re: [PATCH net-next] team: use strlcpy with ethtool_drvinfo fields
From: David Miller @ 2013-01-07 5:12 UTC (permalink / raw)
To: bhutchings; +Cc: fbl, netdev, jpirko
In-Reply-To: <1357395077.4324.5.camel@deadeye.wl.decadent.org.uk>
From: Ben Hutchings <bhutchings@solarflare.com>
Date: Sat, 5 Jan 2013 14:11:17 +0000
> On Sat, 2013-01-05 at 10:53 -0200, Flavio Leitner wrote:
>> The fields must be null-terminated.
>>
>> Signed-off-by: Flavio Leitner <fbl@redhat.com>
>
> Acked-by: Ben Hutchings <bhutchings@solarflare.com>
Applied.
^ permalink raw reply
* Re: [PATCH] drivers/net: remove orphaned references to micro channel
From: David Miller @ 2013-01-07 5:13 UTC (permalink / raw)
To: paul.gortmaker; +Cc: netdev
In-Reply-To: <1357354637-1784-1-git-send-email-paul.gortmaker@windriver.com>
From: Paul Gortmaker <paul.gortmaker@windriver.com>
Date: Fri, 4 Jan 2013 21:57:17 -0500
> We threw away the microchannel support, but the removal wasn't
> completely trivial since there was namespace overlap with the
> machine check support, and hence some orphaned dependencies
> survived the deletion. This attempts to sweep those up and
> send them to the bit-bucket.
>
> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Applied, thanks.
^ permalink raw reply
* Re: [patch net-next] net: use ETHTOOL_FWVERS_LEN instead of ETHTOOL_BUSINFO_LEN for fw_ver strings
From: Luciano Coelho @ 2013-01-07 5:58 UTC (permalink / raw)
To: Jiri Pirko
Cc: netdev-u79uwXL29TY76Z2rM5mHXA, davem-fT/PcQaiUtIeIZ0/mPfg9Q,
linville-2XuSBdqkA4R54TAoqtyWWQ,
linux-wireless-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1357474371-30887-1-git-send-email-jiri-rHqAuBHg3fBzbRFIqnYvSA@public.gmane.org>
Hi Jiri,
On Sun, 2013-01-06 at 13:12 +0100, Jiri Pirko wrote:
> Signed-off-by: Jiri Pirko <jiri-rHqAuBHg3fBzbRFIqnYvSA@public.gmane.org>
> ---
Please add a commit message explaining why this change is needed.
--
Luca.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [patch net-next] net: use ETHTOOL_FWVERS_LEN instead of ETHTOOL_BUSINFO_LEN for fw_ver strings
From: David Miller @ 2013-01-07 6:05 UTC (permalink / raw)
To: coelho-l0cyMroinI0
Cc: jiri-rHqAuBHg3fBzbRFIqnYvSA, netdev-u79uwXL29TY76Z2rM5mHXA,
linville-2XuSBdqkA4R54TAoqtyWWQ,
linux-wireless-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1357538335.22318.19.camel-eHkr6bJ9aPyyenC2BZ5AVw@public.gmane.org>
From: Luciano Coelho <coelho-l0cyMroinI0@public.gmane.org>
Date: Mon, 7 Jan 2013 07:58:55 +0200
> Hi Jiri,
>
> On Sun, 2013-01-06 at 13:12 +0100, Jiri Pirko wrote:
>> Signed-off-by: Jiri Pirko <jiri-rHqAuBHg3fBzbRFIqnYvSA@public.gmane.org>
>> ---
>
> Please add a commit message explaining why this change is needed.
It's obvious, not such commit message is necessary.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [RFC PATCH] vsprintf: Add %p*D extension for 80211 SSIDs
From: Chen Gang @ 2013-01-07 6:07 UTC (permalink / raw)
To: Joe Perches; +Cc: John W. Linville, stas.yakovlev, linux-wireless, netdev
In-Reply-To: <1357534195.21481.31.camel@joe-AO722>
于 2013年01月07日 12:49, Joe Perches 写道:
> On Sun, 2013-01-06 at 19:19 -0800, Joe Perches wrote:
>> Maybe these days this should be another vsprintf %p extension
>> like %pM when the DECLARE_MAC_BUF/print_mac uses were converted.
>>
>> (or maybe extend %ph for ssids with %*phs, length, array)
>
excuse me:
I do not quite know how to reply the [RFC PATCH].
it would be better if you can tell me how to do for [RFC PATCH], thanks.
:-)
at least for me:
although it is good idea to add common, widely used features in public tools function.
after searching the relative source code:
it seems print ssid is not quite widely used (although it is a common feature).
it is used by drivers/net/wireless/libertas
it is used by drivers/net/wireless/ipw2x00
no additional using in current kernel source code wide.
if another modules want to print ssid,
they can still call print_ssid now (EXPORT_SYMBOL in net/wireless).
so at least now, it is not necessary to add this feature to public tools function.
Regards
gchen.
> Maybe like this:
>
> lib/vsprintf.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 55 insertions(+), 2 deletions(-)
>
> diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> index fab33a9..98916a0 100644
> --- a/lib/vsprintf.c
> +++ b/lib/vsprintf.c
> @@ -26,6 +26,7 @@
> #include <linux/math64.h>
> #include <linux/uaccess.h>
> #include <linux/ioport.h>
> +#include <linux/ieee80211.h>
> #include <net/addrconf.h>
>
> #include <asm/page.h> /* for PAGE_SIZE */
> @@ -660,10 +661,59 @@ char *resource_string(char *buf, char *end, struct resource *res,
> }
>
> static noinline_for_stack
> +char *ssid_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
> + const char *fmt)
> +{
> + int i, len = 1; /* if we pass %*p, field width remains
> + negative value, fallback to the default */
> +
> + if (spec.field_width == 0)
> + /* nothing to print */
> + return buf;
> +
> + if (ZERO_OR_NULL_PTR(addr))
> + /* NULL pointer */
> + return string(buf, end, NULL, spec);
> +
> + if (spec.field_width > 0)
> + len = min_t(int, spec.field_width, IEEE80211_MAX_SSID_LEN);
> +
> + for (i = 0; i < len && buf < end; i++) {
> + if (isprint(addr[i])) {
> + *buf++ = addr[i];
> + continue;
> + }
> + *buf++ = '\\';
> + if (buf >= end)
> + continue;
> + if (addr[i] == '\0')
> + *buf++ = '0';
> + else if (addr[i] == '\n')
> + *buf++ = 'n';
> + else if (addr[i] == '\r')
> + *buf++ = 'r';
> + else if (addr[i] == '\t')
> + *buf++ = 't';
> + else if (addr[i] == '\\')
> + *buf++ = '\\';
> + else {
> + if (buf < end)
> + *buf++ = ((addr[i] >> 6) & 7) + '0';
> + if (buf < end)
> + *buf++ = ((addr[i] >> 3) & 7) + '0';
> + if (buf < end)
> + *buf++ = ((addr[i] >> 0) & 7) + '0';
> + }
> + }
> +
> + return buf;
> +}
> +
> +static noinline_for_stack
> char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
> const char *fmt)
> {
> - int i, len = 1; /* if we pass '%ph[CDN]', field witdh remains
> + int i, len = 1; /* if we pass '%ph[CDN]', field width remains
> negative value, fallback to the default */
> char separator;
>
> @@ -695,7 +745,6 @@ char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
>
> for (i = 0; i < len && buf < end - 1; i++) {
> buf = hex_byte_pack(buf, addr[i]);
> -
> if (buf < end && separator && i != len - 1)
> *buf++ = separator;
> }
> @@ -1016,6 +1065,8 @@ int kptr_restrict __read_mostly;
> * [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]
> * little endian output byte order is:
> * [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15]
> + * - 'D' For a 80211 SSID, it prints the SSID escaping any non-printable
> + characters with a leading \ and octal or [0nrt\]
> * - 'V' For a struct va_format which contains a format string * and va_list *,
> * call vsnprintf(->format, *->va_list).
> * Implements a "recursive vsnprintf".
> @@ -1088,6 +1139,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
> break;
> case 'U':
> return uuid_string(buf, end, ptr, spec, fmt);
> + case 'D':
> + return ssid_string(buf, end, ptr, spec, fmt);
> case 'V':
> {
> va_list va;
>
>
>
>
--
Chen Gang
Asianux Corporation
^ permalink raw reply
* Re: [patch net-next] net: use ETHTOOL_FWVERS_LEN instead of ETHTOOL_BUSINFO_LEN for fw_ver strings
From: Luciano Coelho @ 2013-01-07 6:09 UTC (permalink / raw)
To: David Miller; +Cc: jiri, netdev, linville, linux-wireless
In-Reply-To: <20130106.220523.1783238632929635985.davem@davemloft.net>
On Sun, 2013-01-06 at 22:05 -0800, David Miller wrote:
> From: Luciano Coelho <coelho@ti.com>
> Date: Mon, 7 Jan 2013 07:58:55 +0200
>
> > Hi Jiri,
> >
> > On Sun, 2013-01-06 at 13:12 +0100, Jiri Pirko wrote:
> >> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
> >> ---
> >
> > Please add a commit message explaining why this change is needed.
>
> It's obvious, not such commit message is necessary.
Hmmm, okay. I just always prefer to see a commit message. If not for
more clarity, at least so that the commit looks more "balanced" in the
log.
Anyway, for the wlcore part:
Acked-by: Luciano Coelho <coelho@ti.com>
^ permalink raw reply
* Re: [RFC PATCH] vsprintf: Add %p*D extension for 80211 SSIDs
From: Joe Perches @ 2013-01-07 6:37 UTC (permalink / raw)
To: Chen Gang
Cc: John W. Linville, stas.yakovlev-Re5JQEeQqe8AvxtiuMwx3w,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <50EA6612.6010506-bOixZGp5f+dBDgjK7y7TUQ@public.gmane.org>
On Mon, 2013-01-07 at 14:07 +0800, Chen Gang wrote:
> 于 2013年01月07日 12:49, Joe Perches 写道:
> > On Sun, 2013-01-06 at 19:19 -0800, Joe Perches wrote:
> >> Maybe these days this should be another vsprintf %p extension
> >> like %pM when the DECLARE_MAC_BUF/print_mac uses were converted.
> >>
> >> (or maybe extend %ph for ssids with %*phs, length, array)
> >
> excuse me:
> I do not quite know how to reply the [RFC PATCH].
> it would be better if you can tell me how to do for [RFC PATCH], thanks.
You did fine except you unnecessarily quoted the entire original email.
Remember to trim your replies please. _lots_ of people read these
mailing lists and unnecessary quoting wastes all of their times.
> at least for me:
> although it is good idea to add common, widely used features in public tools function.
It's akin to most of the minor uuid/bluetooth mac, etc codes
in vsprintf I've added.
cheers, Joe
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox