Den tis 15 jan. 2019 kl 10:50 skrev Kazimierczak, Krzysztof <krzysztof.kazimierc...@intel.com>: > > From 6cbcfa3d0909bc27af0be6122dc6bfbfa4c9269e Mon Sep 17 00:00:00 2001 > From: Krzysztof Kazimierczak <krzysztof.kazimierc...@intel.com> > Date: Thu, 10 Jan 2019 20:29:02 +0100 > Subject: [PATCH bpf] xsk: Check if a queue exists during umem setup > > In the xdp_umem_assign_dev() path, the xsk code does not > check if a queue for which umem is to be created exists. > It leads to a situation where umem is not assigned to any > Tx/Rx queue of a netdevice, without notifying the stack > about an error. This affects both XDP_SKB and XDP_DRV > modes - in case of XDP_DRV_ZC, queue index is checked by > the driver. > > This patch fixes xsk code, so that in both XDP_SKB and > XDP_DRV mode of AF_XDP, an error is returned when requested > queue index exceedes an existing maximum. > > Fixes: c9b47cc1fabca ("xsk: fix bug when trying to use both copy and > zero-copy on one queue id") > Reported-by: Jakub Spizewski <jakub.spizew...@intel.com> > Signed-off-by: Krzysztof Kazimierczak <krzysztof.kazimierc...@intel.com>
Thank you! (The other patch was swallowed, and didn't end up on list.) Acked-by: Björn Töpel <bjorn.to...@intel.com> > --- v2->v4: dsflkjdslkj > net/xdp/xdp_umem.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c > index a264cf2accd0..d4de871e7d4d 100644 > --- a/net/xdp/xdp_umem.c > +++ b/net/xdp/xdp_umem.c > @@ -41,13 +41,20 @@ void xdp_del_sk_umem(struct xdp_umem *umem, struct > xdp_sock *xs) > * not know if the device has more tx queues than rx, or the opposite. > * This might also change during run time. > */ > -static void xdp_reg_umem_at_qid(struct net_device *dev, struct xdp_umem > *umem, > - u16 queue_id) > +static int xdp_reg_umem_at_qid(struct net_device *dev, struct xdp_umem *umem, > + u16 queue_id) > { > + if (queue_id >= max_t(unsigned int, > + dev->real_num_rx_queues, > + dev->real_num_tx_queues)) > + return -EINVAL; > + > if (queue_id < dev->real_num_rx_queues) > dev->_rx[queue_id].umem = umem; > if (queue_id < dev->real_num_tx_queues) > dev->_tx[queue_id].umem = umem; > + > + return 0; > } > > struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev, > @@ -88,7 +95,10 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct > net_device *dev, > goto out_rtnl_unlock; > } > > - xdp_reg_umem_at_qid(dev, umem, queue_id); > + err = xdp_reg_umem_at_qid(dev, umem, queue_id); > + if (err) > + goto out_rtnl_unlock; > + > umem->dev = dev; > umem->queue_id = queue_id; > if (force_copy) > -- > 2.17.1 > > -------------------------------------------------------------------- > > Intel Technology Poland sp. z o.o. > ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII > Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP > 957-07-52-316 | Kapital zakladowy 200.000 PLN. > > Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i > moze zawierac informacje poufne. W razie przypadkowego otrzymania tej > wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; > jakiekolwiek > przegladanie lub rozpowszechnianie jest zabronione. > This e-mail and any attachments may contain confidential material for the > sole use of the intended recipient(s). If you are not the intended recipient, > please contact the sender and delete all copies; any review or distribution by > others is strictly prohibited. >